Commit Diff


commit - b7eed2e0e14b980bed4ced80a357189a981d28bc
commit + fb941e08c52162fb41a14732be1ab70f20b450e3
blob - 5acee7e5c19f947dbab2084fd43532f6d613a9b3
blob + 1f13e23fa3b05b965bbbbbceca69300572c3afcc
--- src/lib9/convD2M.c
+++ src/lib9/convD2M.c
@@ -3,30 +3,44 @@
 #include	<fcall.h>
 
 uint
-sizeD2M(Dir *d)
+sizeD2Mu(Dir *d, int dotu)
 {
-	char *sv[4];
-	int i, ns;
+	char *sv[5];
+	int i, ns, nstr, fixlen;
 
 	sv[0] = d->name;
 	sv[1] = d->uid;
 	sv[2] = d->gid;
 	sv[3] = d->muid;
-
+	
+	fixlen = STATFIXLEN;
+	nstr = 4;
+	if(dotu){
+		fixlen = STATFIXLENU;
+		sv[4] = d->ext;
+		nstr = 5;
+	}
+	
 	ns = 0;
-	for(i = 0; i < 4; i++)
+	for(i = 0; i < nstr; i++)
 		if(sv[i])
 			ns += strlen(sv[i]);
 
-	return STATFIXLEN + ns;
+	return fixlen + ns;
 }
 
 uint
-convD2M(Dir *d, uchar *buf, uint nbuf)
+sizeD2M(Dir *d)
 {
+	return sizeD2Mu(d, 0);
+}
+
+uint
+convD2Mu(Dir *d, uchar *buf, uint nbuf, int dotu)
+{
 	uchar *p, *ebuf;
-	char *sv[4];
-	int i, ns, nsv[4], ss;
+	char *sv[5];
+	int i, ns, nsv[4], ss, nstr, fixlen;
 
 	if(nbuf < BIT16SZ)
 		return 0;
@@ -39,8 +53,16 @@ convD2M(Dir *d, uchar *buf, uint nbuf)
 	sv[2] = d->gid;
 	sv[3] = d->muid;
 
+	fixlen = STATFIXLEN;
+	nstr = 4;
+	if(dotu){
+		fixlen = STATFIXLENU;
+		sv[4] = d->ext;
+		nstr = 5;
+	}
+	
 	ns = 0;
-	for(i = 0; i < 4; i++){
+	for(i = 0; i < nstr; i++){
 		if(sv[i])
 			nsv[i] = strlen(sv[i]);
 		else
@@ -48,7 +70,7 @@ convD2M(Dir *d, uchar *buf, uint nbuf)
 		ns += nsv[i];
 	}
 
-	ss = STATFIXLEN + ns;
+	ss = fixlen + ns;
 
 	/* set size befor erroring, so user can know how much is needed */
 	/* note that length excludes count field itself */
@@ -77,7 +99,7 @@ convD2M(Dir *d, uchar *buf, uint nbuf)
 	PBIT64(p, d->length);
 	p += BIT64SZ;
 
-	for(i = 0; i < 4; i++){
+	for(i = 0; i < nstr; i++){
 		ns = nsv[i];
 		if(p + ns + BIT16SZ > ebuf)
 			return 0;
@@ -87,9 +109,24 @@ convD2M(Dir *d, uchar *buf, uint nbuf)
 			memmove(p, sv[i], ns);
 		p += ns;
 	}
+	
+	if(dotu){
+		PBIT32(p, d->uidnum);
+		p += BIT32SZ;
+		PBIT32(p, d->gidnum);
+		p += BIT32SZ;
+		PBIT32(p, d->muidnum);
+		p += BIT32SZ;
+	}
 
 	if(ss != p - buf)
 		return 0;
 
 	return p - buf;
 }
+
+uint
+convD2M(Dir *d, uchar *buf, uint nbuf)
+{
+	return convD2Mu(d, buf, nbuf, 0);
+}
blob - 6f4b4bd935bef68910883fe15680609ff24489f0
blob + ee4914946d4c5379e6a63e83e6f9fc704a990541
--- src/lib9/convM2D.c
+++ src/lib9/convM2D.c
@@ -3,10 +3,10 @@
 #include	<fcall.h>
 
 int
-statcheck(uchar *buf, uint nbuf)
+statchecku(uchar *buf, uint nbuf, int dotu)
 {
 	uchar *ebuf;
-	int i;
+	int i, nstr;
 
 	ebuf = buf + nbuf;
 
@@ -15,12 +15,18 @@ statcheck(uchar *buf, uint nbuf)
 
 	buf += STATFIXLEN - 4 * BIT16SZ;
 
-	for(i = 0; i < 4; i++){
+	nstr = 4;
+	if(dotu)
+		nstr = 5;
+	for(i = 0; i < nstr; i++){
 		if(buf + BIT16SZ > ebuf)
 			return -1;
 		buf += BIT16SZ + GBIT16(buf);
 	}
 
+	if(dotu)
+		buf += 3*BIT32SZ;
+
 	if(buf != ebuf)
 		return -1;
 
@@ -30,11 +36,11 @@ statcheck(uchar *buf, uint nbuf)
 static char nullstring[] = "";
 
 uint
-convM2D(uchar *buf, uint nbuf, Dir *d, char *strs)
+convM2Du(uchar *buf, uint nbuf, Dir *d, char *strs, int dotu)
 {
 	uchar *p, *ebuf;
-	char *sv[4];
-	int i, ns;
+	char *sv[5];
+	int i, ns, nstr;
 
 	if(nbuf < STATFIXLEN)
 		return 0; 
@@ -62,7 +68,10 @@ convM2D(uchar *buf, uint nbuf, Dir *d, char *strs)
 	d->length = GBIT64(p);
 	p += BIT64SZ;
 
-	for(i = 0; i < 4; i++){
+	nstr = 4;
+	if(dotu)
+		nstr = 5;
+	for(i = 0; i < nstr; i++){
 		if(p + BIT16SZ > ebuf)
 			return 0;
 		ns = GBIT16(p);
@@ -78,17 +87,38 @@ convM2D(uchar *buf, uint nbuf, Dir *d, char *strs)
 		p += ns;
 	}
 
+	if(dotu){
+		if(p + BIT32SZ*3 > ebuf)
+			return 0;
+		d->uidnum = GBIT32(p);
+		p += BIT32SZ;
+		d->gidnum = GBIT32(p);
+		p += BIT32SZ;
+		d->muidnum = GBIT32(p);
+		p += BIT32SZ;
+	}
+	
 	if(strs){
 		d->name = sv[0];
 		d->uid = sv[1];
 		d->gid = sv[2];
 		d->muid = sv[3];
+		d->ext = nullstring;
+		if(dotu)
+			d->ext = sv[4];
 	}else{
 		d->name = nullstring;
 		d->uid = nullstring;
 		d->gid = nullstring;
 		d->muid = nullstring;
+		d->ext = nullstring;
 	}
 	
 	return p - buf;
 }
+
+uint
+convM2D(uchar *buf, uint nbuf, Dir *d, char *strs)
+{
+	return convM2Du(buf, nbuf, d, strs, 0);
+}
blob - 920775ea12606a6f99ea8adf3823349d454cc009
blob + 23b688ab36d98764716f4af4d75828493135e93d
--- src/lib9/convM2S.c
+++ src/lib9/convM2S.c
@@ -48,7 +48,7 @@ gqid(uchar *p, uchar *ep, Qid *q)
  * to test at end of routine.
  */
 uint
-convM2S(uchar *ap, uint nap, Fcall *f)
+convM2Su(uchar *ap, uint nap, Fcall *f, int dotu)
 {
 	uchar *p, *ep;
 	uint i, size;
@@ -229,6 +229,13 @@ convM2S(uchar *ap, uint nap, Fcall *f)
 
 	case Rerror:
 		p = gstring(p, ep, &f->ename);
+		f->errornum = 0;
+		if(dotu){
+			if(p+BIT16SZ > ep)
+				return 0;
+			f->errornum = GBIT16(p);
+			p += BIT16SZ;
+		}
 		break;
 
 	case Rflush:
@@ -321,3 +328,9 @@ convM2S(uchar *ap, uint nap, Fcall *f)
 		return size;
 	return 0;
 }
+
+uint
+convM2S(uchar *ap, uint nap, Fcall *f)
+{
+	return convM2Su(ap, nap, f, 0);
+}
blob - 6e9d2719270832bb2d985b0475197eacc8939290
blob + c004babc38b3efb8fd550eebb94e0621a1279f79
--- src/lib9/convS2M.c
+++ src/lib9/convS2M.c
@@ -46,7 +46,7 @@ stringsz(char *s)
 }
 
 uint
-sizeS2M(Fcall *f)
+sizeS2Mu(Fcall *f, int dotu)
 {
 	uint n;
 	int i;
@@ -141,6 +141,8 @@ sizeS2M(Fcall *f)
 
 	case Rerror:
 		n += stringsz(f->ename);
+		if(dotu)
+			n += BIT16SZ;
 		break;
 
 	case Rflush:
@@ -198,7 +200,13 @@ sizeS2M(Fcall *f)
 }
 
 uint
-convS2M(Fcall *f, uchar *ap, uint nap)
+sizeS2M(Fcall *f)
+{
+	return sizeS2Mu(f, 0);
+}
+
+uint
+convS2Mu(Fcall *f, uchar *ap, uint nap, int dotu)
 {
 	uchar *p;
 	uint i, size;
@@ -331,6 +339,10 @@ convS2M(Fcall *f, uchar *ap, uint nap)
 
 	case Rerror:
 		p = pstring(p, f->ename);
+		if(dotu){
+			PBIT16(p, f->errornum);
+			p += BIT16SZ;
+		}
 		break;
 
 	case Rflush:
@@ -397,3 +409,9 @@ convS2M(Fcall *f, uchar *ap, uint nap)
 		return 0;
 	return size;
 }
+
+uint
+convS2M(Fcall *f, uchar *ap, uint nap)
+{
+	return convS2Mu(f, ap, nap, 0);
+}