X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Fvmhtest.c;fp=uip%2Fvmhtest.c;h=0000000000000000000000000000000000000000;hp=572bad54521d786d4307e637256277977fbcb060;hb=916690191222433a6923a4be54b0d8f6ac01bd02;hpb=ecc90fb56b43863f4c33ed62da4abe898b17d7fb diff --git a/uip/vmhtest.c b/uip/vmhtest.c deleted file mode 100644 index 572bad5..0000000 --- a/uip/vmhtest.c +++ /dev/null @@ -1,324 +0,0 @@ - -/* - * vmhtest.c -- test out vmh protocol - * - * This code is Copyright (c) 2002, by the authors of nmh. See the - * COPYRIGHT file in the root directory of the nmh distribution for - * complete copyright information. - */ - -#include -#include - -static struct swit switches[] = { -#define READSW 0 - { "vmhread fd", 7 }, -#define WRITESW 1 - { "vmhwrite fd", 8 }, -#define VERSIONSW 2 - { "version", 0 }, -#define HELPSW 3 - { "help", 0 }, - { NULL, NULL } -}; - -#define NWIN 20 -static int numwins = 0; -static int windows[NWIN + 1]; - - -static int selcmds = 0; -#define selcmd() (selcmds++ % 2) - -static int selwins = 0; -#define selwin() (selwins++ % 2 ? 3 : 1) - - -int -main (int argc, char **argv) -{ - int fd1, fd2; - char *cp, buffer[BUFSIZ]; - char **argp, **arguments; - -#ifdef LOCALE - setlocale(LC_ALL, ""); -#endif - invo_name = r1bindex (argv[0], '/'); - - /* foil search of user profile/context */ - if (context_foil (NULL) == -1) - done (1); - - arguments = getarguments (invo_name, argc, argv, 0); - argp = arguments; - - while ((cp = *argp++)) - if (*cp == '-') - switch (smatch (++cp, switches)) { - case AMBIGSW: - ambigsw (cp, switches); - done (1); - case UNKWNSW: - adios (NULL, "-%s unknown", cp); - - case HELPSW: - snprintf (buffer, sizeof(buffer), "%s [switches]", invo_name); - print_help (buffer, switches, 0); - done (1); - case VERSIONSW: - print_version(invo_name); - done (1); - - case READSW: - if (!(cp = *argp++) || *cp == '-') - adios (NULL, "missing argument to %s", argp[-2]); - if ((fd1 = atoi (cp)) < 1) - adios (NULL, "bad argument %s %s", argp[-2], cp); - continue; - case WRITESW: - if (!(cp = *argp++) || *cp == '-') - adios (NULL, "missing argument to %s", argp[-2]); - if ((fd2 = atoi (cp)) < 1) - adios (NULL, "bad argument %s %s", argp[-2], cp); - continue; - } - else - adios (NULL, "usage: %s [switches]", invo_name); - - rcinit (fd1, fd2); - pINI (); - pLOOP (); - - return done (0); -} - - -static int pINI () { - int i, - vrsn; - char *bp; - struct record rcs, - *rc = &rcs; - - initrc (rc); - - switch (peer2rc (rc)) { - case RC_INI: - bp = rc->rc_data; - while (isspace (*bp)) - bp++; - if (sscanf (bp, "%d", &vrsn) != 1) { - bad_init: ; - fmt2peer (RC_ERR, "bad init \"%s\"", rc->rc_data); - done (1); - } - if (vrsn != RC_VRSN) { - fmt2peer (RC_ERR, "version %d unsupported", vrsn); - done (1); - } - - while (*bp && !isspace (*bp)) - bp++; - while (isspace (*bp)) - bp++; - if (sscanf (bp, "%d", &numwins) != 1 || numwins <= 0) - goto bad_init; - if (numwins > NWIN) - numwins = NWIN; - - for (i = 1; i <= numwins; i++) { - while (*bp && !isspace (*bp)) - bp++; - while (isspace (*bp)) - bp++; - if (sscanf (bp, "%d", &windows[i]) != 1 || windows[i] <= 0) - goto bad_init; - } - rc2peer (RC_ACK, 0, NULL); - return OK; - - case RC_XXX: - adios (NULL, "%s", rc->rc_data); - - default: - fmt2peer (RC_ERR, "pINI protocol screw-up"); - done (1); /* NOTREACHED */ - } -} - - -static int pLOOP () { - struct record rcs, - *rc = &rcs; - - initrc (rc); - - for (;;) - switch (peer2rc (rc)) { - case RC_QRY: - pQRY (rc->rc_data); - break; - - case RC_CMD: - pCMD (rc->rc_data); - break; - - case RC_FIN: - done (0); - - case RC_XXX: - adios (NULL, "%s", rc->rc_data); - - default: - fmt2peer (RC_ERR, "pLOOP protocol screw-up"); - done (1); - } -} - - -static int pQRY (str) -char *str; -{ - rc2peer (RC_EOF, 0, NULL); - return OK; -} - - -static int pCMD (str) -char *str; -{ - if ((selcmd () ? pTTY (str) : pWIN (str)) == NOTOK) - return NOTOK; - rc2peer (RC_EOF, 0, NULL); - return OK; -} - - -static int pTTY (str) -char *str; -{ - struct record rcs, - *rc = &rcs; - - initrc (rc); - - switch (rc2rc (RC_TTY, 0, NULL, rc)) { - case RC_ACK: - break; - - case RC_ERR: - return NOTOK; - - case RC_XXX: - adios (NULL, "%s", rc->rc_data); - - default: - fmt2peer (RC_ERR, "pTTY protocol screw-up"); - done (1); - } - - system (str); - - switch (rc2rc (RC_EOF, 0, NULL, rc)) { - case RC_ACK: - return OK; - - case RC_XXX: - adios (NULL, "%s", rc->rc_data);/* NOTREACHED */ - - default: - fmt2peer (RC_ERR, "pTTY protocol screw-up"); - done (1); /* NOTREACHED */ - } -} - - -static int pWIN (str) -char *str; -{ - int i, - pid, - pd[2]; - char buffer[BUFSIZ]; - struct record rcs, - *rc = &rcs; - - initrc (rc); - - snprintf (buffer, sizeof(buffer), "%d", selwin ()); - switch (str2rc (RC_WIN, buffer, rc)) { - case RC_ACK: - break; - - case RC_ERR: - return NOTOK; - - case RC_XXX: - adios (NULL, "%s", rc->rc_data); - - default: - fmt2peer (RC_ERR, "pWIN protocol screw-up"); - done (1); - } - - if (pipe (pd) == NOTOK) { - fmt2peer (RC_ERR, "no pipes"); - return NOTOK; - } - - switch (pid = vfork ()) { - case NOTOK: - fmt2peer (RC_ERR, "no forks"); - return NOTOK; - - case OK: - close (0); - open ("/dev/null", O_RDONLY); - dup2 (pd[1], 1); - dup2 (pd[1], 2); - close (pd[0]); - close (pd[1]); - execlp ("/bin/sh", "sh", "-c", str, NULL); - write (2, "no shell\n", strlen ("no shell\n")); - _exit (1); - - default: - close (pd[1]); - while ((i = read (pd[0], buffer, sizeof buffer)) > 0) - switch (rc2rc (RC_DATA, i, buffer, rc)) { - case RC_ACK: - break; - - case RC_ERR: - close (pd[0]); - pidwait (pid, OK); - return NOTOK; - - case RC_XXX: - adios (NULL, "%s", rc->rc_data); - - default: - fmt2peer (RC_ERR, "pWIN protocol screw-up"); - done (1); - } - if (i == OK) - switch (rc2rc (RC_EOF, 0, NULL, rc)) { - case RC_ACK: - break; - - case RC_XXX: - adios (NULL, "%s", rc->rc_data); - - default: - fmt2peer (RC_ERR, "pWIN protocol screw-up"); - done (1); - } - if (i == NOTOK) - fmt2peer (RC_ERR, "read from pipe lost"); - - close (pd[0]); - pidwait (pid, OK); - return (i != NOTOK ? OK : NOTOK); - } -}