From d7bc9602196156d6ea438130405bff7e216e82f5 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Sat, 15 Jun 1991 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1991-06-15 --- port/devroot.c | 40 ++++++++++++++++++++++++++++++---------- port/devwren.c | 2 +- port/sysfile.c | 18 ++++-------------- 3 files changed, 35 insertions(+), 25 deletions(-) diff --git a/port/devroot.c b/port/devroot.c index 862b1227fcafffc4a3909158d9f5e2edfdbaa72e..07d9f1a3a26c3c558eb8fbb24108f68f47fbdaf4 100644 --- a/port/devroot.c +++ b/port/devroot.c @@ -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) diff --git a/port/devwren.c b/port/devwren.c index b0937a0f9c91c30fa3577576362fd7fd82cf9ccb..c313cf352f4b6f912f93a3e761375758229804d0 100644 --- a/port/devwren.c +++ b/port/devwren.c @@ -150,7 +150,7 @@ wrenattach(char *param) d = &wren[dev]; d->blocksize = BGLONG(&buf[4]); - plen = BGLONG(&buf[0]); + plen = BGLONG(&buf[0])+1; d->p[Npart].firstblock = 0; d->p[Npart].maxblock = plen; plen = plen/Npart; diff --git a/port/sysfile.c b/port/sysfile.c index 63bfe099918a9ef28a7e8625a4ac3e8ffbfe9b7f..d2d95290e3a91d7a764905d9ea7d81f5c8ecba8c 100644 --- a/port/sysfile.c +++ b/port/sysfile.c @@ -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);