#include <stdio.h>
|
#include <stdio.h>
|
#include <stddef.h>
|
#include <stddef.h>
|
#include <signal.h>
|
#include <signal.h>
|
#include <unistd.h>
|
#include <unistd.h>
|
#include <sys/wait.h>
|
#include <sys/wait.h>
|
|
|
/* uClinux-2.0 has vfork, but Linux 2.0 doesn't */
|
/* uClinux-2.0 has vfork, but Linux 2.0 doesn't */
|
#include <sys/syscall.h>
|
#include <sys/syscall.h>
|
#if ! defined __NR_vfork
|
#if ! defined __NR_vfork
|
#define vfork fork
|
#define vfork fork
|
#endif
|
#endif
|
|
|
int __libc_system(char *command)
|
int __libc_system(char *command)
|
{
|
{
|
int wait_val, pid;
|
int wait_val, pid;
|
__sighandler_t save_quit, save_int, save_chld;
|
__sighandler_t save_quit, save_int, save_chld;
|
|
|
if (command == 0)
|
if (command == 0)
|
return 1;
|
return 1;
|
|
|
save_quit = signal(SIGQUIT, SIG_IGN);
|
save_quit = signal(SIGQUIT, SIG_IGN);
|
save_int = signal(SIGINT, SIG_IGN);
|
save_int = signal(SIGINT, SIG_IGN);
|
save_chld = signal(SIGCHLD, SIG_DFL);
|
save_chld = signal(SIGCHLD, SIG_DFL);
|
|
|
if ((pid = vfork()) < 0) {
|
if ((pid = vfork()) < 0) {
|
signal(SIGQUIT, save_quit);
|
signal(SIGQUIT, save_quit);
|
signal(SIGINT, save_int);
|
signal(SIGINT, save_int);
|
signal(SIGCHLD, save_chld);
|
signal(SIGCHLD, save_chld);
|
return -1;
|
return -1;
|
}
|
}
|
if (pid == 0) {
|
if (pid == 0) {
|
signal(SIGQUIT, SIG_DFL);
|
signal(SIGQUIT, SIG_DFL);
|
signal(SIGINT, SIG_DFL);
|
signal(SIGINT, SIG_DFL);
|
signal(SIGCHLD, SIG_DFL);
|
signal(SIGCHLD, SIG_DFL);
|
|
|
execl("/bin/sh", "sh", "-c", command, (char *) 0);
|
execl("/bin/sh", "sh", "-c", command, (char *) 0);
|
_exit(127);
|
_exit(127);
|
}
|
}
|
/* Signals are not absolutly guarenteed with vfork */
|
/* Signals are not absolutly guarenteed with vfork */
|
signal(SIGQUIT, SIG_IGN);
|
signal(SIGQUIT, SIG_IGN);
|
signal(SIGINT, SIG_IGN);
|
signal(SIGINT, SIG_IGN);
|
|
|
#if 0
|
#if 0
|
printf("Waiting for child %d\n", pid);
|
printf("Waiting for child %d\n", pid);
|
#endif
|
#endif
|
|
|
if (wait4(pid, &wait_val, 0, 0) == -1)
|
if (wait4(pid, &wait_val, 0, 0) == -1)
|
wait_val = -1;
|
wait_val = -1;
|
|
|
signal(SIGQUIT, save_quit);
|
signal(SIGQUIT, save_quit);
|
signal(SIGINT, save_int);
|
signal(SIGINT, save_int);
|
signal(SIGCHLD, save_chld);
|
signal(SIGCHLD, save_chld);
|
return wait_val;
|
return wait_val;
|
}
|
}
|
weak_alias(__libc_system, system)
|
weak_alias(__libc_system, system)
|
|
|