ref: 44d1a7bffbbb30cb852155a60be0f79b30e44657
parent: 81a1bccd38c0e346c5afdaf22861debf28c9e195
author: cinap_lenrek <cinap_lenrek@localhost>
date: Fri Jul 1 04:31:29 EDT 2011
hgfs: make qid generation machine independent
--- a/sys/src/cmd/hgfs/fns.h
+++ b/sys/src/cmd/hgfs/fns.h
@@ -1,6 +1,7 @@
/* hash */
int Hfmt(Fmt *f);
-int strhash(char *s, uchar *h);
+int hex2hash(char *s, uchar *h);
+uvlong hash2qid(uchar *h);
int fhash(int fd, uchar p1[], uchar p2[], uchar h[]);
/* patch */
@@ -24,7 +25,7 @@
Revinfo *loadrevinfo(Revlog *changelog, int rev);
/* tree */
-char *nodepath(char *s, char *e, Revnode *nd);
+char *nodepath(char *s, char *e, Revnode *nd, int mange);
Revnode *mknode(char *name, uchar *hash, char mode);
Revtree *loadfilestree(Revlog *changelog, Revlog *manifest, Revinfo *ri);
Revtree *loadchangestree(Revlog *changelog, Revlog *manifest, Revinfo *ri);
--- a/sys/src/cmd/hgfs/fs.c
+++ b/sys/src/cmd/hgfs/fs.c
@@ -50,7 +50,8 @@
char buf[MAXPATH];
Revlog *rl;
- nodepath(seprint(buf, buf+sizeof(buf), "%s/store/data", dothg), buf+sizeof(buf), nd);
+ nodepath(seprint(buf, buf+sizeof(buf), "%s/store/data", dothg),
+ buf+sizeof(buf), nd, 1);
for(rl = revlogs; rl; rl = rl->next)
if(strcmp(buf, rl->path) == 0)
break;
@@ -189,7 +190,7 @@
q->type = 0;
}
ri = aux;
- q->path = *((uvlong*)ri->chash) + (level - Qrev);
+ q->path = hash2qid(ri->chash) + (level - Qrev);
q->vers = 0;
break;
case Qtree:
@@ -368,7 +369,7 @@
rev = -1;
if(s = strchr(name, '.'))
name = s+1;
- if((n = strhash(name, hash)) > 0){+ if((n = hex2hash(name, hash)) > 0){ for(i=0; i<rl->nmap; i++){ if(memcmp(rl->map[i].hash, hash, n) == 0){if(rev < 0)
--- a/sys/src/cmd/hgfs/hash.c
+++ b/sys/src/cmd/hgfs/hash.c
@@ -42,7 +42,7 @@
}
int
-strhash(char *s, uchar *h)
+hex2hash(char *s, uchar *h)
{uchar *b;
int n;
@@ -66,4 +66,16 @@
s++;
}
return h - b;
+}
+
+uvlong
+hash2qid(uchar *h)
+{+ uvlong v;
+ int i;
+
+ v = 0;
+ for(i=0; i<8; i++)
+ v |= (uvlong)h[i]<<(56-8*i);
+ return v;
}
--- a/sys/src/cmd/hgfs/info.c
+++ b/sys/src/cmd/hgfs/info.c
@@ -36,7 +36,7 @@
switch(line++){case 0:
- strhash(buf, ri->mhash);
+ hex2hash(buf, ri->mhash);
break;
case 1:
ri->who = strdup(buf);
--- a/sys/src/cmd/hgfs/tree.c
+++ b/sys/src/cmd/hgfs/tree.c
@@ -5,7 +5,7 @@
#include "fns.h"
char*
-nodepath(char *s, char *e, Revnode *nd)
+nodepath(char *s, char *e, Revnode *nd, int mangle)
{ static char *frogs[] = {"con", "prn", "aux", "nul",
@@ -18,9 +18,11 @@
if(nd == nil || nd->name == nil)
return s;
- s = seprint(nodepath(s, e, nd->up), e, "/");
-
+ s = seprint(nodepath(s, e, nd->up, mangle), e, "/");
p = nd->name;
+ if(!mangle)
+ return seprint(s, e, "%s", p);
+
for(i=0; i<nelem(frogs); i++){l = strlen(frogs[i]);
if((strncmp(frogs[i], p, l) == 0) && (p[l] == 0 || p[l] == '.'))
@@ -54,7 +56,7 @@
memset(d, 0, sizeof(*d));
s = (char*)&d[1];
if(hash){- d->path = *((uvlong*)hash);
+ d->path = hash2qid(hash);
memmove(d->hash = (uchar*)s, hash, HASHSZ);
s += HASHSZ;
}else
@@ -88,10 +90,9 @@
c->next = d->down;
d->down = c;
}
- if(c->hash){+ if(!slash){p = c;
- p->path = *((uvlong*)c->hash);
- while(d->up){+ while(d){d->path += p->path;
p = d;
d = d->up;
@@ -142,7 +143,7 @@
x = buf;
x += strlen(x) + 1;
- strhash(x, hash);
+ hex2hash(x, hash);
x += HASHSZ*2;
if(ht == nil)
--
⑨