From 400e1b3643881c9c26c1824c370393f1d41ae7c5 Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Fri, 1 Jul 2011 08:31:29 +0200 Subject: [PATCH] hgfs: make qid generation machine independent --- sys/src/cmd/hgfs/fns.h | 5 +++-- sys/src/cmd/hgfs/fs.c | 7 ++++--- sys/src/cmd/hgfs/hash.c | 14 +++++++++++++- sys/src/cmd/hgfs/info.c | 2 +- sys/src/cmd/hgfs/tree.c | 17 +++++++++-------- 5 files changed, 30 insertions(+), 15 deletions(-) diff --git a/sys/src/cmd/hgfs/fns.h b/sys/src/cmd/hgfs/fns.h index 4b3450d0e..56e51f7ed 100644 --- 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 @@ int revlogopentemp(Revlog *r, int rev); 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); diff --git a/sys/src/cmd/hgfs/fs.c b/sys/src/cmd/hgfs/fs.c index c63048127..69455b2e2 100644 --- a/sys/src/cmd/hgfs/fs.c +++ b/sys/src/cmd/hgfs/fs.c @@ -50,7 +50,8 @@ getrevlog(Revnode *nd) 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 @@ fsmkqid(Qid *q, int level, void *aux) 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 @@ findrev(Revlog *rl, char *name) rev = -1; if(s = strchr(name, '.')) name = s+1; - if((n = strhash(name, hash)) > 0){ + if((n = hex2hash(name, hash)) > 0){ for(i=0; inmap; i++){ if(memcmp(rl->map[i].hash, hash, n) == 0){ if(rev < 0) diff --git a/sys/src/cmd/hgfs/hash.c b/sys/src/cmd/hgfs/hash.c index 768e35759..7723e2fb2 100644 --- a/sys/src/cmd/hgfs/hash.c +++ b/sys/src/cmd/hgfs/hash.c @@ -42,7 +42,7 @@ fhash(int fd, uchar p1[], uchar p2[], uchar h[]) } int -strhash(char *s, uchar *h) +hex2hash(char *s, uchar *h) { uchar *b; int n; @@ -67,3 +67,15 @@ strhash(char *s, uchar *h) } 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; +} diff --git a/sys/src/cmd/hgfs/info.c b/sys/src/cmd/hgfs/info.c index de96e751a..2f0d01075 100644 --- a/sys/src/cmd/hgfs/info.c +++ b/sys/src/cmd/hgfs/info.c @@ -36,7 +36,7 @@ loadrevinfo(Revlog *changelog, int rev) switch(line++){ case 0: - strhash(buf, ri->mhash); + hex2hash(buf, ri->mhash); break; case 1: ri->who = strdup(buf); diff --git a/sys/src/cmd/hgfs/tree.c b/sys/src/cmd/hgfs/tree.c index 517d7ad54..bb4fcb40c 100644 --- 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 @@ nodepath(char *s, char *e, Revnode *nd) 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; ipath = *((uvlong*)hash); + d->path = hash2qid(hash); memmove(d->hash = (uchar*)s, hash, HASHSZ); s += HASHSZ; }else @@ -88,10 +90,9 @@ addnode(Revnode *d, char *path, uchar *hash, char mode) 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 @@ loadmanifest(Revnode *root, int fd, Hashstr **ht, int nh) x = buf; x += strlen(x) + 1; - strhash(x, hash); + hex2hash(x, hash); x += HASHSZ*2; if(ht == nil)