9 date 92.11.04.01.06.43; author jromine; state Exp;
14 date 92.11.04.01.06.15; author jromine; state Exp;
30 @/* vmhtest.c - test out vmh protocol */
32 static char ident[] = "@@(#)$Id: comp.c,v 1.6 1992/11/04 00:40:01 jromine Exp $";
36 #include "../h/vmhsbr.h"
45 static struct swit switches[] = {
60 static int numwins = 0;
61 static int windows[NWIN + 1];
64 static int selcmds = 0;
65 #define selcmd() (selcmds++ % 2)
67 static int selwins = 0;
68 #define selwin() (selwins++ % 2 ? 3 : 1)
72 main (argc, argv, envp)
86 setlocale(LC_ALL, "");
88 invo_name = r1bindex (argv[0], '/');
95 switch (smatch (++cp, switches)) {
97 ambigsw (cp, switches);
100 adios (NULLCP, "-%s unknown", cp);
102 (void) sprintf (buffer, "%s [switches]", invo_name);
103 help (buffer, switches);
107 if (!(cp = *argp++) || *cp == '-')
108 adios (NULLCP, "missing argument to %s", argp[-2]);
109 if ((fd1 = atoi (cp)) < 1)
110 adios (NULLCP, "bad argument %s %s", argp[-2], cp);
113 if (!(cp = *argp++) || *cp == '-')
114 adios (NULLCP, "missing argument to %s", argp[-2]);
115 if ((fd2 = atoi (cp)) < 1)
116 adios (NULLCP, "bad argument %s %s", argp[-2], cp);
120 adios (NULLCP, "usage: %s [switches]", invo_name);
124 (void) rcinit (fd1, fd2);
142 switch (peer2rc (rc)) {
145 while (isspace (*bp))
147 if (sscanf (bp, "%d", &vrsn) != 1) {
149 (void) fmt2peer (RC_ERR, "bad init \"%s\"", rc -> rc_data);
152 if (vrsn != RC_VRSN) {
153 (void) fmt2peer (RC_ERR, "version %d unsupported", vrsn);
157 while (*bp && !isspace (*bp))
159 while (isspace (*bp))
161 if (sscanf (bp, "%d", &numwins) != 1 || numwins <= 0)
166 for (i = 1; i <= numwins; i++) {
167 while (*bp && !isspace (*bp))
169 while (isspace (*bp))
171 if (sscanf (bp, "%d", &windows[i]) != 1 || windows[i] <= 0)
174 (void) rc2peer (RC_ACK, 0, NULLCP);
178 adios (NULLCP, "%s", rc -> rc_data);
181 (void) fmt2peer (RC_ERR, "pINI protocol screw-up");
182 done (1); /* NOTREACHED */
188 static int pLOOP () {
195 switch (peer2rc (rc)) {
197 (void) pQRY (rc -> rc_data);
201 (void) pCMD (rc -> rc_data);
208 adios (NULLCP, "%s", rc -> rc_data);
211 (void) fmt2peer (RC_ERR, "pLOOP protocol screw-up");
218 static int pQRY (str)
221 (void) rc2peer (RC_EOF, 0, NULLCP);
227 static int pCMD (str)
230 if ((selcmd () ? pTTY (str) : pWIN (str)) == NOTOK)
232 (void) rc2peer (RC_EOF, 0, NULLCP);
238 static int pTTY (str)
246 switch (rc2rc (RC_TTY, 0, NULLCP, rc)) {
254 adios (NULLCP, "%s", rc -> rc_data);
257 (void) fmt2peer (RC_ERR, "pTTY protocol screw-up");
263 switch (rc2rc (RC_EOF, 0, NULLCP, rc)) {
268 adios (NULLCP, "%s", rc -> rc_data);/* NOTREACHED */
271 (void) fmt2peer (RC_ERR, "pTTY protocol screw-up");
272 done (1); /* NOTREACHED */
278 static int pWIN (str)
290 (void) sprintf (buffer, "%d", selwin ());
291 switch (str2rc (RC_WIN, buffer, rc)) {
299 adios (NULLCP, "%s", rc -> rc_data);
302 (void) fmt2peer (RC_ERR, "pWIN protocol screw-up");
306 if (pipe (pd) == NOTOK) {
307 (void) fmt2peer (RC_ERR, "no pipes");
311 switch (pid = vfork ()) {
313 (void) fmt2peer (RC_ERR, "no forks");
318 (void) open ("/dev/null", 0);
319 (void) dup2 (pd[1], 1);
320 (void) dup2 (pd[1], 2);
321 (void) close (pd[0]);
322 (void) close (pd[1]);
323 execlp ("/bin/sh", "sh", "-c", str, NULLCP);
324 write (2, "no shell\n", strlen ("no shell\n"));
328 (void) close (pd[1]);
329 while ((i = read (pd[0], buffer, sizeof buffer)) > 0)
330 switch (rc2rc (RC_DATA, i, buffer, rc)) {
335 (void) close (pd[0]);
336 (void) pidwait (pid, OK);
340 adios (NULLCP, "%s", rc -> rc_data);
343 (void) fmt2peer (RC_ERR, "pWIN protocol screw-up");
347 switch (rc2rc (RC_EOF, 0, NULLCP, rc)) {
352 adios (NULLCP, "%s", rc -> rc_data);
355 (void) fmt2peer (RC_ERR, "pWIN protocol screw-up");
359 (void) fmt2peer (RC_ERR, "read from pipe lost");
361 (void) close (pd[0]);
362 (void) pidwait (pid, OK);
363 return (i != NOTOK ? OK : NOTOK);