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;
--
⑨