~kris/9p

9hist

1f812259f2bec9c285a4794a2c6ee789c7316f4f — David du Colombier 34 years ago 3490e97
Plan 9 from Bell Labs 1991-12-19
7 files changed, 66 insertions(+), 44 deletions(-)

M gnot/devincon.c
M port/devsrv.c
M port/fault.c
M port/segment.c
M port/stil.c
M port/stip.c
M port/sysproc.c
M gnot/devincon.c => gnot/devincon.c +15 -8
@@ 437,7 437,20 @@ inconwstat(Chan *c, char *dp)
 */

/*
 * for sleeping while kproc dies
 */
static int
kNotliving(void *arg)
{
	Incon *ip;

	ip = (Incon *)arg;
	return ip->kstarted == 0;
}

/*
 *  create the kernel process for input
 *  first wait for any old ones to die
 */
static void
inconstopen(Queue *q, Stream *s)


@@ 448,6 461,8 @@ inconstopen(Queue *q, Stream *s)
	ip = &incon[s->dev];
	sprint(name, "incon%d", s->dev);
	q->ptr = q->other->ptr = ip;
	wakeup(&ip->kr);
	sleep(&ip->r, kNotliving, ip);
	ip->rq = q;
	kproc(name, inconkproc, ip);
}


@@ 455,14 470,6 @@ inconstopen(Queue *q, Stream *s)
/*
 *  kill off the kernel process
 */
static int
kNotliving(void *arg)
{
	Incon *ip;

	ip = (Incon *)arg;
	return ip->kstarted == 0;
}
static void
inconstclose(Queue * q)
{

M port/devsrv.c => port/devsrv.c +43 -28
@@ 9,19 9,27 @@

typedef struct	Srv Srv;
struct Srv{
	Lock;
	char	*name;
	Chan	**chan;
}srv;
	char	name[NAMELEN];
	char	owner[NAMELEN];
	ulong	perm;
	Chan	*chan;
};

Lock	srvlk;
Srv	*srv;

int
srvgen(Chan *c, Dirtab *tab, int ntab, int s, Dir *dp)
{
	Srv *sp;

	if(s >= conf.nsrv)
		return -1;
	if(srv.chan[s] == 0)

	sp = &srv[s];
	if(sp->chan == 0)
		return 0;
	devdir(c, (Qid){s, 0}, &srv.name[s*NAMELEN], 0, eve, 0666, dp);
	devdir(c, (Qid){s, 0}, sp->name, 0, sp->owner, sp->perm, dp);
	return 1;
}



@@ 33,8 41,7 @@ srvinit(void)
void
srvreset(void)
{
	srv.chan = ialloc(conf.nsrv*sizeof(Chan*), 0);
	srv.name = ialloc(conf.nsrv*NAMELEN, 0);
	srv = ialloc(conf.nsrv*sizeof(Srv), 0);
}

Chan *


@@ 74,12 81,12 @@ srvopen(Chan *c, int omode)
		c->offset = 0;
		return c;
	}
	lock(&srv);
	lock(&srvlk);
	if(waserror()){
		unlock(&srv);
		unlock(&srvlk);
		nexterror();
	}
	f = srv.chan[c->qid.path];
	f = srv[c->qid.path].chan;
	if(f == 0)
		error(Eshutdown);
	if(omode&OTRUNC)


@@ 88,7 95,7 @@ srvopen(Chan *c, int omode)
		error(Eperm);
	close(c);
	incref(f);
	unlock(&srv);
	unlock(&srvlk);
	poperror();
	return f;
}


@@ 97,28 104,35 @@ void
srvcreate(Chan *c, char *name, int omode, ulong perm)
{
	int j, i;
	Srv *sp;

	if(omode != OWRITE)
		error(Eperm);
	lock(&srv);

	lock(&srvlk);
	if(waserror()){
		unlock(&srv);
		unlock(&srvlk);
		nexterror();
	}
	j = -1;
	for(i=0; i<conf.nsrv; i++){
		if(srv.chan[i] == 0){
		if(srv[i].chan == 0){
			if(j == -1)
				j = i;
		}else if(strcmp(name, &srv.name[i*NAMELEN]) == 0)
		}
		else if(strcmp(name, srv[i].name) == 0)
			error(Einuse);
	}
	if(j == -1)
		error(Enosrv);
	srv.chan[j] = c;
	unlock(&srv);
	sp = &srv[j];
	sp->chan = c;
	unlock(&srvlk);
	poperror();
	strcpy(&srv.name[j*NAMELEN], name);
	strncpy(sp->name, name, NAMELEN);
	strncpy(sp->owner, u->p->user, NAMELEN);
	sp->perm = perm&0777;

	c->qid.path = j;
	c->flag |= COPEN;
	c->mode = OWRITE;


@@ 131,18 145,19 @@ srvremove(Chan *c)

	if(c->qid.path == CHDIR)
		error(Eperm);
	lock(&srv);

	lock(&srvlk);
	if(waserror()){
		unlock(&srv);
		unlock(&srvlk);
		nexterror();
	}
	f = srv.chan[c->qid.path];
	f = srv[c->qid.path].chan;
	if(f == 0)
		error(Eshutdown);
	if(strcmp(&srv.name[c->qid.path*NAMELEN], "boot") == 0)
	if(strcmp(srv[c->qid.path].name, "boot") == 0)
		error(Eperm);
	srv.chan[c->qid.path] = 0;
	unlock(&srv);
	srv[c->qid.path].chan = 0;
	unlock(&srvlk);
	poperror();
	close(f);
}


@@ 175,7 190,7 @@ srvwrite(Chan *c, void *va, long n, ulong offset)
	char buf[32];

	i = c->qid.path;
	if(srv.chan[i] != c)	/* already been written to */
	if(srv[i].chan != c)	/* already been written to */
		error(Egreg);
	if(n >= sizeof buf)
		error(Egreg);


@@ 185,8 200,8 @@ srvwrite(Chan *c, void *va, long n, ulong offset)
	f = u->p->fgrp;
	lock(f);
	fdtochan(fd, -1, 0);	/* error check only */
	srv.chan[i] = f->fd[fd];
	incref(srv.chan[i]);
	srv[i].chan = f->fd[fd];
	incref(srv[i].chan);
	unlock(f);
	return n;
}

M port/fault.c => port/fault.c +1 -3
@@ 280,9 280,7 @@ validaddr(ulong addr, ulong len, int write)
		}
	}

	pprint("invalid address %lux in sys call pc %lux sp %lux\n", 
			addr, ((Ureg*)UREGADDR)->pc, ((Ureg*)UREGADDR)->sp);

	pprint("invalid address 0x%lux in sys call pc=0x%lux", addr, ((Ureg*)UREGADDR)->pc);
	postnote(u->p, 1, "sys: bad address", NDebug);
	error(Ebadarg);
}

M port/segment.c => port/segment.c +0 -2
@@ 6,8 6,6 @@
#include	"ureg.h"
#include	"errno.h"

#define DPRINT

Page *lkpage(ulong addr);
Page *snewpage(ulong addr);
void lkpgfree(Page*);

M port/stil.c => port/stil.c +1 -1
@@ 65,7 65,7 @@ ilopen(Queue *q, Stream *s)

	ipc = &ipconv[s->dev][s->id];
	ipc->ipinterface = newipifc(IP_ILPROTO, ilrcvmsg, ipconv[s->dev],
			            1500, 512, ETHER_HDR, "IL");
			            1500, 60, ETHER_HDR, "IL");

	ipc->readq = RD(q);	
	RD(q)->ptr = (void *)ipc;

M port/stip.c => port/stip.c +1 -1
@@ 228,7 228,7 @@ ipetheroput(Queue *q, Block *bp)
	if(eh->frag[0] & (IP_DF>>8))
		goto drop;

	seglen = (ifp->minmtu - (ETHER_HDR+ETHER_IPHDR)) & ~7;
	seglen = (ifp->maxmtu - (ETHER_HDR+ETHER_IPHDR)) & ~7;
	if(seglen < 8)
		goto drop;


M port/sysproc.c => port/sysproc.c +5 -1
@@ 397,7 397,11 @@ return0(void *a)
long
syssleep(ulong *arg)
{
	tsleep(&u->p->sleep, return0, 0, arg[0]);
	if(arg[0] == 0)
		sched();
	else
		tsleep(&u->p->sleep, return0, 0, arg[0]);

	return 0;
}