+ errx(1, "expecting additional argument%s after \"%s\"",
+ (nargs - argc) ? "s" : "", argv[argc - 1]);
+ exit(rval);
+}
+
+/*
+ * system --
+ * Private version of system(3). Use the user's SHELL environment
+ * variable as the shell to execute.
+ */
+int
+system(command)
+ const char *command;
+{
+ static char *name, *shell;
+ union wait pstat;
+ pid_t pid;
+ int omask;
+ sig_t intsave, quitsave;
+
+ if (shell == NULL) {
+ if ((shell = getenv("SHELL")) == NULL)
+ shell = _PATH_BSHELL;
+ if ((name = strrchr(shell, '/')) == NULL)
+ name = shell;
+ else
+ ++name;
+ }
+ if (!command) /* just checking... */
+ return(1);
+
+ omask = sigblock(sigmask(SIGCHLD));
+ switch(pid = vfork()) {
+ case -1: /* error */
+ err(1, "fork");
+ case 0: /* child */
+ (void)sigsetmask(omask);
+ execl(shell, name, "-c", command, NULL);
+ err(1, "%s", shell);
+ }
+ 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);