~kris/9p

9hist

b7ea96cf198d50dd3ca528b2fd280f74e1b72015 — David du Colombier 34 years ago f339d31
Plan 9 from Bell Labs 1992-05-29
4 files changed, 104 insertions(+), 21 deletions(-)

M pc/devvga.c
M port/devip.c
M port/stream.c
M port/tcpif.c
M pc/devvga.c => pc/devvga.c +1 -19
@@ 27,8 27,7 @@ enum {
	Qvgasize=	2,
	Qvgatype=	3,
	Qvgaport=	4,
	Qvgaiport=	5,
	Nvga=		5,
	Nvga=		4,
};

Dirtab vgadir[]={


@@ 36,7 35,6 @@ Dirtab vgadir[]={
	"vgatype",	{Qvgatype},	0,		0666,
	"vgasize",	{Qvgasize},	0,		0666,
	"vgaport",	{Qvgaport},	0,		0666,
	"vgaiport",	{Qvgaiport},	0,		0666,
};

/* a routine from ../port/devcons.c */


@@ 141,8 139,6 @@ vgaread(Chan *c, void *buf, long n, ulong offset)
		for (port=offset; port<offset+n; port++)
			*cp++ = inb(port);
		return n;
	case Qvgaiport:
		error(Eio);
	}
}



@@ 174,20 170,6 @@ vgawrite(Chan *c, void *buf, long n, ulong offset)
		for (port=offset; port<offset+n; port++)
			outb(port, *cp++);
		return n;
	case Qvgaiport:
		port = offset / 256;
		switch (port) {
		case EMISCW:	outfunc = genout;	break;
		case SRX:	outfunc = srout;	break;
		case GRX:	outfunc = grout;	break;
		case ARW:	outfunc = arout;	break;
		case CRX:	outfunc = crout;	break;
		default:
			error(Ebadarg);
		}
		for (i = offset%256; i < (offset%256) + n; i++)
			outfunc(i, *cp++);
		return n;
	}
}


M port/devip.c => port/devip.c +100 -0
@@ 38,10 38,16 @@ void	iliput(Queue *, Block *);
void	iloput(Queue *, Block *);
void	ilopen(Queue *, Stream *);
void	ilclose(Queue *);
/* BSD authentication Protocol checker */
void	bsdiput(Queue *, Block *);
void	bsdoput(Queue *, Block *);
void	bsdopen(Queue *, Stream *);
void	bsdclose(Queue *);

Qinfo tcpinfo = { tcpstiput, tcpstoput, tcpstopen, tcpstclose, "tcp", 0, 1 };
Qinfo udpinfo = { udpstiput, udpstoput, udpstopen, udpstclose, "udp" };
Qinfo ilinfo  = { iliput,    iloput,    ilopen,    ilclose,    "il"  };
Qinfo bsdinfo = { bsdiput,   bsdoput,	bsdopen,   bsdclose,   "bsd", 0, 1 };

Qinfo *protocols[] = { &tcpinfo, &udpinfo, &ilinfo, 0 };



@@ 274,6 280,18 @@ ipwrite(Chan *c, char *a, long n, ulong offset)
		else if(cp->stproto == &ilinfo)
			ilstart(cp, IL_ACTIVE, 20);

		/*
		 *  stupid hack for BSD port's 512, 513, & 514
		 *  to make it harder for user to lie about his
		 *  identity. -- presotto
		 */
		switch(cp->pdst){
		case 512:
		case 513:
		case 514:
			pushq(c->stream, &bsdinfo);
			break;
		}
	}
	else if(strcmp(field[0], "disconnect") == 0) {
		if(cp->stproto != &udpinfo)


@@ 986,3 1004,85 @@ ip_conn(Ipconv *ic, Port dst, Port src, Ipaddr dest, char proto)

	return 0;
}

/*
 *  Fuck me sideways with a bargepole!!! -- philw
 *
 *  BSD authentication protocol, used on ports 512, 513, & 514.
 *  This makes sure that a user can only write the REAL user id.
 *
 *  q->ptr is number of nulls seen
 */
void
bsdopen(Queue *q, Stream *s)
{
	RD(q)->ptr = q;
	WR(q)->ptr = q;
}
void
bsdclose(Queue *q)
{
	Block *bp;

	bp = allocb(0);
	bp->type = M_HANGUP;
	PUTNEXT(q->other, bp);
}
void
bsdiput(Queue *q, Block *bp)
{
	PUTNEXT(q, bp);
}
void
bsdoput(Queue *q, Block *bp)
{
	uchar *luser;
	uchar *p;
	Block *nbp;
	int n;

	/* just pass it on if we've done authentication */
	if(q->ptr == 0 || bp->type != M_DATA){
		PUTNEXT(q, bp);
		return;
	}

	/* collect into a single block */
	lock(q);
	if(q->first == 0)
		q->first = pullup(bp, blen(bp));
	else{
		nbp = q->first;
		nbp->next = bp;
		q->first = pullup(nbp, blen(nbp));
	}
	bp = q->first;
	if(bp == 0){
		unlock(q);
		bsdclose(q);
		return;
	}

	/* look for 2 nulls to indicate stderr port and local user */
	luser = memchr(bp->rptr, 0, BLEN(bp));
	if(luser == 0){
		unlock(q);
		return;
	}
	luser++;
	if(memchr(luser, 0, bp->wptr - luser) == 0){
		unlock(q);
		return;
	}

	/* if luser is a lie, hangup */
	if(memcmp(luser, u->p->user, strlen(u->p->user)+1) != 0)
		bsdclose(q);

	/* mark queue as authenticated and pass data to remote side */
	q->ptr = 0;
	q->first = 0;
	bp->flags |= S_DELIM;
	PUTNEXT(q, bp);
	unlock(q);
}

M port/stream.c => port/stream.c +2 -2
@@ 604,7 604,7 @@ pullup(Block *bp, int n)
	n -= BLEN(bp);
	while(nbp = bp->next){
		i = BLEN(nbp);
		if(i > n) {
		if(i >= n) {
			memmove(bp->wptr, nbp->rptr, n);
			bp->wptr += n;
			nbp->rptr += n;


@@ 622,7 622,7 @@ pullup(Block *bp, int n)
}

/*
 *  expand a block list to be one byte, len bytes long
 *  expand a block list to be one block, len bytes long
 */
Block*
expandb(Block *bp, int len)

M port/tcpif.c => port/tcpif.c +1 -0
@@ 72,6 72,7 @@ void
tcpstart(Ipconv *s, int mode, ushort window, char tos)
{
	Tcpctl *tcb = &s->tcpctl;
	char msg[NAMELEN+2];

	if(tcb->state != Closed)
		return;