0f1c07b55289ac1a3b44cab58eb0fb52d1c3095b
[musl] / src / process / system.c
1 #include <unistd.h>
2 #include <fcntl.h>
3 #include <signal.h>
4 #include <sys/wait.h>
5 #include <errno.h>
6
7 int system(const char *cmd)
8 {
9         pid_t pid;
10         sigset_t old, new;
11         struct sigaction sa, oldint, oldquit;
12         int status;
13
14         if (!cmd) return 1;
15
16         sa.sa_handler = SIG_IGN;
17         sigemptyset(&sa.sa_mask);
18         sa.sa_flags = 0;
19
20         sigaction(SIGINT, &sa, &oldint);
21         sigaction(SIGQUIT, &sa, &oldquit);
22         sigaddset(&sa.sa_mask, SIGCHLD);
23         sigprocmask(SIG_BLOCK, &new, &old);
24
25         pid = fork();
26         if (pid <= 0) {
27                 sigaction(SIGINT, &oldint, NULL);
28                 sigaction(SIGQUIT, &oldquit, NULL);
29                 sigprocmask(SIG_SETMASK, &old, NULL);
30                 if (pid == 0) {
31                         execl("/bin/sh", "sh", "-c", cmd, (char *)0);
32                         _exit(127);
33                 }
34                 return -1;
35         }
36         while (waitpid(pid, &status, 0) == -1)
37                 if (errno != EINTR) {
38                         status = -1;
39                         break;
40                 }
41         sigaction(SIGINT, &oldint, NULL);
42         sigaction(SIGQUIT, &oldquit, NULL);
43         sigprocmask(SIG_SETMASK, &old, NULL);
44         return status;
45 }