~kris/9p

9hist

79f19215092bf0da6e0f0213075764cbce8e993d — David du Colombier 36 years ago 170d92c
Plan 9 from Bell Labs 1990-09-14
10 files changed, 88 insertions(+), 43 deletions(-)

M gnot/chan.c
M gnot/dat.h
M gnot/devcons.c
M gnot/proc.c
M gnot/screen.c
M gnot/stasync.c
M gnot/stream.c
M port/chan.c
M port/devproc.c
M port/stream.c
M gnot/chan.c => gnot/chan.c +21 -2
@@ 96,11 96,14 @@ loop:
void
close(Chan *c)
{
	if(c->flag & CFREE)
		panic("close");
	if(decref(c) == 0){
		if(!waserror()){
			(*devtab[c->type].close)(c);
			poperror();
		}
		c->flag = CFREE;
		lock(&chanalloc);
		c->next = chanalloc.free;
		chanalloc.free = c;


@@ 369,11 372,21 @@ walk(Chan *ac, char *name, int domnt)
	if(name[0])			/* walk succeeded */
		c->flag &= ~CMOUNT;

	if(domnt){
		if(waserror()){
			print("domount error\n");
			if(!first)
				close(c);
			return 0;
		}
		c = domount(c);
		poperror();
	}

	if(!first)
		close(ac);

	if(domnt)
		return domount(c);

	return c;

    Notfound:


@@ 422,6 435,11 @@ createdir(Chan *c)
	return nc;
}

void
saveregisters(void)
{
}

/*
 * Turn a name into a channel.
 * &name[0] is known to be a valid address.  It may be a kernel address.


@@ 539,6 557,7 @@ namec(char *name, int amode, int omode, ulong perm)
			c = nc;
		}
	Open:
		saveregisters();	/* else error() in open has wrong value of c saved */
		c = (*devtab[c->type].open)(c, omode);
		if(omode & OCEXEC)
			c->flag |= CCEXEC;

M gnot/dat.h => gnot/dat.h +1 -0
@@ 499,6 499,7 @@ extern	char	*statename[];
#define	CMOUNT	2	/* is result of a mount/bind */
#define	CCREATE	4	/* permits creation if CMOUNT */
#define	CCEXEC	8	/* close on exec */
#define	CFREE	16	/* not in use */

/*
 * Proc.time

M gnot/devcons.c => gnot/devcons.c +3 -1
@@ 98,13 98,15 @@ printinit(void)
	klogq.out = klogq.buf;
	lineq.in = lineq.buf;
	lineq.out = lineq.buf;
	rs232.in.in = rs232.in.buf;
	rs232.in.out = rs232.in.buf;
	qlock(&kbdq);		/* allocate qlock */
	qunlock(&kbdq);
	lock(&lineq);		/* allocate lock */
	unlock(&lineq);
	lock(&klogq);		/* allocate lock */
	unlock(&klogq);
	lock(&klogq.put);		/* allocate lock */
	lock(&klogq.put);	/* allocate lock */
	unlock(&klogq.put);

	screeninit();

M gnot/proc.c => gnot/proc.c +1 -0
@@ 5,6 5,7 @@
#include	"fns.h"
#include	"errno.h"

#include	<libg.h>
#include	<gnot.h>

struct

M gnot/screen.c => gnot/screen.c +3 -6
@@ 13,7 13,6 @@
#define	MINX	8

extern	GFont	defont0;
extern	GFont	defont1;
GFont		*defont;

struct{


@@ 42,11 41,9 @@ screeninit(void)
	/*
	 * Read HEX switch to set ldepth
	 */
	if(*(uchar*)MOUSE & (1<<4)){
	if(*(uchar*)MOUSE & (1<<4))
		gscreen.ldepth = 1;
		defont = &defont1;
	}else
		defont = &defont0;
	defont = &defont0;	/* save space; let bitblt do the conversion work */
	gbitblt(&gscreen, Pt(0, 0), &gscreen, gscreen.r, 0);
	out.pos.x = MINX;
	out.pos.y = 0;


@@ 81,7 78,7 @@ screenputc(int c)
			screenputc('\n');
		buf[0] = c&0x7F;
		buf[1] = 0;
		out.pos = gstring(&gscreen, out.pos, defont, buf, S);
		out.pos = gbitbltstring(&gscreen, out.pos, defont, buf, S);
	}
}


M gnot/stasync.c => gnot/stasync.c +8 -7
@@ 11,8 11,7 @@
 *  configuration
 */
enum {
	MAXFRAME=	246,
	Nasync=		1,
	MAXFRAME=	256,	/* also known to tsm8 code */
};

/* input states */


@@ 98,16 97,17 @@ asyncopen(Queue *q, Stream *s)

	DPRINT("asyncopen %d\n", s->dev);

	for(ap = async; ap < &async[Nasync]; ap++){
	for(ap = async; ap < &async[conf.nasync]; ap++){
		qlock(ap);
		if(ap->inuse == 0)
			break;
		qunlock(ap);
	}
	if(ap == &async[Nasync])
	if(ap == &async[conf.nasync])
		error(0, Enoasync);
	q->ptr = q->other->ptr = ap;

	ap->inuse = 1;
	ap->bp = 0;
	ap->chan = -1;
	ap->count = 0;


@@ 120,6 120,7 @@ asyncopen(Queue *q, Stream *s)
	ap->out = 0;
	ap->wq = WR(q);
	ap->state = Hunt;
	qunlock(ap);
}

static void


@@ 329,12 330,12 @@ void
asdeliver(Queue *q, Async *ap)
{
	int chan, c;
	Block *bp;
	Block *bp = 0;
	uchar *p = ap->buf;
	int n = ap->icount;

	chan = p[1] & 0x7e;
	chan = (chan<<5)|((p[2] & 0x7e)>>1);
	chan = *p++ & 0x7e;
	chan = (chan<<5)|((*p++ & 0x7e)>>1);
	if(chan==0) {
		DPRINT("a%d deliver chan 0\n", ap-async);
		ap->chan0++;

M gnot/stream.c => gnot/stream.c +17 -16
@@ 1035,15 1035,16 @@ streamwrite(Chan *c, void *a, long n, int docopy)
	long rem;
	int i;

	s = c->stream;

	/*
	 *  one writer at a time
	 */
	s = c->stream;
	qlock(&s->wrlock);
	if(waserror()){
		qunlock(&s->wrlock);
		nexterror();
	}
	 */

	/*
	 *  decode the qid


@@ 1053,9 1054,7 @@ streamwrite(Chan *c, void *a, long n, int docopy)
		break;
	case Sctlqid:
		n = streamctlwrite(s, a, n);
		qunlock(&s->wrlock);
		poperror();
		return n;
		goto out;
	default:
		panic("bad stream qid\n");
	}


@@ 1104,8 1103,9 @@ streamwrite(Chan *c, void *a, long n, int docopy)
			}
		}
	}
	qunlock(&s->wrlock);
	poperror();
out:
/*	qunlock(&s->wrlock);
	poperror(); /**/
	return n;
}



@@ 1148,16 1148,17 @@ streamstat(Chan *c, char *db, char *name)

	s = c->stream;
	if(s == 0)
		panic("streamstat");

	q = RD(s->procq);
	lock(q);
	for(n=0, bp=q->first; bp; bp = bp->next){
		n += BLEN(bp);
		if(bp->flags&S_DELIM)
			break;
		n = 0;
	else {
		q = RD(s->procq);
		lock(q);
		for(n=0, bp=q->first; bp; bp = bp->next){
			n += BLEN(bp);
			if(bp->flags&S_DELIM)
				break;
		}
		unlock(q);
	}
	unlock(q);

	devdir(c, c->qid, name, n, 0, &dir);
	convD2M(&dir, db);

M port/chan.c => port/chan.c +18 -2
@@ 372,11 372,21 @@ walk(Chan *ac, char *name, int domnt)
	if(name[0])			/* walk succeeded */
		c->flag &= ~CMOUNT;

	if(domnt){
		if(waserror()){
			print("domount error\n");
			if(!first)
				close(c);
			return 0;
		}
		c = domount(c);
		poperror();
	}

	if(!first)
		close(ac);

	if(domnt)
		return domount(c);

	return c;

    Notfound:


@@ 425,6 435,11 @@ createdir(Chan *c)
	return nc;
}

void
saveregisters(void)
{
}

/*
 * Turn a name into a channel.
 * &name[0] is known to be a valid address.  It may be a kernel address.


@@ 542,6 557,7 @@ namec(char *name, int amode, int omode, ulong perm)
			c = nc;
		}
	Open:
		saveregisters();	/* else error() in open has wrong value of c saved */
		c = (*devtab[c->type].open)(c, omode);
		if(omode & OCEXEC)
			c->flag |= CCEXEC;

M port/devproc.c => port/devproc.c +6 -0
@@ 4,6 4,7 @@
#include	"dat.h"
#include	"fns.h"
#include	"errno.h"
#include 	"io.h"

#include	"devtab.h"



@@ 282,6 283,11 @@ procread(Chan *c, void *va, long n)
				n = KZERO+conf.npage0*BY2PG - c->offset;
			memcpy(a, (char*)c->offset, n);
			return n;
		} else if(c->offset>=UNCACHED && c->offset<UNCACHED+conf.npage0*BY2PG){
			if(c->offset+n > UNCACHED+conf.npage0*BY2PG)
				n = UNCACHED+conf.npage0*BY2PG - c->offset;
			memcpy(a, (char*)c->offset, n);
			return n;
		}
		return 0;
		break;

M port/stream.c => port/stream.c +10 -9
@@ 1148,16 1148,17 @@ streamstat(Chan *c, char *db, char *name)

	s = c->stream;
	if(s == 0)
		panic("streamstat");

	q = RD(s->procq);
	lock(q);
	for(n=0, bp=q->first; bp; bp = bp->next){
		n += BLEN(bp);
		if(bp->flags&S_DELIM)
			break;
		n = 0;
	else {
		q = RD(s->procq);
		lock(q);
		for(n=0, bp=q->first; bp; bp = bp->next){
			n += BLEN(bp);
			if(bp->flags&S_DELIM)
				break;
		}
		unlock(q);
	}
	unlock(q);

	devdir(c, c->qid, name, n, 0, &dir);
	convD2M(&dir, db);