~kris/9p

9hist

957dfcd7ce95bef0b82713c08c5453b012fdbc62 — David du Colombier 33 years ago 0c56452
Plan 9 from Bell Labs 1993-07-24
3 files changed, 53 insertions(+), 229 deletions(-)

M boot/boot.c
M port/devroot.c
M port/portfns.h
M boot/boot.c => boot/boot.c +0 -150
@@ 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;


M port/devroot.c => port/devroot.c +51 -79
@@ 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	 

M port/portfns.h => port/portfns.h +2 -0
@@ 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*);