|
|
1.1 root 1: /*
2: char id_system[] = "@(#)system_.c 1.5";
3: *
4: * execute a unix command
5: *
6: * calling sequence:
7: * iexit = system(command)
8: * where:
9: * iexit will return the exit status of the command
10: * command is a character string containing the command to be executed
11: */
12:
13: #include "../libI77/fiodefs.h"
14: #include "../libI77/f_errno.h"
15: #include <sys/param.h>
16: #ifndef NCARGS
17: #define NCARGS 256
18: #endif
19:
20:
21: long system_(s, n)
22: char *s;
23: long n;
24: {
25: char buf[NCARGS - 50];
26: long i;
27:
28: if (n >= sizeof buf)
29: return(-(long)(errno=F_ERARG));
30: for (i = 0; i < MXUNIT; i++)
31: flush_(&i);
32: g_char(s, n, buf);
33: return((long)system(buf));
34: }
35:
36: /*
37: * this is a sane version of the libc/stdio routine.
38: */
39:
40: #include <signal.h>
41:
42: char *getenv();
43: char *rindex();
44:
45: system(s)
46: char *s;
47: {
48: register int (*istat)(), (*qstat)();
49: int status, pid, w;
50: char *shname, *shell;
51:
52: if ((shell = getenv("SHELL")) == NULL)
53: shell = "/bin/sh";
54:
55: if (shname = rindex(shell, '/'))
56: shname++;
57: else
58: shname = shell;
59:
60: if ((pid = fork()) == 0) {
61: execl(shell, shname, "-c", s, 0);
62: _exit(127);
63: }
64: istat = signal(SIGINT, SIG_IGN);
65: qstat = signal(SIGQUIT, SIG_IGN);
66: while ((w = wait(&status)) != pid && w != -1)
67: ;
68: if (w == -1)
69: status = -1;
70: signal(SIGINT, istat);
71: signal(SIGQUIT, qstat);
72: return(status);
73: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.