From 957dfcd7ce95bef0b82713c08c5453b012fdbc62 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Sat, 24 Jul 1993 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1993-07-24 --- boot/boot.c | 150 ------------------------------------------------- port/devroot.c | 130 +++++++++++++++++------------------------- port/portfns.h | 2 + 3 files changed, 53 insertions(+), 229 deletions(-) diff --git a/boot/boot.c b/boot/boot.c index 31f02f0c94dff0d280169c2f7472647a8f3167c8..e423f97d18c1640c30dc59559319366fd8f06005 100644 --- a/boot/boot.c +++ b/boot/boot.c @@ -24,151 +24,6 @@ static void swapproc(void); static void recover(Method*); static Method *rootserver(char*); -void -intest(void) -{ - int n; - char buf[128]; - - print(">"); - n = read(0, buf, sizeof(buf)-1); -print("read %d bytes\n", n); - write(1, buf, n); -} - -void -pipetest(void) -{ - int i, n, p[2]; - ulong buf[1]; - - if(bind("#c", "/dev", MREPL) < 0) - print("can't bind #c\n"); - - if(pipe(p) < 0){ - print("pipe fails\n"); - exits(0); - } - switch(fork()){ - case -1: - print("fork fails\n"); - exits(0); - case 0: - close(p[0]); - for(;;){ - n = read(p[1], buf, 1); - if(n <= 0){ - print("1 exiting %d\n", time(0)); - exits(0); - } - write(p[1], buf, 1); - } - default: - close(p[1]); - print("start %d\n", time(0)); - for(i = 0; i < 100000; i++){ - if(write(p[0], buf, 1) != 1){ - print("sndr broke\n"); - exits(0); - } - n = read(p[0], buf, 1); - if(n <= 0){ - print("0 exiting %d\n", time(0)); - exits(0); - } - } - close(p[0]); - sleep(1000); - } -} - -void -pipetest2(void) -{ - int i, n, p[2]; - uchar buf[4096]; - - if(bind("#c", "/dev", MREPL) < 0) - print("can't bind #c\n"); - - if(pipe(p) < 0){ - print("pipe fails\n"); - exits(0); - } - switch(fork()){ - case -1: - print("fork fails\n"); - exits(0); - case 0: - close(p[0]); - for(;;){ - n = read(p[1], buf, sizeof(buf)); - if(n <= 0){ - print("1 exiting %d\n", time(0)); - exits(0); - } - } - default: - close(p[1]); - print("start %d\n", time(0)); - for(i = 0; i < 40000; i++){ - if(write(p[0], buf, sizeof(buf)) != sizeof(buf)){ - print("sndr broke\n"); - exits(0); - } - } - close(p[0]); - sleep(1000); - } - -} - -void -ethertest(void) -{ - int cf, df, n, t, i; - char buf[64]; - struct Etherpkt - { - uchar d[6]; - uchar s[6]; - uchar type[2]; - } p; - - cf = open("#l/ether/clone", ORDWR); - if(cf < 0){ - print("can't open #l/ether/clone: %r\n"); - exits(0); - } - n = read(cf, buf, 12); - if(n < 0){ - print("can't read #l/ether/clone: %r\n"); - exits(0); - } - buf[n] = 0; - sprint(buf, "#l/ether/%d/data", atoi(buf)); - df = open(buf, ORDWR); - if(df < 0){ - print("can't open %s: %r\n", buf); - exits(0); - } - if(write(cf, "connect -1", sizeof("connect -1")-1) < 0){ - print("can't connect -1: %r\n"); - exits(0); - } - close(cf); - for(i=0;i<20;i++){ - n = read(df, &p, sizeof(p)); - if(n <= 0){ - print("read returns %d: %r\n", n); - continue; - } - t = (p.type[0]<<8) | p.type[1]; - print("%d %2.2ux%2.2ux%2.2ux%2.2ux%2.2ux%2.2ux -> %2.2ux%2.2ux%2.2ux%2.2ux%2.2ux%2.2ux %ux\n", n, p.s[0], p.s[1], p.s[2], p.s[3], p.s[4], p.s[5], p.d[0], p.d[1], p.d[2], p.d[3], p.d[4], p.d[5], t); - } - close(df); -} - void boot(int argc, char *argv[]) { @@ -190,11 +45,6 @@ boot(int argc, char *argv[]) print("\n"); #endif DEBUG - intest(); - pipetest(); - pipetest2(); - ethertest(); - if(argc <= 1) pflag = 1; diff --git a/port/devroot.c b/port/devroot.c index b4be24298936ca936464581bf5801bc9b401cf45..39af63fa56c7ae24d6a17cfcd410dc6eafaf868b 100644 --- a/port/devroot.c +++ b/port/devroot.c @@ -6,44 +6,33 @@ #include "../port/error.h" #include "devtab.h" -enum -{ - Qdir, +enum{ + Qdir= 0, Qbin, Qdev, Qenv, Qproc, Qnet, Qrecover, + Qboot, /* readable files */ - Qboot, - Qcfs, - Qfs, + Nfiles=13, /* max root files */ }; -extern long cfslen; -extern ulong cfscode[]; -extern long fslen; -extern ulong fscode[]; extern ulong bootlen; extern uchar bootcode[]; -Dirtab rootdir[]={ - "bin", {Qbin|CHDIR}, 0, 0777, - "boot", {Qboot}, 0, 0777, - "dev", {Qdev|CHDIR}, 0, 0777, - "env", {Qenv|CHDIR}, 0, 0777, - "proc", {Qproc|CHDIR}, 0, 0777, - "net", {Qnet|CHDIR}, 0, 0777, - "recover", {Qrecover}, 0, 0777, -}; -#define NROOT (sizeof rootdir/sizeof(Dirtab)) -Dirtab rootpdir[]={ - "cfs", {Qcfs}, 0, 0777, - "fs", {Qfs}, 0, 0777, +Dirtab rootdir[Nfiles]={ + "bin", {Qbin|CHDIR}, 0, 0777, + "dev", {Qdev|CHDIR}, 0, 0777, + "env", {Qenv|CHDIR}, 0, 0777, + "proc", {Qproc|CHDIR}, 0, 0777, + "net", {Qnet|CHDIR}, 0, 0777, + "recover", {Qrecover}, 0, 0777, }; -Dirtab *rootmap[sizeof rootpdir/sizeof(Dirtab)]; -int nroot; + +static uchar *rootdata[Nfiles]; +static int nroot = Qboot - 1; typedef struct Recover Recover; struct Recover @@ -61,34 +50,30 @@ struct Recover *q; }reclist; -int -rootgen(Chan *c, Dirtab *tab, int ntab, int i, Dir *dp) +/* + * add a root file + */ +void +addrootfile(char *name, uchar *contents, ulong len) { - USED(ntab); - - if(i >= nroot) - return -1; - - if(i < NROOT) - tab = &rootdir[i]; - else - tab = rootmap[i - NROOT]; + Dirtab *d; + - devdir(c, tab->qid, tab->name, tab->length, eve, tab->perm, dp); - return 1; + if(nroot >= Nfiles) + panic("too many root files"); + rootdata[nroot] = contents; + d = &rootdir[nroot]; + strcpy(d->name, name); + d->length = len; + d->perm = 0555; + d->qid.path = nroot+1; + nroot++; } void rootreset(void) { - int i; - - i = 0; - if(cfslen) - rootmap[i++] = &rootpdir[0]; - if(fslen) - rootmap[i++] = &rootpdir[1]; - nroot = NROOT + i; + addrootfile("boot", bootcode, bootlen); /* always have a boot file */ } void @@ -117,13 +102,13 @@ rootwalk(Chan *c, char *name) } if((c->qid.path & ~CHDIR) != Qdir) return 0; - return devwalk(c, name, rootdir, nroot, rootgen); + return devwalk(c, name, rootdir, nroot, devgen); } void rootstat(Chan *c, char *dp) { - devstat(c, dp, rootdir, nroot, rootgen); + devstat(c, dp, rootdir, nroot, devgen); } Chan* @@ -138,7 +123,7 @@ rootopen(Chan *c, int omode) break; } - return devopen(c, omode, rootdir, nroot, rootgen); + return devopen(c, omode, rootdir, nroot, devgen); } void @@ -167,36 +152,15 @@ rdrdy(void *a) long rootread(Chan *c, void *buf, long n, ulong offset) { + ulong t; + Dirtab *d; + uchar *data; Recover *r; - switch(c->qid.path & ~CHDIR){ + t = c->qid.path & ~CHDIR; + switch(t){ case Qdir: - return devdirread(c, buf, n, rootdir, nroot, rootgen); - - case Qboot: /* boot */ - if(offset >= bootlen) - return 0; - if(offset+n > bootlen) - n = bootlen - offset; - memmove(buf, bootcode+offset, n); - return n; - - case Qcfs: /* cfs */ - if(offset >= cfslen) - return 0; - if(offset+n > cfslen) - n = cfslen - offset; - memmove(buf, ((char*)cfscode)+offset, n); - return n; - - case Qfs: /* fs */ - if(offset >= fslen) - return 0; - if(offset+n > fslen) - n = fslen - offset; - memmove(buf, ((char*)fscode)+offset, n); - return n; - + return devdirread(c, buf, n, rootdir, nroot, devgen); case Qrecover: qlock(&reclist); if(waserror()) { @@ -220,11 +184,19 @@ rootread(Chan *c, void *buf, long n, ulong offset) free(r->req); free(r); return n; + } - case Qdev: + if(t < Qboot) return 0; - } - return 0; + + d = &rootdir[t-1]; + data = rootdata[t-1]; + if(offset >= d->length) + return 0; + if(offset+n > d->length) + n = d->length - offset; + memmove(buf, data+offset, n); + return n; } long diff --git a/port/portfns.h b/port/portfns.h index eb651470edfbaabd298e6e0f02f37f64ac0b1b57..c57071bc885513a7769b73d60a1d0c361b45b395 100644 --- a/port/portfns.h +++ b/port/portfns.h @@ -1,3 +1,4 @@ +void addrootfile(char*, uchar*, ulong); void alarmkproc(void*); int anyready(void); Image* attachimage(int, Chan*, ulong, ulong); @@ -185,6 +186,7 @@ void resrcwait(char*); int return0(void*); void rlock(RWlock*); void rootreq(Chan*, Mnt*); +void rootfiles(void); void runlock(RWlock*); Proc* runproc(void); void savefpregs(FPsave*);