git: 9front

Download patch

ref: 652e03aeb0a2f57373d990f9edc86608f41c2de1
parent: 415e51c25b6b81e966b2315ba80dc965f4026845
author: aiju <aiju@phicode.de>
date: Wed Aug 8 06:14:20 EDT 2012

hjfs: various fixes

--- a/sys/src/cmd/hjfs/auth.c
+++ b/sys/src/cmd/hjfs/auth.c
@@ -7,11 +7,9 @@
 typedef struct User User;
 typedef struct PUser PUser;
 
-enum { USERMAX = 64 };
-
 struct User {
 	short uid;
-	char name[USERMAX];
+	char name[USERLEN];
 	short lead;
 	int nmemb;
 	short *memb;
@@ -19,10 +17,10 @@
 
 struct PUser {
 	short uid;
-	char name[USERMAX];
-	char lead[USERMAX];
+	char name[USERLEN];
+	char lead[USERLEN];
 	int nmemb;
-	char (*memb)[USERMAX];
+	char (*memb)[USERLEN];
 };
 
 User udef[] = {
@@ -47,7 +45,7 @@
 	for(p = n; *p != 0; p++)
 		if((uchar) *p < ' ' || strchr("?=+-/:", *p) != nil)
 			return 0;
-	return n - p < USERMAX;
+	return n - p < USERLEN;
 }
 
 static void
@@ -80,7 +78,7 @@
 			free(v.memb);
 			return;
 		}
-		v.memb = realloc(v.memb, (v.nmemb + 1) * USERMAX);
+		v.memb = realloc(v.memb, (v.nmemb + 1) * USERLEN);
 		strcpy(v.memb[v.nmemb++], r);
 		if(s == nil)
 			r = nil;
@@ -191,7 +189,7 @@
 {
 	User *u, *v;
 	int nu, i;
-	char buf[512], *p, *e, *s;
+	char buf[512], ubuf[USERLEN], *p, *e;
 	uvlong off;
 	
 	rlock(&fs->udatal);
@@ -206,11 +204,8 @@
 		p = buf;
 		e = buf + sizeof(buf);
 		p = seprint(p, e, "%d:%s:", v->uid, v->name);
-		if(v->lead != NOUID){
-			s = uid2name(fs, v->lead);
-			p = strecpy(p, e, s);
-			free(s);
-		}
+		if(v->lead != NOUID)
+			p = strecpy(p, e, uid2name(fs, v->lead, ubuf));
 		if(p < e)
 			*p++ = ':';
 		for(i = 0; i < v->nmemb; i++){
@@ -218,9 +213,7 @@
 				continue;
 			if(p < e && i > 0)
 				*p++ = ',';
-			s = uid2name(fs, v->memb[i]);
-			p = strecpy(p, e, s);
-			free(s);
+			p = strecpy(p, e, uid2name(fs, v->memb[i], ubuf));
 		}
 		*p++ = '\n';
 		if(ch == nil)
@@ -326,19 +319,20 @@
 }
 
 char *
-uid2name(Fs *fs, short uid)
+uid2name(Fs *fs, short uid, char *buf)
 {
 	User *u;
-	char *s;
 	
 	rlock(&fs->udatal);
 	u = lookupuid(fs, uid);
+	if(buf == nil)
+		buf = emalloc(USERLEN);
 	if(u == nil)
-		s = smprint("%d", uid);
+		snprint(buf, USERLEN, "%d", uid);
 	else
-		s = strdup(u->name);
+		snprint(buf, USERLEN, "%s", u->name);
 	runlock(&fs->udatal);
-	return s;
+	return buf;
 }
 
 int
@@ -405,7 +399,7 @@
 		goto direrr2;
 	d = &c->de[f.deind];
 	memset(d, 0, sizeof(Dentry));
-	strcpy(d->name, name);
+	strncpy(d->name, name, NAMELEN - 1);
 	d->uid = uid;
 	d->muid = uid;
 	d->gid = uid;
@@ -508,6 +502,6 @@
 	wunlock(&fs->udatal);
 	writeusers(fs);
 	if(createdir)
-		createuserdir(fs, argv[2], uid);
+		createuserdir(fs, argv[1], uid);
 	return 1;
 }
--- a/sys/src/cmd/hjfs/cons.c
+++ b/sys/src/cmd/hjfs/cons.c
@@ -107,7 +107,7 @@
 cmdnoauth(int, char **)
 {
 	fsmain->flags ^= FSNOAUTH;
-	if((fsmain->flags & FSNOAUTH) != 0)
+	if((fsmain->flags & FSNOAUTH) == 0)
 		dprint("hjfs: auth enabled\n");
 	else
 		dprint("hjfs: auth disabled\n");
--- a/sys/src/cmd/hjfs/dat.h
+++ b/sys/src/cmd/hjfs/dat.h
@@ -21,6 +21,7 @@
 	EXCLDUR = 300,
 
 	NOUID = (short)0x8000,
+	USERLEN = 64,
 };
 
 typedef struct Fs Fs;
@@ -143,6 +144,7 @@
 
 enum {
 	LGONE = 1,
+	LDUMPED = 2,
 };
 
 struct Loc {
--- a/sys/src/cmd/hjfs/dump.c
+++ b/sys/src/cmd/hjfs/dump.c
@@ -50,6 +50,15 @@
 	return 0;
 }
 
+static void
+resetldumped(Fs *fs)
+{
+	Loc *l;
+	
+	for(l = fs->rootloc->gnext; l != fs->rootloc; l = l->gnext)
+		l->flags &= ~LDUMPED;
+}
+
 int
 fsdump(Fs *fs)
 {
@@ -94,6 +103,7 @@
 	putbuf(b);
 	rc = copydentry(fs, fs->rootloc, ch->loc, buf);
 	chanclunk(ch);
+	resetldumped(fs);
 	wunlock(fs);
 	return rc;
 err:
@@ -110,6 +120,8 @@
 	Dentry *d;
 	int rc;
 
+	if((l->flags & LDUMPED) != 0)
+		return 1;
 	if(!nolock){
 again:
 		runlock(fs);
@@ -154,6 +166,7 @@
 	putbuf(p);
 	l->blk = r;
 done:
+	l->flags |= LDUMPED;
 	if(!nolock){
 		wunlock(fs);
 		rlock(fs);
--- a/sys/src/cmd/hjfs/fns.h
+++ b/sys/src/cmd/hjfs/fns.h
@@ -20,7 +20,7 @@
 int	chanstat(Chan *, Dir *);
 int	chanwstat(Chan *, Dir *);
 int	permcheck(Fs *, Dentry *, short, int);
-char *	uid2name(Fs *, short);
+char *	uid2name(Fs *, short, char *);
 int	name2uid(Fs *, char *, short *);
 void	start9p(char *, int);
 int	chanclunk(Chan *);
--- a/sys/src/cmd/hjfs/fs1.c
+++ b/sys/src/cmd/hjfs/fs1.c
@@ -270,6 +270,7 @@
 	if(doream)
 		writeusers(fs);
 	readusers(fs);
+	dprint("hjfs: fs is %s\n", d->name);
 	return fs;
 
 error:
@@ -418,23 +419,8 @@
 }
 
 static int
-isopen(Fs *fs, FLoc *p, uvlong blk, int deind)
+dumpblk(Fs *fs, FLoc *, uvlong *l)
 {
-	Loc *l;
-
-	qlock(&fs->loctree);
-	for(l = fs->rootloc->gnext; l != fs->rootloc; l = l->gnext)
-		if(l->blk == blk && l->deind == deind && l->next->blk == p->blk && l->next->deind == p->deind){
-			qunlock(&fs->loctree);
-			return 1;
-		}
-	qunlock(&fs->loctree);
-	return 0;
-}
-
-static int
-dumpblk(Fs *fs, FLoc *p, uvlong *l)
-{
 	uvlong n;
 	int i;
 	Buf *b, *c;
@@ -466,8 +452,6 @@
 	case TDENTRY:
 		memcpy(c->de, b->de, sizeof(b->de));
 		for(d = b->de; d < &b->de[DEPERBLK]; d++){
-			if((d->mode & DGONE) != 0 && !isopen(fs, p, *l, d - b->de))
-				memset(d, 0, sizeof(Dentry));
 			if((d->mode & DALLOC) == 0)
 				continue;
 			if((d->type & QTTMP) != 0)
--- a/sys/src/cmd/hjfs/fs2.c
+++ b/sys/src/cmd/hjfs/fs2.c
@@ -429,7 +429,7 @@
 }
 
 static void
-statbuf(Fs *fs, Dentry *d, Dir *di)
+statbuf(Fs *fs, Dentry *d, Dir *di, char *buf)
 {
 	di->qid = d->Qid;
 	di->mode = (d->mode & 0777) | (d->Qid.type << 24);
@@ -438,10 +438,19 @@
 	di->length = d->size;
 	if(d->type & QTDIR)
 		di->length = 0;
-	di->name = strdup(d->name);
-	di->uid = uid2name(fs, d->uid);
-	di->gid = uid2name(fs, d->gid);
-	di->muid = uid2name(fs, d->muid);
+	if(buf == nil){
+		di->name = strdup(d->name);
+		di->uid = uid2name(fs, d->uid, nil);
+		di->gid = uid2name(fs, d->gid, nil);
+		di->muid = uid2name(fs, d->muid, nil);
+	}else{
+		memset(buf, 0, NAMELEN + 3 * USERLEN);
+		strncpy(buf, d->name, NAMELEN - 1);
+		di->name = buf;
+		di->uid = uid2name(fs, d->uid, buf + NAMELEN);
+		di->gid = uid2name(fs, d->gid, buf + NAMELEN + USERLEN);
+		di->muid = uid2name(fs, d->muid, buf + NAMELEN + 2 * USERLEN);
+	}
 }
 
 int
@@ -455,7 +464,7 @@
 		chend(ch);
 		return -1;
 	}
-	statbuf(ch->fs, &b->de[ch->loc->deind], di);
+	statbuf(ch->fs, &b->de[ch->loc->deind], di, nil);
 	putbuf(b);
 	chend(ch);
 	return 0;
@@ -471,6 +480,7 @@
 	int rc;
 	ulong wr;
 	Dir di;
+	char cbuf[NAMELEN + 3 * USERLEN];
 
 	if(off == 0){
 		ch->dwloff = 0;
@@ -515,12 +525,8 @@
 			goto next;
 		if((ch->flags & CHFDUMP) != 0 && (c->de[j].type & QTTMP) != 0)
 			goto next;
-		statbuf(ch->fs, &c->de[j], &di);
+		statbuf(ch->fs, &c->de[j], &di, cbuf);
 		rc = convD2M(&di, (uchar *) buf + wr, n - wr);
-		free(di.uid);
-		free(di.gid);
-		free(di.muid);
-		free(di.name);
 		if(rc <= BIT16SZ)
 			break;
 		wr += rc;
--