|
|
1.1 root 1: #include <jerq.h>
2: #include <layer.h>
3: #include <jioctl.h>
4: #include <queue.h>
5: #include <tty.h>
6: #include "../msgs.h"
7: #include "jerqproc.h"
8: #include "pconfig.h"
9: #include "proto.h"
10: #include "packets.h"
11:
12: extern struct Proc *kbdproc;
13: extern char *itox();
14: extern short scrltimeout;
15: int rebootflag;
16:
17: demux(){
18: while(!rebootflag){
19: while(RCVQUEUE.c_cc==0)
20: sw(0);
21: precv((char)qgetc(&RCVQUEUE));
22: }
23: nap(60);
24: reboot();
25: }
26:
27: reboot(){
28: (*(void (*)())(*(long *)0x71C010))();
29: }
30: int
31: recvchars(l, p, n)
32: int l;
33: char *p;
34: int n;
35: {
36: register struct Proc *pp;
37: register char *s;
38: register unsigned char *cp;
39: register int i;
40:
41: if(l==0){ /* that's me!! */
42: doctl(p, n);
43: Pcdata=C_UNBLK; /* only needed for UTS */
44: return 0;
45: }
46: pp= &proctab[l];
47: if(!(pp->state&BUSY))
48: return 0; /* why bother? */
49: if((i=n)>0){
50: if(i>(sizeof(pp->cbuf)-pp->nchars))
51: return 1; /* oops! */
52: cp=pp->cbufpin;
53: s=p;
54: do{
55: pp->nchars++;
56: *cp++= *s++;
57: if(cp>=&pp->cbuf[sizeof(pp->cbuf)])
58: cp=pp->cbuf;
59: }while(--i>0);
60: pp->cbufpin=cp;
61: }
62: if(pp->nchars<=CBSIZE && !(pp->state&BLOCKED))
63: Pcdata=C_UNBLK;
64: else if(++pconvs[l].user>NPCBUFS) /* Inc. # of packets blocked */
65: pconvs[l].user=NPCBUFS;
66: setrun(pp);
67: return 0;
68: }
69:
70: doctl(s, n)
71: register char *s;
72: {
73: char cmd=s[0];
74: register struct Proc *p= &proctab[s[1]];
75: extern boot(), windowproc();
76: extern int end;
77:
78: switch(cmd){
79: case JEXIT&0xFF:
80: Psend(0, (char *)0, 0, C_EXIT);
81: break;
82: case JDELETE&0xFF:
83: delete(p->layer);
84: break;
85: case JTTYC:
86: if(n!=12){ /* sort of sizeof(struct ttycmesg) */
87: # ifdef DEBUG
88: error("JTTYC n!=sizeof ttycmesg", itox((unsigned long)n));
89: # endif
90: return;
91: }
92: copyb(&s[2], &p->ttychars, sizeof (struct ttychars));
93: break;
94: case JTIMO&0xFF:
95: if(n<3){
96: # ifdef DEBUG
97: error("JTIMO n!=3", itox((unsigned long)n));
98: # endif
99: return;
100: }
101: Prtimeout=s[1];
102: Pxtimeout=s[2];
103: scrltimeout=10*s[2];
104: if(n>3)
105: shellproc(s+3, n-3)
;
106: break;
107: case JBOOT&0xFF:
108: case JTERM&0xFF:
109: case JZOMBOOT&0xFF:
110: # ifdef DEBUG
111: if(n!=2){
112: error("doctl n!=2", itox((unsigned long)n));
113: return;
114: }
115: # endif
116: if(s[1]==0){ /* i.e. demux */
117: rebootflag++;
118: break;
119: }
120: freemem(p);
121: shutdown(p);
122: p->nchars=0;
123: p->cbufpout = p->cbufpin;
124: restart(p, cmd==(JTERM&0xFF)? windowproc : boot);
125: if(cmd==(JZOMBOOT&0xFF))
126: p->state|=ZOMBOOT;
127: setrun(p);
128: break;
129: default:
130: error("unk ctl", itox((unsigned long)cmd));
131: }
132: }
133: copyb(a, b, n)
134: register char *a, *b;
135: register n;
136: {
137: while(n--)
138: *b++=*a++;
139: }
140:
141: #define INSET 3
142:
143: static char cmd[MAXPKTDSIZE+1]; static int ncmd;
144:
145: shellproc(s, n)
146: char *s;
147: {
148: Rectangle r;
149: int sendcmd(); register struct Proc *p;
150:
151: r.origin.x = XMAX-9-65*9;
152: r.origin.y = YMAX-9-17*14;
153: r.corner.x = XMAX-9;
154: r.corner.y = YMAX-9;
155:
156: copyb(s, cmd, ncmd = n);
157: cmd[ncmd++] = '\n';
158:
159: if(p=newproc(sendcmd)){ /* Assignment = */
160: p->rect=inset(r, INSET);
161: if(p->layer=newlayer(r)){
162: muxnewwind(p, C_NEW);
163: tolayer(p->layer);
164: setrun(p);
165: }else
166: p->state=0;
167: }
168: }
169: sendcmd()
170: {
171: void sendnchars(), sendchar();
172: rectf((Bitmap *)P->layer, P->rect, F_STORE);
173: sleep(20);
174: sendnchars(ncmd, cmd);
175: delim();
176: sleep(20);
177: Uexit();
178: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.