V10/630/src/demux.c
#include <jerq.h>
#include <layer.h>
#include <jioctl.h>
#include <queue.h>
#include <tty.h>
#include "../msgs.h"
#include "jerqproc.h"
#include "pconfig.h"
#include "proto.h"
#include "packets.h"
extern struct Proc *kbdproc;
extern char *itox();
extern short scrltimeout;
int rebootflag;
demux(){
while(!rebootflag){
while(RCVQUEUE.c_cc==0)
sw(0);
precv((char)qgetc(&RCVQUEUE));
}
nap(60);
reboot();
}
reboot(){
(*(void (*)())(*(long *)0x71C010))();
}
int
recvchars(l, p, n)
int l;
char *p;
int n;
{
register struct Proc *pp;
register char *s;
register unsigned char *cp;
register int i;
if(l==0){ /* that's me!! */
doctl(p, n);
Pcdata=C_UNBLK; /* only needed for UTS */
return 0;
}
pp= &proctab[l];
if(!(pp->state&BUSY))
return 0; /* why bother? */
if((i=n)>0){
if(i>(sizeof(pp->cbuf)-pp->nchars))
return 1; /* oops! */
cp=pp->cbufpin;
s=p;
do{
pp->nchars++;
*cp++= *s++;
if(cp>=&pp->cbuf[sizeof(pp->cbuf)])
cp=pp->cbuf;
}while(--i>0);
pp->cbufpin=cp;
}
if(pp->nchars<=CBSIZE && !(pp->state&BLOCKED))
Pcdata=C_UNBLK;
else if(++pconvs[l].user>NPCBUFS) /* Inc. # of packets blocked */
pconvs[l].user=NPCBUFS;
setrun(pp);
return 0;
}
doctl(s, n)
register char *s;
{
char cmd=s[0];
register struct Proc *p= &proctab[s[1]];
extern boot(), windowproc();
extern int end;
switch(cmd){
case JEXIT&0xFF:
Psend(0, (char *)0, 0, C_EXIT);
break;
case JDELETE&0xFF:
delete(p->layer);
break;
case JTTYC:
if(n!=12){ /* sort of sizeof(struct ttycmesg) */
# ifdef DEBUG
error("JTTYC n!=sizeof ttycmesg", itox((unsigned long)n));
# endif
return;
}
copyb(&s[2], &p->ttychars, sizeof (struct ttychars));
break;
case JTIMO&0xFF:
if(n<3){
# ifdef DEBUG
error("JTIMO n!=3", itox((unsigned long)n));
# endif
return;
}
Prtimeout=s[1];
Pxtimeout=s[2];
scrltimeout=10*s[2];
if(n>3)
shellproc(s+3, n-3)
;
break;
case JBOOT&0xFF:
case JTERM&0xFF:
case JZOMBOOT&0xFF:
# ifdef DEBUG
if(n!=2){
error("doctl n!=2", itox((unsigned long)n));
return;
}
# endif
if(s[1]==0){ /* i.e. demux */
rebootflag++;
break;
}
freemem(p);
shutdown(p);
p->nchars=0;
p->cbufpout = p->cbufpin;
restart(p, cmd==(JTERM&0xFF)? windowproc : boot);
if(cmd==(JZOMBOOT&0xFF))
p->state|=ZOMBOOT;
setrun(p);
break;
default:
error("unk ctl", itox((unsigned long)cmd));
}
}
copyb(a, b, n)
register char *a, *b;
register n;
{
while(n--)
*b++=*a++;
}
#define INSET 3
static char cmd[MAXPKTDSIZE+1]; static int ncmd;
shellproc(s, n)
char *s;
{
Rectangle r;
int sendcmd(); register struct Proc *p;
r.origin.x = XMAX-9-65*9;
r.origin.y = YMAX-9-17*14;
r.corner.x = XMAX-9;
r.corner.y = YMAX-9;
copyb(s, cmd, ncmd = n);
cmd[ncmd++] = '\n';
if(p=newproc(sendcmd)){ /* Assignment = */
p->rect=inset(r, INSET);
if(p->layer=newlayer(r)){
muxnewwind(p, C_NEW);
tolayer(p->layer);
setrun(p);
}else
p->state=0;
}
}
sendcmd()
{
void sendnchars(), sendchar();
rectf((Bitmap *)P->layer, P->rect, F_STORE);
sleep(20);
sendnchars(ncmd, cmd);
delim();
sleep(20);
Uexit();
}