/* $Id$ */ #include system(str) char *str; { int pid, exitstatus, waitval; void (*sigint)(), (*sigquit)(); int i; if ((pid = fork()) < 0) return -1; /* How do we distinguish this from exit status -1? */ 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 */ } sigint = signal( SIGINT, SIG_IGN ); sigquit = signal( SIGQUIT, SIG_IGN ); while ((waitval = wait(&exitstatus)) != pid) { if (waitval == -1) break; } if (waitval == -1) { /* no child ??? or maybe interrupted ??? */ exitstatus = -1; } signal( SIGINT, sigint ); signal( SIGQUIT, sigquit ); return exitstatus; }