diff --git a/sys/src/cmd/hjfs/auth.c b/sys/src/cmd/hjfs/auth.c index 07ab35042..15a4f13c0 100644 --- 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 User { 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 @@ validuser(char *n) 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 @@ usersparseline(char *l, PUser **u, int *nu) 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 @@ userssave(Fs *fs, Chan *ch) { 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 @@ userssave(Fs *fs, Chan *ch) 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 @@ userssave(Fs *fs, Chan *ch) 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 @@ permcheck(Fs *fs, Dentry *d, short uid, int mode) } 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 @@ createuserdir(Fs *fs, char *name, short uid) 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 @@ found: wunlock(&fs->udatal); writeusers(fs); if(createdir) - createuserdir(fs, argv[2], uid); + createuserdir(fs, argv[1], uid); return 1; } diff --git a/sys/src/cmd/hjfs/cons.c b/sys/src/cmd/hjfs/cons.c index e0220f1e2..552173a02 100644 --- a/sys/src/cmd/hjfs/cons.c +++ b/sys/src/cmd/hjfs/cons.c @@ -107,7 +107,7 @@ int 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"); diff --git a/sys/src/cmd/hjfs/dat.h b/sys/src/cmd/hjfs/dat.h index 659bb3d32..014eba424 100644 --- a/sys/src/cmd/hjfs/dat.h +++ b/sys/src/cmd/hjfs/dat.h @@ -21,6 +21,7 @@ enum { EXCLDUR = 300, NOUID = (short)0x8000, + USERLEN = 64, }; typedef struct Fs Fs; @@ -143,6 +144,7 @@ struct FLoc { enum { LGONE = 1, + LDUMPED = 2, }; struct Loc { diff --git a/sys/src/cmd/hjfs/dump.c b/sys/src/cmd/hjfs/dump.c index 1136172aa..ba6dd5fc0 100644 --- a/sys/src/cmd/hjfs/dump.c +++ b/sys/src/cmd/hjfs/dump.c @@ -50,6 +50,15 @@ copydentry(Fs *fs, FLoc *a, Loc *b, char *nname) 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 @@ fsdump(Fs *fs) putbuf(b); rc = copydentry(fs, fs->rootloc, ch->loc, buf); chanclunk(ch); + resetldumped(fs); wunlock(fs); return rc; err: @@ -110,6 +120,8 @@ willmodify(Fs *fs, Loc *l, int nolock) Dentry *d; int rc; + if((l->flags & LDUMPED) != 0) + return 1; if(!nolock){ again: runlock(fs); @@ -154,6 +166,7 @@ found: putbuf(p); l->blk = r; done: + l->flags |= LDUMPED; if(!nolock){ wunlock(fs); rlock(fs); diff --git a/sys/src/cmd/hjfs/fns.h b/sys/src/cmd/hjfs/fns.h index 35e36fa06..510392bc6 100644 --- a/sys/src/cmd/hjfs/fns.h +++ b/sys/src/cmd/hjfs/fns.h @@ -20,7 +20,7 @@ int chanread(Chan *, void *, ulong, uvlong); 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 *); diff --git a/sys/src/cmd/hjfs/fs1.c b/sys/src/cmd/hjfs/fs1.c index 784593245..7052b749a 100644 --- a/sys/src/cmd/hjfs/fs1.c +++ b/sys/src/cmd/hjfs/fs1.c @@ -270,6 +270,7 @@ initfs(Dev *d, int doream, int flags) if(doream) writeusers(fs); readusers(fs); + dprint("hjfs: fs is %s\n", d->name); return fs; error: @@ -418,22 +419,7 @@ freeit: } static int -isopen(Fs *fs, FLoc *p, uvlong blk, int deind) -{ - 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) +dumpblk(Fs *fs, FLoc *, uvlong *l) { uvlong n; int i; @@ -466,8 +452,6 @@ dumpblk(Fs *fs, FLoc *p, uvlong *l) 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) diff --git a/sys/src/cmd/hjfs/fs2.c b/sys/src/cmd/hjfs/fs2.c index 173cc7da7..ee1bc4e01 100644 --- a/sys/src/cmd/hjfs/fs2.c +++ b/sys/src/cmd/hjfs/fs2.c @@ -429,7 +429,7 @@ error: } 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 @@ statbuf(Fs *fs, Dentry *d, Dir *di) 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 @@ chanstat(Chan *ch, Dir *di) 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 @@ chandirread(Chan *ch, void *buf, ulong n, uvlong off) int rc; ulong wr; Dir di; + char cbuf[NAMELEN + 3 * USERLEN]; if(off == 0){ ch->dwloff = 0; @@ -515,12 +525,8 @@ chandirread(Chan *ch, void *buf, ulong n, uvlong off) 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;