~kris/9p

9hist

7dbdedb194ef5b66438c4bfd1f66063e71ffb30e — David du Colombier 26 years ago 11d346f
Plan 9 from Bell Labs 2000-03-31
4 files changed, 97 insertions(+), 48 deletions(-)

M port/devbridge.c
M port/devdraw.c
M port/devproc.c
M port/proc.c
M port/devbridge.c => port/devbridge.c +20 -14
@@ 36,8 36,8 @@ enum
	CacheSize=	(CacheHash+CacheLook-1),
	CacheTimeout=	5*60,		// timeout for cache entry in seconds

	TcpMssMax = 1360,			// max desirable Tcp MSS value

	TcpMssMax = 1300,			// max desirable Tcp MSS value
	TunnelMtu = 1400,
};

static Dirtab bridgedirtab[]={


@@ 128,6 128,7 @@ struct Port
	int	out;		// number of packets read
	int	outmulti;	// multicast or broadcast
	int	outunknown;	// unknown address
	int outfrag;	// fragmented the packet
	int	nentry;		// number of cache entries for this port
};



@@ 183,6 184,7 @@ static void	etherread(void *a);
static char	*cachedump(Bridge *b);
static void	portfree(Port *port);
static void	cacheflushport(Bridge *b, int port);
static void etherwrite(Port *port, Block *bp);

extern ulong	parseip(uchar*, char*);



@@ 814,7 816,7 @@ cachedump(Bridge *b)
static void
ethermultiwrite(Bridge *b, Block *bp, Port *port)
{
	Chan *c;
	Port *oport;
	Block *bp2;
	Etherpkt *ep;
	int i, mcast, bcast;


@@ 833,35 835,34 @@ ethermultiwrite(Bridge *b, Block *bp, Port *port)
	else
		bcast = 0;

	c = nil;
	oport = nil;
	for(i=0; i<b->nport; i++) {
		if(i == port->id || b->port[i] == nil)
			continue;
		if(mcast && !bcast && !b->port[i]->mcast)
			continue;
		b->port[i]->out++;
		if(mcast)
			b->port[i]->outmulti++;
		else
			b->port[i]->outunknown++;

		// delay one so that the last write does not copy
		if(c != nil) {
		if(oport != nil) {
			b->copy++;
			bp2 = copyblock(bp, blocklen(bp));
			if(!waserror()) {
				devtab[c->type]->bwrite(c, bp2, 0);
				etherwrite(oport, bp2);
				poperror();
			}
		}
		c = b->port[i]->data[1];
		oport = b->port[i];
	}

	// last write free block
	if(c) {
	if(oport) {
		bp2 = bp; bp = nil; USED(bp);
		if(!waserror()) {
			devtab[c->type]->bwrite(c, bp2, 0);
			etherwrite(oport, bp2);
			poperror();
		}
	} else


@@ 961,7 962,7 @@ print("tcpmsshack: odd alignment!\n");
static void
etherread(void *a)
{
	Port *port = a, *oport;
	Port *port = a;
	Bridge *b = port->bridge;
	Block *bp, *bp2;
	Etherpkt *ep;


@@ 1016,9 1017,7 @@ if(0)print("devbridge: etherread: blocklen = %d\n", blocklen(bp));
			} else if (ce->port != port->id) {
				b->hit++;
				bp2 = bp; bp = nil;
				oport = b->port[ce->port];
				oport->out++;
				devtab[oport->data[1]->type]->bwrite(oport->data[1], bp2, 0);
				etherwrite(b->port[ce->port], bp2);
			}
		}



@@ 1033,6 1032,13 @@ if(0)print("devbridge: etherread: blocklen = %d\n", blocklen(bp));
	pexit("hangup", 1);
}

static void
etherwrite(Port *port, Block *bp)
{
	port->out++;
	devtab[port->data[1]->type]->bwrite(port->data[1], bp, 0);
}

// hold b lock
static void
portfree(Port *port)

M port/devdraw.c => port/devdraw.c +4 -4
@@ 1009,7 1009,7 @@ drawread(Chan *c, void *a, long n, vlong off)
	}
	switch(QID(c->qid)){
	case Qctl:
		if(n <= 12*12)
		if(n < 12*12)
			error(Eshortread);
		if(cl->infoid < 0)
			error(Enodrawimage);


@@ 1146,15 1146,15 @@ drawwrite(Chan *c, void *a, long n, vlong off)
			m -= i;
			*q = 0;
			if(getfields(buf, fields, nelem(fields), 1, " ") != 4)
				error("eb1"); //error(Ebadarg);
				error(Ebadarg);
			i = strtoul(fields[0], 0, 0);
			red = strtoul(fields[1], 0, 0);
			green = strtoul(fields[2], 0, 0);
			blue = strtoul(fields[3], &q, 0);
			if(fields[3] == q)
				error("eb2"); //error(Ebadarg);
				error(Ebadarg);
			if(red>255 || green>255 || blue>255 || i<0 || i>255)
				error("eb3"); //error(Ebadarg);
				error(Ebadarg);
			red |= red<<8;
			red |= red<<16;
			green |= green<<8;

M port/devproc.c => port/devproc.c +46 -11
@@ 169,7 169,11 @@ procopen(Chan *c, int omode)
		return devopen(c, omode, 0, 0, procgen);

	p = proctab(SLOT(c->qid));
	pg = p->pgrp;
	qlock(&p->debug);
	if(waserror()){
		qunlock(&p->debug);
		nexterror();
	}
	pid = PID(c->qid);
	if(p->pid != pid)
		error(Eprocdied);


@@ 182,6 186,8 @@ procopen(Chan *c, int omode)
			error(Eperm);
		tc = proctext(c, p);
		tc->offset = 0;
		qunlock(&p->debug);
		poperror();
		return tc;

	case Qproc:


@@ 210,6 216,9 @@ procopen(Chan *c, int omode)
		break;

	case Qnotepg:
		pg = p->pgrp;
		if(pg == nil)
			error(Eprocdied);
		if(omode!=OWRITE || pg->pgrpid == 1)
			error(Eperm);
		c->pgrpid.path = pg->pgrpid+1;


@@ 230,7 239,11 @@ procopen(Chan *c, int omode)
	if(p->pid != pid)
		error(Eprocdied);

	return devopen(c, omode, 0, 0, procgen);
	tc = devopen(c, omode, 0, 0, procgen);
	qunlock(&p->debug);
	poperror();

	return tc;
}

static void


@@ 277,17 290,19 @@ procfds(Proc *p, char *va, int count, long offset)
	Chan *c;
	int n, i;

	qlock(&p->debug);
	f = p->fgrp;
	if(f == nil)
	if(f == nil){
		qunlock(&p->debug);
		return 0;
	}
	lock(f);
	if(waserror()){
		unlock(f);
		qunlock(&p->debug);
		nexterror();
	}

	qlock(&p->debug);
	lock(f);
	n = readstr(0, va, count, p->dot->name->s);
	n += snprint(va+n, count-n, "\n");
	for(i = 0; i <= f->maxfd; i++) {


@@ 560,15 575,25 @@ procread(Chan *c, void *va, long n, vlong off)
		return sizeof(Waitmsg);

	case Qns:
		if(p->pgrp == nil)
			error(Ebadusefd);
		qlock(&p->debug);
		if(waserror()){
			qunlock(&p->debug);
			nexterror();
		}
		if(p->pgrp == nil || p->pid != PID(c->qid))
			error(Eprocdied);
		mw = c->aux;
		if(mw->cddone)
		if(mw->cddone){
			qunlock(&p->debug);
			poperror();
			return 0;
		}
		mntscan(mw, p);
		if(mw->mh == 0){
			mw->cddone = 1;
			i = snprint(a, n, "cd %s\n", p->dot->name->s);
			qunlock(&p->debug);
			poperror();
			return i;
		}
		int2flag(mw->cm->flag, flag);


@@ 581,13 606,13 @@ procread(Chan *c, void *va, long n, vlong off)
		}else
			i = snprint(a, n, "bind %s %s %s\n", flag,
				mw->cm->to->name->s, mw->mh->from->name->s);
		qunlock(&p->debug);
		poperror();
		return i;

	case Qnoteid:
		return readnum(offset, va, n, p->noteid, NUMSIZE);
	case Qfd:
		if(p->fgrp == nil)
			error(Ebadusefd);
		return procfds(p, va, n, offset);
	}
	error(Egreg);


@@ 897,8 922,18 @@ procctlreq(Proc *p, char *va, int n)
		ready(p);
	}
	else
	if(strncmp(buf, "closefiles", 10) == 0)
	if(strncmp(buf, "closefiles", 10) == 0){
		qlock(&p->debug);
		if(waserror()){
			qunlock(&p->debug);
			nexterror();
		}
		if(p->fgrp == nil)
			error(Eprocdied);
		procctlfgrp(p->fgrp);
		qunlock(&p->debug);
		poperror();
	}
	else
	if(strncmp(buf, "pri", 3) == 0) {
		if(n < 4)

M port/proc.c => port/proc.c +27 -19
@@ 737,29 737,37 @@ pexit(char *exitstr, int freemem)
	long utime, stime;
	Waitq *wq, *f, *next;
	Fgrp *fgrp;
	Egrp *egrp;
	Rgrp *rgrp;
	Pgrp *pgrp;
	Chan *dot;

	up->alarm = 0;

	if(up->fgrp){
		qlock(&up->debug);
		fgrp = up->fgrp;
		up->fgrp = nil;
		closefgrp(fgrp);
		qunlock(&up->debug);
	}
	if(up->egrp){
		closeegrp(up->egrp);
		up->egrp = nil;
	}
	if(up->rgrp){
		closergrp(up->rgrp);
		up->rgrp = nil;
	}

	cclose(up->dot);
	up->dot = nil;
	closepgrp(up->pgrp);
	/* nil out all the resources under lock (free later) */
	qlock(&up->debug);
	fgrp = up->fgrp;
	up->fgrp = nil;
	egrp = up->egrp;
	up->egrp = nil;
	rgrp = up->rgrp;
	up->rgrp = nil;
	pgrp = up->pgrp;
	up->pgrp = nil;
	dot = up->dot;
	up->dot = nil;
	qunlock(&up->debug);

	if(fgrp)
		closefgrp(fgrp);
	if(egrp)
		closeegrp(egrp);
	if(rgrp)
		closergrp(rgrp);
	if(dot)
		cclose(dot);
	if(pgrp)
		closepgrp(pgrp);

	/*
	 * if not a kernel process and have a parent,