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;