ack/lang/cem/libcc/stdio/system.c

37 lines
748 B
C
Raw Normal View History

1987-03-31 10:45:53 +00:00
/* $Header$ */
1987-01-27 15:57:55 +00:00
#include <signal.h>
system(str)
char *str;
{
int pid, exitstatus, waitval;
1988-10-28 10:11:49 +00:00
int (*sigint)(), (*sigquit)();
1987-01-27 15:57:55 +00:00
int i;
1988-10-28 10:11:49 +00:00
if ((pid = fork()) < 0) return -1; /* How do we distinguish this
from exit status -1?
*/
1987-01-27 15:57:55 +00:00
if (pid == 0) {
for (i = 3; i <= 20; i++) close(i);
execl("/bin/sh", "sh", "-c", str, (char *) 0);
/* get here if execl fails ... */
_exit(127); /* see manual page */
}
1988-10-28 10:11:49 +00:00
sigint = signal( SIGINT, SIG_IGN );
sigquit = signal( SIGQUIT, SIG_IGN );
1987-01-27 15:57:55 +00:00
while ((waitval = wait(&exitstatus)) != pid) {
if (waitval == -1) break;
}
if (waitval == -1) {
/* no child ??? or maybe interrupted ??? */
exitstatus = -1;
}
1988-10-28 10:11:49 +00:00
signal( SIGINT, sigint );
signal( SIGQUIT, sigquit );
1987-01-27 15:57:55 +00:00
return exitstatus;
}