Added all of the MH sources, including RCS files, in
[mmh] / 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 @