|
|
1.1 root 1: /* pipe.c - Dish shell command handler */
2:
3: #ifndef lint
4: static char *rcsid = "$Header: /f/osi/others/quipu/uips/dish/RCS/pipe.c,v 7.1 90/03/15 11:20:36 mrose Exp $";
5: #endif
6:
7: /*
8: * $Header: /f/osi/others/quipu/uips/dish/RCS/pipe.c,v 7.1 90/03/15 11:20:36 mrose Exp $
9: *
10: *
11: * $Log: pipe.c,v $
12: * Revision 7.1 90/03/15 11:20:36 mrose
13: * quipu-sync
14: *
15: * Revision 7.0 89/11/23 22:08:32 mrose
16: * Release 6.0
17: *
18: */
19:
20: /*
21: * NOTICE
22: *
23: * Acquisition, use, and distribution of this module and related
24: * materials are subject to the restrictions of a license agreement.
25: * Consult the Preface in the User's Manual for the full terms of
26: * this agreement.
27: *
28: */
29:
30:
31: #include <stdio.h>
32: #include "quipu/util.h"
33: #include "tailor.h"
34: #include "general.h"
35: #include "usr.dirent.h"
36:
37: extern int errno;
38:
39: #ifdef SOCKETS /* USE INTERNET SOCKETS */
40:
41: #include "internet.h"
42:
43: main(argc,argv)
44: int argc;
45: char *argv[];
46: {
47: int sd,res;
48: struct sockaddr_in sin_buf;
49: struct sockaddr_in * sin = &sin_buf;
50: char buffer [BUFSIZ];
51: char dishname [BUFSIZ];
52: char * ptr;
53:
54: isodetailor (argv[0], 1);
55:
56: if ((sd = start_tcp_client ((struct sockaddr_in *) 0, 0)) == NOTOK) {
57: perror("start_tcp_client");
58: exit(-20);
59: }
60:
61: if (get_dish_sock (sin, 0) != 0)
62: exit (-21);
63:
64: if (join_tcp_server (sd, sin) == NOTOK) {
65: int pid;
66: (void) close_tcp_socket (sd);
67:
68: fork_again: ;
69: switch (pid = vfork ()) {
70: case 0:
71: /* child */
72: (void) close_tcp_socket (sd);
73: (void) strcpy (dishname,
74: _isodefile (isodebinpath, "dish"));
75: {
76: int i, nfds = getdtablesize ();
77:
78: for (i = fileno(stderr) + 1; i < nfds; i++)
79: (void) close (i);
80: }
81: execl (dishname, "dish","-pipe",NULLCP);
82: (void) fprintf (stderr, "unable to exec ");
83: perror (dishname);
84: _exit (-21);
85: case -1:
86: perror ("fork");
87: (void) close_tcp_socket (sd);
88: exit (-22);
89: default:
90: /* parent */
91: for (;;) {
92: if ((sd = start_tcp_client ((struct sockaddr_in *) 0,
93: 0)) == NOTOK) {
94: perror("start_tcp_client");
95: exit(-23);
96: }
97: if (join_tcp_server (sd, sin) != NOTOK)
98: break;
99:
100: /* need to introduce a timeout !!! */
101: (void) close_tcp_socket (sd);
102:
103: sleep (5);
104:
105: if (kill (pid, 0) == NOTOK) {
106: (void) fprintf (stderr,"Trying again...\n");
107: goto fork_again;
108: }
109: }
110: break;
111: }
112: }
113:
114: if ((ptr = rindex (argv[0], '/')) == NULLCP)
115: (void) strcpy (buffer,argv[0]);
116: else
117: (void) strcpy (buffer,++ptr);
118:
119: argc--,argv++;
120:
121: while (argc--) {
122: (void) strcat (buffer, " \"");
123: (void) strcat (buffer, *argv++);
124: (void) strcat (buffer, "\"");
125: }
126:
127: if (send(sd, buffer, strlen(buffer), 0) == -1) {
128: perror("send");
129: (void) close_tcp_socket (sd);
130: exit (-25);
131: }
132:
133: for (;;) {
134: if ((res = recv(sd, buffer, BUFSIZ - 1, 0)) == -1) {
135: perror ("recv");
136: (void) close_tcp_socket (sd);
137: exit (-26);
138: }
139: *(buffer + res) = 0;
140: if (res == 0) {
141: (void) close_tcp_socket (sd);
142: exit (0);
143: }
144:
145: if (*buffer == '2') {
146: if (res > 1)
147: (void) write (2,&buffer[1],--res);
148: while ( (res = recv(sd, buffer, BUFSIZ, 0)) > 0)
149: (void) write (2,buffer,res);
150: (void) close_tcp_socket (sd);
151: exit (1);
152: } else if ((*buffer == '1') || (*buffer == '3')) {
153: int eval;
154: eval = (*buffer == '1' ? 0 : 2);
155: if (res > 1)
156: (void) write (1,&buffer[1],--res);
157: while ( (res = recv(sd, buffer, BUFSIZ, 0)) > 0)
158: (void) write (1,buffer,res);
159: (void) close_tcp_socket (sd);
160: exit (eval);
161: } else { /* 'e', 'y', or 'p' */
162: char where[BUFSIZ];
163:
164: if (*buffer == 'e') {
165: if (system (&buffer[1]))
166: (void) strcpy (where, "e");
167: else
168: (void) getcwd (where, sizeof where);
169: } else if (*buffer == 'y') {
170: (void) fprintf (stderr,"%s",buffer + 1);
171: (void) fgets (where, sizeof where, stdin);
172: } else {
173: (void) sprintf (where,
174: "Enter password for \"%s\": ",
175: buffer + 1);
176: (void) strcpy (where, getpassword (where));
177: }
178:
179: if (send(sd, where, strlen(where), 0) == -1) {
180: perror("send");
181: (void) close_tcp_socket (sd);
182: exit (-27);
183: }
184:
185: }
186:
187: }
188: }
189:
190:
191: #else /* USE UNIX NAMED PIPES */
192:
193: #include <signal.h>
194: #include <fcntl.h>
195: #include <sys/types.h>
196: #include <sys/stat.h>
197:
198: char retfile[BUFSIZ];
199: int fd;
200: int wfd;
201:
202: main (argc, argv)
203: int argc;
204: char **argv;
205: {
206: int res;
207: char buffer[BUFSIZ];
208: char sendfile[BUFSIZ];
209: char dishname[BUFSIZ];
210: int i;
211: char *ptr, *getenv(), *sprintf(), *getpassword ();
212: void pipe_quit ();
213:
214:
215: (void) umask (0);
216: (void) sprintf (retfile, "/tmp/dish%d", getpid ());
217: if ((ptr = getenv ("DISHPROC")) == NULLCP) {
218: (void) sprintf (sendfile, "/tmp/dish-%d", getppid ());
219: (void) setenv ("DISHPROC", sendfile);
220: }
221: else
222: (void) strcpy (sendfile, ptr);
223:
224: setbuf (stdout,NULLCP);
225: setbuf (stderr,NULLCP);
226:
227: if (mknod (retfile, S_IFIFO | 0600, 0) == -1) {
228: (void) fprintf (stderr,"Can't create pipe '%s'\n",retfile);
229: exit (-12);
230: }
231:
232: for (i = 1; i <= 15; i++)
233: (void) signal (i, pipe_quit);
234:
235: if ((fd = open (sendfile, O_WRONLY | O_NDELAY)) == -1) {
236: (void) fprintf (stderr, "(Dish starting)\n");
237: if (mknod (sendfile, S_IFIFO | 0600, 0) == -1) {
238: (void) fprintf (stderr,"Can't create pipe '%s'\n",sendfile);
239: exit (-11);
240: }
241: (void) strcpy (dishname, _isodefile (isodebinpath, "dish"));
242: if (vfork () == 0) {
243: /* child */
244: execl (dishname, "dish","-pipe",NULLCP);
245: (void) fprintf (stderr, "unable to exec ");
246: perror (dishname);
247: (void) unlink (retfile);
248: _exit (-2);
249: } else {
250: fd = open (sendfile, O_WRONLY);
251: setbuf (stderr,NULLCP);
252: }
253: }
254: argc--;
255: if ((ptr = rindex (argv[0], '/')) == NULLCP)
256: (void) sprintf (buffer, "%s:%s", retfile, argv[0]);
257: else
258: (void) sprintf (buffer, "%s:%s", retfile, ++ptr);
259: argv++;
260:
261: while (argc--) {
262: (void) strcat (buffer, " \"");
263: (void) strcat (buffer, *argv++);
264: (void) strcat (buffer, "\"");
265: }
266:
267: if ((res = write (fd, buffer, strlen (buffer))) == -1) {
268: (void) fprintf (stderr, "Write to DUA failed... Please retry\n");
269: (void) close (fd);
270: (void) unlink (retfile);
271: exit (-3);
272: }
273: (void) close (fd);
274:
275: /* get results */
276: if ((fd = open (retfile, O_RDONLY)) < 0) {
277: (void) fprintf (stderr, "Can't read results\n");
278: (void) unlink (retfile);
279: exit (-4);
280: }
281:
282: if ((wfd = open (retfile, O_WRONLY)) < 0) {
283: (void) fprintf (stderr, "Can't lock results failed\n");
284: (void) unlink (retfile);
285: (void) close (fd);
286: exit (-5);
287: }
288:
289: for (;;) {
290: if ((res = read (fd, buffer, BUFSIZ - 1)) == -1) {
291: (void) fprintf (stderr, "Read failed (%d)\n", errno);
292: (void) unlink (retfile);
293: (void) close (fd);
294: (void) close (wfd);
295: exit (-6);
296: }
297: *(buffer + res) = 0;
298:
299: if (*buffer == '2') {
300: (void) write (2,&buffer[1],--res);
301: while ( (res = read (fd, buffer, BUFSIZ)) > 0)
302: (void) write (2,buffer,res);
303: (void) close (fd);
304: (void) close (wfd);
305: (void) unlink (retfile);
306: exit (-1);
307: } else if ((*buffer == '1') || (*buffer == '3')) {
308: int eval;
309: eval = (*buffer == '1' ? 0 : 2);
310: (void) write (1,&buffer[1],--res);
311: while ( (res = read (fd, buffer, BUFSIZ)) > 0)
312: (void) write (1,buffer,res);
313: (void) close (fd);
314: (void) close (wfd);
315: (void) unlink (retfile);
316: exit (eval);
317: else { /* 'e', 'y' or 'p' */
318: int res2,
319: nfd;
320: char where[BUFSIZ];
321:
322: if (*buffer == 'e') {
323: (void) getwd (where);
324: (void) system (&buffer[1]);
325: } else if (*buffer == 'y') {
326: (void) fprintf (stderr,"%s",buffer + 1);
327: (void) fgets (where, sizeof where, stdin);
328: } else {
329: (void) sprintf (where,
330: "Enter password for \"%s\": ",
331: buffer + 1);
332: (void) strcpy (where, getpassword (where));
333: }
334:
335:
336: if ((nfd = open (sendfile, O_WRONLY)) == -1) {
337: (void) fprintf (stderr, "re-write open error\n");
338: (void) close (wfd);
339: (void) close (fd);
340: (void) unlink (retfile);
341: exit (-9);
342: }
343: if ((res2 = write (nfd, where, strlen (where))) == -1) {
344: (void) fprintf (stderr, "Write to DUA failed (%d)... Please retry\n", res2);
345: (void) close (fd);
346: (void) close (nfd);
347: (void) close (wfd);
348: (void) unlink (retfile);
349: exit (-10);
350: }
351: (void) close (nfd);
352: }
353: }
354: }
355:
356: void pipe_quit (sig)
357: int sig;
358: {
359: (void) unlink (retfile);
360: (void) fprintf (stderr,"(signal %d) exiting...\n",sig);
361: exit(0);
362: }
363: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.