]> diplodocus.org Git - nmh/blob - docs/historical/mh-6.8.5/uip/RCS/vmhtest.c,v
sbr/mts.c: Delete mmdlm2; use same-valued mmdlm1 instead.
[nmh] / docs / historical / mh-6.8.5 / uip / RCS / vmhtest.c,v
1 head 1.2;
2 access;
3 symbols;
4 locks; strict;
5 comment @ * @;
6
7
8 1.2
9 date 92.11.04.01.06.43; author jromine; state Exp;
10 branches;
11 next 1.1;
12
13 1.1
14 date 92.11.04.01.06.15; author jromine; state Exp;
15 branches;
16 next ;
17
18
19 desc
20 @vmhtest
21 @
22
23
24 1.2
25 log
26 @Add ID
27 LOCALE
28 @
29 text
30 @/* vmhtest.c - test out vmh protocol */
31 #ifndef lint
32 static char ident[] = "@@(#)$Id: comp.c,v 1.6 1992/11/04 00:40:01 jromine Exp $";
33 #endif lint
34
35 #include "../h/mh.h"
36 #include "../h/vmhsbr.h"
37 #include <ctype.h>
38 #include <stdio.h>
39 #ifdef LOCALE
40 #include <locale.h>
41 #endif
42
43 /* \f */
44
45 static struct swit switches[] = {
46 #define READSW 0
47 "vmhread fd", 7,
48 #define WRITESW 1
49 "vmhwrite fd", 8,
50
51 #define HELPSW 2
52 "help", 4,
53
54 NULL, NULL
55 };
56
57 /* \f */
58
59 #define NWIN 20
60 static int numwins = 0;
61 static int windows[NWIN + 1];
62
63
64 static int selcmds = 0;
65 #define selcmd() (selcmds++ % 2)
66
67 static int selwins = 0;
68 #define selwin() (selwins++ % 2 ? 3 : 1)
69
70 /* \f */
71
72 main (argc, argv, envp)
73 int argc;
74 char **argv,
75 **envp;
76 {
77 int fd1,
78 fd2;
79 char *cp,
80 buffer[BUFSIZ],
81 **ap,
82 **argp = argv + 1,
83 *arguments[MAXARGS];
84
85 #ifdef LOCALE
86 setlocale(LC_ALL, "");
87 #endif
88 invo_name = r1bindex (argv[0], '/');
89 m_foil (NULLCP);
90
91 /* \f */
92
93 while (cp = *argp++)
94 if (*cp == '-')
95 switch (smatch (++cp, switches)) {
96 case AMBIGSW:
97 ambigsw (cp, switches);
98 done (1);
99 case UNKWNSW:
100 adios (NULLCP, "-%s unknown", cp);
101 case HELPSW:
102 (void) sprintf (buffer, "%s [switches]", invo_name);
103 help (buffer, switches);
104 done (1);
105
106 case READSW:
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);
111 continue;
112 case WRITESW:
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);
117 continue;
118 }
119 else
120 adios (NULLCP, "usage: %s [switches]", invo_name);
121
122 /* \f */
123
124 (void) rcinit (fd1, fd2);
125 (void) pINI ();
126 (void) pLOOP ();
127
128 done (0);
129 }
130
131 /* \f */
132
133 static int pINI () {
134 int i,
135 vrsn;
136 char *bp;
137 struct record rcs,
138 *rc = &rcs;
139
140 initrc (rc);
141
142 switch (peer2rc (rc)) {
143 case RC_INI:
144 bp = rc -> rc_data;
145 while (isspace (*bp))
146 bp++;
147 if (sscanf (bp, "%d", &vrsn) != 1) {
148 bad_init: ;
149 (void) fmt2peer (RC_ERR, "bad init \"%s\"", rc -> rc_data);
150 done (1);
151 }
152 if (vrsn != RC_VRSN) {
153 (void) fmt2peer (RC_ERR, "version %d unsupported", vrsn);
154 done (1);
155 }
156
157 while (*bp && !isspace (*bp))
158 bp++;
159 while (isspace (*bp))
160 bp++;
161 if (sscanf (bp, "%d", &numwins) != 1 || numwins <= 0)
162 goto bad_init;
163 if (numwins > NWIN)
164 numwins = NWIN;
165
166 for (i = 1; i <= numwins; i++) {
167 while (*bp && !isspace (*bp))
168 bp++;
169 while (isspace (*bp))
170 bp++;
171 if (sscanf (bp, "%d", &windows[i]) != 1 || windows[i] <= 0)
172 goto bad_init;
173 }
174 (void) rc2peer (RC_ACK, 0, NULLCP);
175 return OK;
176
177 case RC_XXX:
178 adios (NULLCP, "%s", rc -> rc_data);
179
180 default:
181 (void) fmt2peer (RC_ERR, "pINI protocol screw-up");
182 done (1); /* NOTREACHED */
183 }
184 }
185
186 /* \f */
187
188 static int pLOOP () {
189 struct record rcs,
190 *rc = &rcs;
191
192 initrc (rc);
193
194 for (;;)
195 switch (peer2rc (rc)) {
196 case RC_QRY:
197 (void) pQRY (rc -> rc_data);
198 break;
199
200 case RC_CMD:
201 (void) pCMD (rc -> rc_data);
202 break;
203
204 case RC_FIN:
205 done (0);
206
207 case RC_XXX:
208 adios (NULLCP, "%s", rc -> rc_data);
209
210 default:
211 (void) fmt2peer (RC_ERR, "pLOOP protocol screw-up");
212 done (1);
213 }
214 }
215
216 /* \f */
217
218 static int pQRY (str)
219 char *str;
220 {
221 (void) rc2peer (RC_EOF, 0, NULLCP);
222 return OK;
223 }
224
225 /* \f */
226
227 static int pCMD (str)
228 char *str;
229 {
230 if ((selcmd () ? pTTY (str) : pWIN (str)) == NOTOK)
231 return NOTOK;
232 (void) rc2peer (RC_EOF, 0, NULLCP);
233 return OK;
234 }
235
236 /* \f */
237
238 static int pTTY (str)
239 char *str;
240 {
241 struct record rcs,
242 *rc = &rcs;
243
244 initrc (rc);
245
246 switch (rc2rc (RC_TTY, 0, NULLCP, rc)) {
247 case RC_ACK:
248 break;
249
250 case RC_ERR:
251 return NOTOK;
252
253 case RC_XXX:
254 adios (NULLCP, "%s", rc -> rc_data);
255
256 default:
257 (void) fmt2peer (RC_ERR, "pTTY protocol screw-up");
258 done (1);
259 }
260
261 system (str);
262
263 switch (rc2rc (RC_EOF, 0, NULLCP, rc)) {
264 case RC_ACK:
265 return OK;
266
267 case RC_XXX:
268 adios (NULLCP, "%s", rc -> rc_data);/* NOTREACHED */
269
270 default:
271 (void) fmt2peer (RC_ERR, "pTTY protocol screw-up");
272 done (1); /* NOTREACHED */
273 }
274 }
275
276 /* \f */
277
278 static int pWIN (str)
279 char *str;
280 {
281 int i,
282 pid,
283 pd[2];
284 char buffer[BUFSIZ];
285 struct record rcs,
286 *rc = &rcs;
287
288 initrc (rc);
289
290 (void) sprintf (buffer, "%d", selwin ());
291 switch (str2rc (RC_WIN, buffer, rc)) {
292 case RC_ACK:
293 break;
294
295 case RC_ERR:
296 return NOTOK;
297
298 case RC_XXX:
299 adios (NULLCP, "%s", rc -> rc_data);
300
301 default:
302 (void) fmt2peer (RC_ERR, "pWIN protocol screw-up");
303 done (1);
304 }
305
306 if (pipe (pd) == NOTOK) {
307 (void) fmt2peer (RC_ERR, "no pipes");
308 return NOTOK;
309 }
310
311 switch (pid = vfork ()) {
312 case NOTOK:
313 (void) fmt2peer (RC_ERR, "no forks");
314 return NOTOK;
315
316 case OK:
317 (void) close (0);
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"));
325 _exit (1);
326
327 default:
328 (void) close (pd[1]);
329 while ((i = read (pd[0], buffer, sizeof buffer)) > 0)
330 switch (rc2rc (RC_DATA, i, buffer, rc)) {
331 case RC_ACK:
332 break;
333
334 case RC_ERR:
335 (void) close (pd[0]);
336 (void) pidwait (pid, OK);
337 return NOTOK;
338
339 case RC_XXX:
340 adios (NULLCP, "%s", rc -> rc_data);
341
342 default:
343 (void) fmt2peer (RC_ERR, "pWIN protocol screw-up");
344 done (1);
345 }
346 if (i == OK)
347 switch (rc2rc (RC_EOF, 0, NULLCP, rc)) {
348 case RC_ACK:
349 break;
350
351 case RC_XXX:
352 adios (NULLCP, "%s", rc -> rc_data);
353
354 default:
355 (void) fmt2peer (RC_ERR, "pWIN protocol screw-up");
356 done (1);
357 }
358 if (i == NOTOK)
359 (void) fmt2peer (RC_ERR, "read from pipe lost");
360
361 (void) close (pd[0]);
362 (void) pidwait (pid, OK);
363 return (i != NOTOK ? OK : NOTOK);
364 }
365 }
366 @
367
368
369 1.1
370 log
371 @Initial revision
372 @
373 text
374 @d2 3
375 d10 3
376 d56 3
377 @