@@ 25,151 25,6 @@ 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[])
{
int fd;
@@ 190,11 45,6 @@ boot(int argc, char *argv[])
print("\n");
#endif DEBUG
- intest();
- pipetest();
- pipetest2();
- ethertest();
-
if(argc <= 1)
pflag = 1;
@@ 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