@@ 19,28 19,48 @@ enum{
extern long cfslen;
extern ulong cfscode[];
-
extern long cryptfslen;
extern ulong cryptfscode[];
-
Dirtab rootdir[]={
"bin", {Qbin|CHDIR}, 0, 0700,
"boot", {Qboot}, 0, 0700,
"dev", {Qdev|CHDIR}, 0, 0700,
"env", {Qenv|CHDIR}, 0, 0700,
"proc", {Qproc|CHDIR}, 0, 0700,
- "cryptfs", {Qcryptfs}, 0, 0700,
- "cfs", {Qcfs}, 0, 0700,
};
-
#define NROOT (sizeof rootdir/sizeof(Dirtab))
+Dirtab rootpdir[]={
+ "cfs", {Qcfs}, 0, 0700,
+ "cryptfs", {Qcryptfs}, 0, 0700,
+};
+Dirtab *rootmap[sizeof rootpdir/sizeof(Dirtab)];
int nroot;
+int
+rootgen(Chan *c, Dirtab *tab, int ntab, int i, Dir *dp)
+{
+ if(tab==0 || i>=ntab)
+ return -1;
+ if(i < NROOT)
+ tab += i;
+ else
+ tab = rootmap[i - NROOT];
+ devdir(c, tab->qid, tab->name, tab->length, tab->perm, dp);
+ return 1;
+}
+
void
rootreset(void)
{
- nroot = (cfslen > 0) ? NROOT : NROOT-1;
+ int i;
+
+ i = 0;
+ if(cfslen)
+ rootmap[i++] = &rootpdir[0];
+ if(cryptfslen)
+ rootmap[i++] = &rootpdir[1];
+ nroot = NROOT + i;
}
void
@@ 63,19 83,19 @@ rootclone(Chan *c, Chan *nc)
int
rootwalk(Chan *c, char *name)
{
- return devwalk(c, name, rootdir, nroot, devgen);
+ return devwalk(c, name, rootdir, nroot, rootgen);
}
void
rootstat(Chan *c, char *dp)
{
- devstat(c, dp, rootdir, nroot, devgen);
+ devstat(c, dp, rootdir, nroot, rootgen);
}
Chan*
rootopen(Chan *c, int omode)
{
- return devopen(c, omode, rootdir, nroot, devgen);
+ return devopen(c, omode, rootdir, nroot, rootgen);
}
void
@@ 100,7 120,7 @@ rootread(Chan *c, void *buf, long n, ulong offset)
switch(c->qid.path & ~CHDIR){
case Qdir:
- return devdirread(c, buf, n, rootdir, nroot, devgen);
+ return devdirread(c, buf, n, rootdir, nroot, rootgen);
case Qboot: /* boot */
if(offset >= sizeof bootcode)
@@ 364,8 364,6 @@ bindmount(ulong *arg, int ismount)
Chan *c0, *c1;
ulong flag;
long ret;
- char *p;
- int t;
struct{
Chan *chan;
char *spec;
@@ 378,20 376,12 @@ bindmount(ulong *arg, int ismount)
if(ismount){
bogus.chan = fdtochan(arg[0], 2);
validaddr(arg[3], 1, 0);
- p = (char*)arg[3];
- t = BY2PG-((ulong)p&(BY2PG-1));
- while(vmemchr(p, 0, t) == 0){
- p += t;
- t = BY2PG;
- }
+ if(vmemchr((char*)arg[3], '\0', NAMELEN) == 0)
+ error(Ebadarg);
bogus.spec = (char*)arg[3];
validaddr(arg[4], 1, 0);
- p = (char*)arg[4];
- t = BY2PG-((ulong)p&(BY2PG-1));
- while(vmemchr(p, 0, t) == 0){
- p += t;
- t = BY2PG;
- }
+ if(vmemchr((char*)arg[4], '\0', NAMELEN) == 0)
+ error(Ebadarg);
bogus.auth = (char*)arg[4];
ret = devno('M', 0);
c0 = (*devtab[ret].attach)((char*)&bogus);