git: 9front

Download patch

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)
--