Magellan Linux

Contents of /trunk/mkinitrd-magellan/klibc/usr/klibc/system.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 532 - (show annotations) (download)
Sat Sep 1 22:45:15 2007 UTC (16 years, 8 months ago) by niro
File MIME type: text/plain
File size: 1368 byte(s)
-import if magellan mkinitrd; it is a fork of redhats mkinitrd-5.0.8 with all magellan patches and features; deprecates magellan-src/mkinitrd

1 /*
2 * system.c
3 *
4 * The system() function. If this turns out to actually be *used*,
5 * we may want to try to detect the very simple cases (no shell magic)
6 * and handle them internally, instead of requiring that /bin/sh be
7 * present.
8 */
9
10 #include <errno.h>
11 #include <stdlib.h>
12 #include <unistd.h>
13 #include <signal.h>
14 #include <sys/wait.h>
15
16 int system(const char *string)
17 {
18 pid_t pid;
19 struct sigaction ignore, old_int, old_quit;
20 sigset_t masked, oldmask;
21 static const char *argv[] = { "/bin/sh", "-c", NULL, NULL };
22 int status;
23
24 /* Block SIGCHLD and ignore SIGINT and SIGQUIT */
25 /* Do this before the fork() to avoid races */
26
27 ignore.sa_handler = SIG_IGN;
28 sigemptyset(&ignore.sa_mask);
29 ignore.sa_flags = 0;
30 sigaction(SIGINT, &ignore, &old_int);
31 sigaction(SIGQUIT, &ignore, &old_quit);
32
33 sigemptyset(&masked);
34 sigaddset(&masked, SIGCHLD);
35 sigprocmask(SIG_BLOCK, &masked, &oldmask);
36
37 pid = fork();
38
39 if (pid < 0)
40 return -1;
41 else if (pid == 0) {
42 sigaction(SIGINT, &old_int, NULL);
43 sigaction(SIGQUIT, &old_quit, NULL);
44 sigprocmask(SIG_SETMASK, &oldmask, NULL);
45
46 argv[2] = string;
47
48 execve(argv[0], (char *const *)argv, (char *const *)environ);
49 _exit(127);
50 }
51
52 /* else... */
53
54 waitpid(pid, &status, 0);
55
56 sigaction(SIGINT, &old_int, NULL);
57 sigaction(SIGQUIT, &old_quit, NULL);
58 sigprocmask(SIG_SETMASK, &oldmask, NULL);
59
60 return status;
61 }