macro and text revision (-mdoc version 3)
[unix-history] / usr / src / lib / libc / stdlib / system.c
index 8d5c8ea..1062556 100644 (file)
@@ -1,26 +1,50 @@
-#ifndef lint
-static char sccsid[] = "@(#)system.c   5.1 (Berkeley) %G%";
-#endif not lint
+/*
+ * Copyright (c) 1988 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * %sccs.include.redist.c%
+ */
 
 
-#include       <signal.h>
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)system.c   5.10 (Berkeley) %G%";
+#endif /* LIBC_SCCS and not lint */
 
 
-system(s)
-char *s;
+#include <sys/types.h>
+#include <sys/signal.h>
+#include <sys/wait.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <unistd.h>
+#include <paths.h>
+
+system(command)
+       const char *command;
 {
 {
-       int status, pid, w;
-       register int (*istat)(), (*qstat)();
+       union wait pstat;
+       pid_t pid;
+       int omask;
+       sig_t intsave, quitsave;
+
+       if (!command)           /* just checking... */
+               return(1);
 
 
-       if ((pid = vfork()) == 0) {
-               execl("/bin/sh", "sh", "-c", s, 0);
+       omask = sigblock(sigmask(SIGCHLD));
+       switch(pid = vfork()) {
+       case -1:                        /* error */
+               (void)sigsetmask(omask);
+               pstat.w_status = 0;
+               pstat.w_retcode = 127;
+               return(pstat.w_status);
+       case 0:                         /* child */
+               (void)sigsetmask(omask);
+               execl(_PATH_BSHELL, "sh", "-c", command, (char *)NULL);
                _exit(127);
        }
                _exit(127);
        }
-       istat = signal(SIGINT, SIG_IGN);
-       qstat = signal(SIGQUIT, SIG_IGN);
-       while ((w = wait(&status)) != pid && w != -1)
-               ;
-       if (w == -1)
-               status = -1;
-       signal(SIGINT, istat);
-       signal(SIGQUIT, qstat);
-       return(status);
+       intsave = signal(SIGINT, SIG_IGN);
+       quitsave = signal(SIGQUIT, SIG_IGN);
+       pid = waitpid(pid, (int *)&pstat, 0);
+       (void)sigsetmask(omask);
+       (void)signal(SIGINT, intsave);
+       (void)signal(SIGQUIT, quitsave);
+       return(pid == -1 ? -1 : pstat.w_status);
 }
 }