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