2 * Copyright (C) 2000-2006 Erik Andersen <andersen@uclibc.org>
4 * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
14 libc_hidden_proto(_exit)
15 libc_hidden_proto(wait4)
16 libc_hidden_proto(execl)
17 libc_hidden_proto(signal)
18 libc_hidden_proto(vfork)
20 /* uClinux-2.0 has vfork, but Linux 2.0 doesn't */
21 #include <sys/syscall.h>
24 libc_hidden_proto(fork)
27 extern __typeof(system) __libc_system;
28 int __libc_system(const char *command)
31 __sighandler_t save_quit, save_int, save_chld;
36 save_quit = signal(SIGQUIT, SIG_IGN);
37 save_int = signal(SIGINT, SIG_IGN);
38 save_chld = signal(SIGCHLD, SIG_DFL);
40 if ((pid = vfork()) < 0) {
41 signal(SIGQUIT, save_quit);
42 signal(SIGINT, save_int);
43 signal(SIGCHLD, save_chld);
47 signal(SIGQUIT, SIG_DFL);
48 signal(SIGINT, SIG_DFL);
49 signal(SIGCHLD, SIG_DFL);
51 execl("/bin/sh", "sh", "-c", command, (char *) 0);
54 /* Signals are not absolutly guarenteed with vfork */
55 signal(SIGQUIT, SIG_IGN);
56 signal(SIGINT, SIG_IGN);
59 __printf("Waiting for child %d\n", pid);
62 if (wait4(pid, &wait_val, 0, 0) == -1)
65 signal(SIGQUIT, save_quit);
66 signal(SIGINT, save_int);
67 signal(SIGCHLD, save_chld);
70 weak_alias(__libc_system,system)