Annotation of 43BSD/contrib/mh/uip/vmhtest.c, revision 1.1.1.1

1.1       root        1: /* vmhtest.c - test out vmh protocol */
                      2: 
                      3: #include "../h/mh.h"
                      4: #include "../h/vmhsbr.h"
                      5: #include <ctype.h>
                      6: #include <stdio.h>
                      7: 
                      8: /*  */
                      9: 
                     10: static struct swit switches[] = {
                     11: #define        READSW  0
                     12:     "vmhread fd", 7,   
                     13: #define        WRITESW 1
                     14:     "vmhwrite fd", 8,  
                     15: 
                     16: #define        HELPSW  2
                     17:     "help", 4,         
                     18: 
                     19:     NULL, NULL
                     20: };
                     21: 
                     22: /*  */
                     23: 
                     24: #define        NWIN    20
                     25: static int     numwins = 0;
                     26: static int     windows[NWIN + 1];
                     27: 
                     28: 
                     29: static int     selcmds = 0;
                     30: #define        selcmd()        (selcmds++ % 2)
                     31: 
                     32: static int     selwins = 0;
                     33: #define        selwin()        (selwins++ % 2 ? 3 : 1)
                     34: 
                     35: /*  */
                     36: 
                     37: main (argc, argv, envp)
                     38: int     argc;
                     39: char  **argv,
                     40:       **envp;
                     41: {
                     42:     int     fd1,
                     43:             fd2;
                     44:     char   *cp,
                     45:             buffer[BUFSIZ],
                     46:           **ap,
                     47:           **argp = argv + 1,
                     48:            *arguments[MAXARGS];
                     49: 
                     50:     invo_name = r1bindex (argv[0], '/');
                     51:     m_foil (NULLCP);
                     52: 
                     53: /*  */
                     54: 
                     55:     while (cp = *argp++)
                     56:        if (*cp == '-')
                     57:            switch (smatch (++cp, switches)) {
                     58:                case AMBIGSW: 
                     59:                    ambigsw (cp, switches);
                     60:                    done (1);
                     61:                case UNKWNSW: 
                     62:                    adios (NULLCP, "-%s unknown", cp);
                     63:                case HELPSW: 
                     64:                    (void) sprintf (buffer, "%s [switches]", invo_name);
                     65:                    help (buffer, switches);
                     66:                    done (1);
                     67: 
                     68:                case READSW: 
                     69:                    if (!(cp = *argp++) || *cp == '-')
                     70:                        adios (NULLCP, "missing argument to %s", argp[-2]);
                     71:                    if ((fd1 = atoi (cp)) < 1)
                     72:                        adios (NULLCP, "bad argument %s %s", argp[-2], cp);
                     73:                    continue;
                     74:                case WRITESW: 
                     75:                    if (!(cp = *argp++) || *cp == '-')
                     76:                        adios (NULLCP, "missing argument to %s", argp[-2]);
                     77:                    if ((fd2 = atoi (cp)) < 1)
                     78:                        adios (NULLCP, "bad argument %s %s", argp[-2], cp);
                     79:                    continue;
                     80:            }
                     81:        else
                     82:            adios (NULLCP, "usage: %s [switches]", invo_name);
                     83: 
                     84: /*  */
                     85: 
                     86:     (void) rcinit (fd1, fd2);
                     87:     (void) pINI ();
                     88:     (void) pLOOP ();
                     89: 
                     90:     done (0);
                     91: }
                     92: 
                     93: /*  */
                     94: 
                     95: static int  pINI () {
                     96:     int     i,
                     97:             vrsn;
                     98:     char   *bp;
                     99:     struct record   rcs,
                    100:                    *rc = &rcs;
                    101: 
                    102:     initrc (rc);
                    103: 
                    104:     switch (peer2rc (rc)) {
                    105:        case RC_INI: 
                    106:            bp = rc -> rc_data;
                    107:            while (isspace (*bp))
                    108:                bp++;
                    109:            if (sscanf (bp, "%d", &vrsn) != 1) {
                    110:        bad_init: ;
                    111:                (void) fmt2peer (RC_ERR, "bad init \"%s\"", rc -> rc_data);
                    112:                done (1);
                    113:            }
                    114:            if (vrsn != RC_VRSN) {
                    115:                (void) fmt2peer (RC_ERR, "version %d unsupported", vrsn);
                    116:                done (1);
                    117:            }
                    118: 
                    119:            while (*bp && !isspace (*bp))
                    120:                bp++;
                    121:            while (isspace (*bp))
                    122:                bp++;
                    123:            if (sscanf (bp, "%d", &numwins) != 1 || numwins <= 0)
                    124:                goto bad_init;
                    125:            if (numwins > NWIN)
                    126:                numwins = NWIN;
                    127: 
                    128:            for (i = 1; i <= numwins; i++) {
                    129:                while (*bp && !isspace (*bp))
                    130:                    bp++;
                    131:                while (isspace (*bp))
                    132:                    bp++;
                    133:                if (sscanf (bp, "%d", &windows[i]) != 1 || windows[i] <= 0)
                    134:                    goto bad_init;
                    135:            }
                    136:            (void) rc2peer (RC_ACK, 0, NULLCP);
                    137:            return OK;
                    138: 
                    139:        case RC_XXX: 
                    140:            adios (NULLCP, "%s", rc -> rc_data);
                    141: 
                    142:        default: 
                    143:            (void) fmt2peer (RC_ERR, "pINI protocol screw-up");
                    144:            done (1);           /* NOTREACHED */
                    145:     }
                    146: }
                    147: 
                    148: /*  */
                    149: 
                    150: static int  pLOOP () {
                    151:     struct record   rcs,
                    152:                    *rc = &rcs;
                    153: 
                    154:     initrc (rc);
                    155: 
                    156:     for (;;)
                    157:        switch (peer2rc (rc)) {
                    158:            case RC_QRY: 
                    159:                (void) pQRY (rc -> rc_data);
                    160:                break;
                    161: 
                    162:            case RC_CMD: 
                    163:                (void) pCMD (rc -> rc_data);
                    164:                break;
                    165: 
                    166:            case RC_FIN: 
                    167:                done (0);
                    168: 
                    169:            case RC_XXX: 
                    170:                adios (NULLCP, "%s", rc -> rc_data);
                    171: 
                    172:            default: 
                    173:                (void) fmt2peer (RC_ERR, "pLOOP protocol screw-up");
                    174:                done (1);
                    175:        }
                    176: }
                    177: 
                    178: /*  */
                    179: 
                    180: static int  pQRY (str)
                    181: char   *str;
                    182: {
                    183:     (void) rc2peer (RC_EOF, 0, NULLCP);
                    184:     return OK;
                    185: }
                    186: 
                    187: /*  */
                    188: 
                    189: static int  pCMD (str)
                    190: char   *str;
                    191: {
                    192:     if ((selcmd () ? pTTY (str) : pWIN (str)) == NOTOK)
                    193:        return NOTOK;
                    194:     (void) rc2peer (RC_EOF, 0, NULLCP);
                    195:     return OK;
                    196: }
                    197: 
                    198: /*  */
                    199: 
                    200: static int  pTTY (str)
                    201: char   *str;
                    202: {
                    203:     struct record   rcs,
                    204:                    *rc = &rcs;
                    205: 
                    206:     initrc (rc);
                    207: 
                    208:     switch (rc2rc (RC_TTY, 0, NULLCP, rc)) {
                    209:        case RC_ACK: 
                    210:            break;
                    211: 
                    212:        case RC_ERR: 
                    213:            return NOTOK;
                    214: 
                    215:        case RC_XXX: 
                    216:            adios (NULLCP, "%s", rc -> rc_data);
                    217: 
                    218:        default: 
                    219:            (void) fmt2peer (RC_ERR, "pTTY protocol screw-up");
                    220:            done (1);
                    221:     }
                    222: 
                    223:     system (str);
                    224: 
                    225:     switch (rc2rc (RC_EOF, 0, NULLCP, rc)) {
                    226:        case RC_ACK: 
                    227:            return OK;
                    228: 
                    229:        case RC_XXX: 
                    230:            adios (NULLCP, "%s", rc -> rc_data);/* NOTREACHED */
                    231: 
                    232:        default: 
                    233:            (void) fmt2peer (RC_ERR, "pTTY protocol screw-up");
                    234:            done (1);           /* NOTREACHED */
                    235:     }
                    236: }
                    237: 
                    238: /*  */
                    239: 
                    240: static int  pWIN (str)
                    241: char   *str;
                    242: {
                    243:     int     i,
                    244:             pid,
                    245:             pd[2];
                    246:     char    buffer[BUFSIZ];
                    247:     struct record   rcs,
                    248:                    *rc = &rcs;
                    249: 
                    250:     initrc (rc);
                    251: 
                    252:     (void) sprintf (buffer, "%d", selwin ());
                    253:     switch (str2rc (RC_WIN, buffer, rc)) {
                    254:        case RC_ACK: 
                    255:            break;
                    256: 
                    257:        case RC_ERR: 
                    258:            return NOTOK;
                    259: 
                    260:        case RC_XXX: 
                    261:            adios (NULLCP, "%s", rc -> rc_data);
                    262: 
                    263:        default: 
                    264:            (void) fmt2peer (RC_ERR, "pWIN protocol screw-up");
                    265:            done (1);
                    266:     }
                    267: 
                    268:     if (pipe (pd) == NOTOK) {
                    269:        (void) fmt2peer (RC_ERR, "no pipes");
                    270:        return NOTOK;
                    271:     }
                    272: 
                    273:     switch (pid = vfork ()) {
                    274:        case NOTOK: 
                    275:            (void) fmt2peer (RC_ERR, "no forks");
                    276:            return NOTOK;
                    277: 
                    278:        case OK: 
                    279:            (void) close (0);
                    280:            (void) open ("/dev/null", 0);
                    281:            (void) dup2 (pd[1], 1);
                    282:            (void) dup2 (pd[1], 2);
                    283:            (void) close (pd[0]);
                    284:            (void) close (pd[1]);
                    285:            execlp ("/bin/sh", "sh", "-c", str, NULLCP);
                    286:            write (2, "no shell\n", strlen ("no shell\n"));
                    287:            _exit (1);
                    288: 
                    289:        default: 
                    290:            (void) close (pd[1]);
                    291:            while ((i = read (pd[0], buffer, sizeof buffer)) > 0)
                    292:                switch (rc2rc (RC_DATA, i, buffer, rc)) {
                    293:                    case RC_ACK: 
                    294:                        break;
                    295: 
                    296:                    case RC_ERR: 
                    297:                        (void) close (pd[0]);
                    298:                        (void) pidwait (pid, OK);
                    299:                        return NOTOK;
                    300: 
                    301:                    case RC_XXX: 
                    302:                        adios (NULLCP, "%s", rc -> rc_data);
                    303: 
                    304:                    default: 
                    305:                        (void) fmt2peer (RC_ERR, "pWIN protocol screw-up");
                    306:                        done (1);
                    307:                }
                    308:            if (i == OK)
                    309:                switch (rc2rc (RC_EOF, 0, NULLCP, rc)) {
                    310:                    case RC_ACK: 
                    311:                        break;
                    312: 
                    313:                    case RC_XXX: 
                    314:                        adios (NULLCP, "%s", rc -> rc_data);
                    315: 
                    316:                    default: 
                    317:                        (void) fmt2peer (RC_ERR, "pWIN protocol screw-up");
                    318:                        done (1);
                    319:                }
                    320:            if (i == NOTOK)
                    321:                (void) fmt2peer (RC_ERR, "read from pipe lost");
                    322: 
                    323:            (void) close (pd[0]);
                    324:            (void) pidwait (pid, OK);
                    325:            return (i != NOTOK ? OK : NOTOK);
                    326:     }
                    327: }

unix.superglobalmegacorp.com

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