1994-06-24 14:02:31 +00:00
|
|
|
/* $Id$ */
|
1987-01-27 15:57:55 +00:00
|
|
|
#include <signal.h>
|
|
|
|
|
|
|
|
system(str)
|
|
|
|
char *str;
|
|
|
|
{
|
|
|
|
int pid, exitstatus, waitval;
|
1993-11-17 16:38:52 +00:00
|
|
|
void (*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;
|
|
|
|
}
|