diff options
Diffstat (limited to 'mdk-stage1/dietlibc/libugly/system.c')
-rw-r--r-- | mdk-stage1/dietlibc/libugly/system.c | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/mdk-stage1/dietlibc/libugly/system.c b/mdk-stage1/dietlibc/libugly/system.c new file mode 100644 index 000000000..b9eea20eb --- /dev/null +++ b/mdk-stage1/dietlibc/libugly/system.c @@ -0,0 +1,69 @@ +#include <signal.h> +#include <asm/errno.h> +#include <errno.h> +#include <unistd.h> +#include "dietwarning.h" + +#define SHELL_PATH "/bin/sh" /* Path of the shell. */ +#define SHELL_NAME "sh" /* Name to give it. */ + +extern char **environ; + +int __libc_fork(); +int __libc_waitpid(int pid, int *status, int options); +int execve(const char*filename, char *const argv[], char *const envp[]); +void __set_errno(int errno); +int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); + +int __libc_system (const char *line) +{ + struct sigaction sa, intr, quit; + int save,pid,ret=-1; + + if (line == 0) return __libc_system("exit 0") == 0; + + sa.sa_handler = SIG_IGN; + sa.sa_flags = 0; + sigemptyset (&sa.sa_mask); + + if (sigaction(SIGINT, &sa, &intr)<0) return -1; + if (sigaction(SIGQUIT, &sa, &quit)<0) { + save = errno; + sigaction (SIGINT, &intr, (struct sigaction*)0); + __set_errno (save); + return -1; + } + + pid=__libc_fork(); + if (pid>0) + { /* parent */ + int n; + do + n=__libc_waitpid(pid, &ret, 0); + while ((n==-1) && (errno==EINTR)); + if (n!=pid) ret=-1; + } + else if (!pid) + { /* child */ + const char *nargs[4]; + nargs[0] = SHELL_NAME; + nargs[1] = "-c"; + nargs[2] = line; + nargs[3] = 0; + + sigaction(SIGINT, &intr, (struct sigaction*)0); + sigaction(SIGQUIT, &quit, (struct sigaction*)0); + + execve(SHELL_PATH,(char *const *)nargs, environ); + _exit(127); + } + save = errno; + sigaction (SIGINT, &intr, (struct sigaction *)0); + sigaction (SIGQUIT, &quit, (struct sigaction *)0); + __set_errno(save); + return ret; +} + +int system (const char *line) __attribute__((weak,alias("__libc_system"))); + +link_warning("system","warning: system() is a security risk. Use fork and execvp instead!") |