|
|
1.1 root 1: /* /sccs/src/cmd/uucp/s.shio.c
2: shio.c 1.1 8/30/84 17:37:41
3: */
4: #include "uucp.h"
5:
6: VERSION(@(#)shio.c 1.1);
7:
8: /*
9: * use shell to execute command with
10: * fi, fo, and fe as standard input/output/error
11: * cmd -> command to execute
12: * fi -> standard input
13: * fo -> standard output
14: * fe -> standard error
15: * return:
16: * 0 -> success
17: * non zero -> failure - status from child
18: (Note - -1 means the fork failed)
19: */
20: shio(cmd, fi, fo, fe)
21: char *cmd, *fi, *fo, *fe;
22: {
23: register int pid, ret;
24: int status;
25:
26: if (fi == NULL)
27: fi = "/dev/null";
28: if (fo == NULL)
29: fo = "/dev/null";
30: if (fe == NULL)
31: fe = "/dev/null";
32:
33: DEBUG(3, "shio - %s\n", cmd);
34: if ((pid = fork()) == 0) {
35: (void) signal(SIGINT, SIG_IGN);
36: (void) signal(SIGHUP, SIG_IGN);
37: (void) signal(SIGQUIT, SIG_IGN);
38: closelog();
39: (void) close(Ifn); /* close connection fd's */
40: (void) close(Ofn);
41: (void) close(0); /* get stdin from file fi */
42: if (open(fi, 0) != 0)
43: exit(errno);
44: (void) close(1); /* divert stdout to fo */
45: if (creat(fo, 0666) != 1)
46: exit(errno);
47: (void) close(2); /* divert stderr to fe */
48: if (creat(fe, 0666) != 2)
49: exit(errno);
50: #ifdef V8
51: close(3); /* get rid of /dev/tty */
52: #endif
53: (void) execle(SHELL, "sh", "-c", cmd, 0, Env);
54: exit(100);
55: }
56:
57: /*
58: * the status returned from wait can never be -1
59: * see man page wait(2)
60: * So we use the -1 value to indicate fork failed
61: */
62: if (pid == -1)
63: return(-1);
64:
65:
66: while ((ret = wait(&status)) != pid && ret != -1);
67: DEBUG(3, "status %d\n", status);
68: return(status);
69: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.