M port/devcons.c => port/devcons.c +1 -1
@@ 821,7 821,7 @@ conswrite(Chan *c, void *va, long n, ulong offset)
error(Eperm);
strncpy(u->p->user, a+8, NAMELEN);
u->p->user[NAMELEN-1] = '\0';
- memmove(u->p->pgrp->crypt->key, a+NAMELEN+DESKEYLEN, DESKEYLEN);
+ memmove(u->p->pgrp->crypt->key, a+8+NAMELEN, DESKEYLEN);
break;
case Qnull:
M port/devnonet.c => port/devnonet.c +4 -1
@@ 376,7 376,10 @@ nonetwrite(Chan *c, void *a, long n, ulong offset)
* easier to do here than in nooput
*/
if(t == Sctlqid){
- strncpy(buf, a, sizeof buf);
+ if(n > sizeof buf - 1)
+ n = sizeof buf - 1;
+ strncpy(buf, a, n);
+ buf[n] = '\0';
m = getfields(buf, field, 5, ' ');
if(strcmp(field[0], "connect")==0){
if(m < 2)
M port/devscc.c => port/devscc.c +22 -1
@@ 101,10 101,16 @@ struct SCC
Rendez r; /* kproc waiting for input */
Alarm *a; /* alarm for waking the kernel process */
int kstarted; /* kproc started */
+
+ /* idiot flow control */
+ int xonoff; /* true if we obey this tradition */
+ int blocked; /* abstinence */
};
int nscc;
SCC *scc[8]; /* up to 4 8530's */
+#define CTLS 023
+#define CTLQ 021
void
onepointseven(void)
@@ 272,7 278,7 @@ sccputs(IOQ *cq, char *s, int n)
x = splhi();
lock(cq);
puts(cq, s, n);
- if(sp->printing == 0){
+ if(sp->printing == 0 && sp->blocked==0){
ch = getc(cq);
/*kprint("<start %2.2ux>", ch);*/
if(ch >= 0){
@@ 303,6 309,12 @@ sccintr0(SCC *sp, uchar x)
while(*sp->ptr&RxReady){
onepointseven();
ch = *sp->data;
+ if (ch == CTLS && sp->xonoff)
+ sp->blocked = 1;
+ else if (ch == CTLQ && sp->xonoff) {
+ sp->blocked = 0;
+ sccputs(sp->oq, "", 0);
+ }
if(cq->putc)
(*cq->putc)(cq, ch);
else
@@ 310,6 322,11 @@ sccintr0(SCC *sp, uchar x)
}
}
if(x & TxPendB){
+ if (sp->blocked) {
+ sccwrreg(sp, 0, ResTxPend);
+ sp->printing = 0;
+ return;
+ }
cq = sp->oq;
lock(cq);
ch = getc(cq);
@@ 503,6 520,10 @@ sccoput(Queue *q, Block *bp)
case 'w':
/* obsolete */
break;
+ case 'X':
+ case 'x':
+ sp->xonoff = n;
+ break;
}
}else while((m = BLEN(bp)) > 0){
while ((n = canputc(cq)) == 0){
M port/devwren.c => port/devwren.c +4 -1
@@ 185,7 185,10 @@ wrenread(Chan *c, char *a, long n, ulong offset)
long
wrenwrite(Chan *c, char *a, long n, ulong offset)
{
- return wrenio(c, 1, a, n, offset);
+ n = wrenio(c, 1, a, n, offset);
+ if(n)
+ return n;
+ error("end of device");
}
static long
M port/sysproc.c => port/sysproc.c +2 -0
@@ 478,6 478,8 @@ sysforkpgrp(ulong *arg)
if(mask & FPnamespc)
pgrpcpy(pg, u->p->pgrp);
+ else
+ *pg->crypt = *u->p->pgrp->crypt;
if(mask & FPenv)
envcpy(eg, u->p->egrp);