/* * Process a shell escape by saving signals, ignoring signals, * and forking a sh -c */ int shell(char *str) { sig_t sigint = signal(SIGINT, SIG_IGN); char *sh; char cmd[BUFSIZ]; if (strlcpy(cmd, str, sizeof(cmd)) >= sizeof(cmd)) return (1); if (bangexp(cmd, sizeof(cmd)) < 0) return (1); if ((sh = value("SHELL")) == NULL) sh = _PATH_CSHELL; (void)run_command(sh, 0, -1, -1, "-c", cmd, NULL); (void)signal(SIGINT, sigint); printf("!\n"); return (0); }
/* * Process a shell escape by saving signals, ignoring signals, * and forking a sh -c */ int shell(void *v) { char *str = v; char *shell; char cmd[BUFSIZ]; struct sigaction oact; sigset_t oset; (void)ignoresig(SIGINT, &oact, &oset); (void)strlcpy(cmd, str, sizeof(cmd)); if (bangexp(cmd, sizeof(cmd)) < 0) return(1); shell = value("SHELL"); (void)run_command(shell, 0, 0, -1, "-c", cmd, NULL); (void)sigprocmask(SIG_SETMASK, &oset, NULL); (void)sigaction(SIGINT, &oact, NULL); puts("!"); return(0); }