Annotation of researchv9/jerq/src/mux/term/demux.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.