Annotation of researchv10no/dk/cmd/ndcon.c, revision 1.1.1.1

1.1       root        1: #include <stdio.h>
                      2: #include <dk.h>
                      3: #include <sgtty.h>
                      4: #include <sys/stream.h>
                      5: #include <errno.h>
                      6: #include <signal.h>
                      7: #include <sys/stat.h>
                      8: 
                      9: /*
                     10:  * program to connect to
                     11:  * another cpu on Datakit w/ transparent ioctls
                     12:  */
                     13: 
                     14: int     rem;            /* remote file descriptor */
                     15: extern int mesg_ld, dkp_ld;
                     16: extern errno;
                     17: extern char *dkerror;
                     18: struct sgttyb sgbuf;
                     19: char   *ttyn;
                     20: int    perms;
                     21: 
                     22: struct sigmsg {
                     23:        struct  mesg m;
                     24:        char    sig[1];
                     25: };
                     26: 
                     27: #define        msglen(mp)      ((mp)->losize + ((mp)->hisize<<8))
                     28: 
                     29: main(argc, argv)
                     30: char **argv;
                     31: {
                     32:        char *host;
                     33:        char dest[128];
                     34:        struct stat sb;
                     35:        extern int hupcatch();
                     36:        char *ttyname();
                     37: 
                     38:                while(argc > 1 && argv[1][0] == '-'){
                     39:                argv++;
                     40:                argc--;
                     41:        }
                     42:        host = argv[1];
                     43: 
                     44:        if(host==0){
                     45:                printf("usage: %s host\n", argv[0]);
                     46:                exit(1);
                     47:        }
                     48: 
                     49:        ioctl(0, TIOCGETP, &sgbuf);
                     50:        sprintf(dest, "%s.mesgdcon", host);
                     51:        rem = tdkdial(dest, 0);
                     52:         if (rem<0) {
                     53:                printf("%s: call to %s failed: %s\n", argv[0], dest, dkerror);
                     54:                 exit(1);
                     55:        }
                     56:        if(dkproto(rem, dkp_ld) < 0){
                     57:                printf("%s: can't push dk line discipline\n", argv[0]);
                     58:                exit(1);
                     59:        }
                     60:        if(tdklogin(rem) < 0){
                     61:                printf("%s: can't log in\n", argv[0]);
                     62:                exit(1);
                     63:        }
                     64:        signal(SIGHUP, hupcatch);
                     65:        signal(SIGQUIT, SIG_IGN);
                     66:        signal(SIGPIPE, SIG_IGN);
                     67:        if ((ttyn = ttyname(0)) != NULL
                     68:        &&   stat(ttyn, &sb) >= 0) {
                     69:                perms = sb.st_mode & ~S_IFMT;
                     70:                chmod(ttyn, 0);
                     71:        }
                     72:        ioctl(0, TIOCFLUSH, (char *)0); /* race with readahead still possible */
                     73:        if(ioctl(0, FIOPUSHLD, &mesg_ld) < 0){
                     74:                printf("%s: can't push mesg_ld\n", argv[0]);
                     75:                finish(1);
                     76:        }
                     77: 
                     78:        go(rem);
                     79: 
                     80:        finish(0);
                     81:        /* NOTREACHED */
                     82: }
                     83: 
                     84: go(fd)
                     85: {
                     86:        int rbits, wbits, n;
                     87:        char buf[4096+MSGHLEN];
                     88:        struct mesg *mp;
                     89: 
                     90:        mp = (struct mesg *) buf;
                     91:        wbits = 0;
                     92:        while(1){
                     93:                rbits = 1 | (1<<fd);
                     94:                if(select(20, &rbits, &wbits, 20000) < 0){
                     95:                        if(errno != EINTR)
                     96:                                return;
                     97:                        continue;
                     98:                }
                     99:                if(rbits & 1){
                    100:                        n = read(0, buf, sizeof(buf));
                    101:                        if(n <= 0)
                    102:                                return;
                    103:                        if (mp->type==M_SIGNAL
                    104:                         && ((struct sigmsg *)mp)->sig[0]==SIGQUIT) {
                    105:                                dolocal(fd, buf, n);
                    106:                                continue;
                    107:                        }
                    108:                        mp->magic = MSGMAGIC;   /* temp safety */
                    109:                        if(write(fd, buf, n) != n)
                    110:                                return;
                    111:                        if(mp->type == M_FLUSH) {
                    112:                                remflush();
                    113:                                rbits = 0;
                    114:                        }
                    115:                }
                    116:                if(rbits & (1<<fd)){
                    117:                        n = read(fd, buf, sizeof(buf));
                    118:                        if(n <= 0)
                    119:                                return;
                    120:                        if(mp->type == M_HANGUP)
                    121:                                return;
                    122:                        if(mp->type == M_IOCTL){
                    123:                                doioctl(buf, n);
                    124:                        } else {
                    125:                                mp->magic = MSGMAGIC;   /* temp safety */
                    126:                                if(write(1, buf, n) != n)
                    127:                                        return;
                    128:                        }
                    129:                }
                    130:        }
                    131: }
                    132: 
                    133: doioctl(buf, n)
                    134: char *buf;
                    135: {
                    136:        struct mesg *mp;
                    137:        struct iofoo{
                    138:                int cmd;
                    139:                union{
                    140:                        int i;
                    141:                        char errno;
                    142:                        struct insld insld;
                    143:                } u;
                    144:        } *iop;
                    145:        int cmd, ld;
                    146: 
                    147:        iop = (struct iofoo *)(buf + MSGHLEN);
                    148:        mp = (struct mesg *) buf;
                    149: 
                    150:        cmd = iop->cmd;
                    151:        n -= MSGHLEN;
                    152:        n -= sizeof(iop->cmd);
                    153:        switch(cmd){
                    154:        case FIOLOOKLD:
                    155:                if(n > 0)
                    156:                        ld = iop->u.i;
                    157:                else
                    158:                        ld = 0;
                    159:                ld++;
                    160:                if(ioctl(1, FIOLOOKLD, &ld) < 0)
                    161:                        goto bad;
                    162:                iop->cmd = ld;
                    163:                n = sizeof(iop->cmd);
                    164:                break;
                    165: 
                    166:        case FIOPOPLD:
                    167:                if(n > 0)
                    168:                        ld = iop->u.i;
                    169:                else
                    170:                        ld = 0;
                    171:                ld++;
                    172:                if(ioctl(1, FIOPOPLD, &ld) < 0)
                    173:                        goto bad;
                    174:                n = 0;
                    175:                break;
                    176: 
                    177:        case FIOPUSHLD:
                    178:                iop->u.insld.level = 0;
                    179:                /* fall through... */
                    180:        case FIOINSLD:
                    181:                iop->u.insld.level++;
                    182:                if(ioctl(1, FIOINSLD, &(iop->u.insld)) < 0)
                    183:                        goto bad;
                    184:                n = 0;
                    185:                break;
                    186: 
                    187:        default:
                    188:                mp->magic = MSGMAGIC;   /* safety */
                    189:                write(1, buf, MSGHLEN + msglen(mp));
                    190:                return;
                    191:        }
                    192:        /* locally successful */
                    193:        mp->type = M_IOCACK;
                    194:        mp->magic = MSGMAGIC;
                    195:        setmsgl(mp, n);
                    196:        write(rem, buf, MSGHLEN + msglen(mp));
                    197:        return;
                    198: bad:
                    199:        mp->type = M_IOCNAK;
                    200:        mp->magic = MSGMAGIC;
                    201:        setmsgl(mp, sizeof(struct iofoo));
                    202:        iop->u.errno = errno;
                    203:        write(rem, buf, MSGHLEN + msglen(mp));
                    204: }
                    205: 
                    206: remflush()
                    207: {
                    208:        char buf[5000];
                    209:        struct mesg *mp;
                    210:        int n;
                    211: 
                    212:        mp = (struct mesg *) buf;
                    213:        mp->type = M_IOCTL;
                    214:        setmsgl(mp, sizeof(int));
                    215:        mp->magic = MSGMAGIC;
                    216:        write(rem, buf, sizeof(struct mesg) + msglen(mp));
                    217: 
                    218:        while((n = read(rem, buf, sizeof(buf))) > 0){
                    219:                if(mp->type == M_IOCNAK || mp->type == M_IOCACK)
                    220:                        return;
                    221:        }
                    222: }
                    223: 
                    224: setmsgl(mp, n)
                    225: register struct mesg *mp;
                    226: int n;
                    227: {
                    228:        mp->losize = n;
                    229:        mp->hisize = n >> 8;
                    230: }
                    231: 
                    232: hupcatch()
                    233: {
                    234:        finish(0);
                    235: }
                    236: 
                    237: finish(sts)
                    238: {
                    239:        struct mesg m;
                    240: 
                    241:        if(ioctl(0, FIOLOOKLD, 0) == mesg_ld)
                    242:                ioctl(0, FIOPOPLD, 0);
                    243:        if (ttyn)
                    244:                chmod(ttyn, perms);
                    245:        if (sts == 0)
                    246:                printf("Eof\n");
                    247:        exit(sts);
                    248: }
                    249: 
                    250: dolocal(fp, buf, n)
                    251: char *buf;
                    252: {
                    253:        char lbuf[128+1];
                    254:        register char *lp;
                    255:        struct sgttyb nsgbuf;
                    256:        register struct mesg *mp = (struct mesg *)buf;
                    257: 
                    258:        ioctl(0, FIOPOPLD, (char *)0);
                    259:        ioctl(0, TIOCFLUSH, (char *)0);
                    260:        ioctl(0, TIOCGETP, &nsgbuf);
                    261:        ioctl(0, TIOCSETP, &sgbuf);
                    262:        chmod(ttyn, perms);
                    263:        for (;;) {
                    264:                lp = lbuf;
                    265:                printf( "dcon>> ");
                    266:                fflush(stdout);
                    267:                while (lp < &lbuf[128] && read(0, lp, 1)>0 && *lp!='\n')
                    268:                        lp++;
                    269:                *lp = '\0';
                    270:                if (*lbuf=='i')
                    271:                        break;
                    272:                else if (*lbuf=='q'||*lbuf=='x'||*lbuf=='.')
                    273:                        exit(0);
                    274:                else if (*lbuf=='!') {
                    275:                        system(lbuf+1);
                    276:                        printf("!!\n");
                    277:                        fflush(stdout);
                    278:                        mp->type = 0;
                    279:                        break;
                    280:                } else if (*lbuf=='\0') {
                    281:                        mp->type = 0;
                    282:                        break;
                    283:                } else {
                    284:                        printf("[qx.] to exit, i for quit signal, !cmd for shell\n");
                    285:                        fflush(stdout);
                    286:                }
                    287:        }
                    288:        ioctl(0, TIOCSETP, &nsgbuf);
                    289:        ioctl(0, FIOPUSHLD, &mesg_ld);
                    290:        chmod(ttyn, 0);
                    291:        if (mp->type) {
                    292:                mp->magic = MSGMAGIC;   /* safety */
                    293:                write(fp, buf, n);
                    294:        }
                    295: }

unix.superglobalmegacorp.com

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