|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.