diff options
author | Robin Gareus <robin@gareus.org> | 2014-03-13 16:50:44 +0100 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2014-03-13 16:58:07 +0100 |
commit | 543099afbafe83a0bb334f2a016c0d849fe2ca47 (patch) | |
tree | 21798ed902efe449dd329c556280fb5247a9be91 /tools | |
parent | f48b5568883468e70a751ec1aa934e5a55bb7705 (diff) |
rework SystemExec - use vfork wrapper (and lots of related stuff)
Diffstat (limited to 'tools')
-rw-r--r-- | tools/exec_wrapper.c | 94 |
1 files changed, 0 insertions, 94 deletions
diff --git a/tools/exec_wrapper.c b/tools/exec_wrapper.c deleted file mode 100644 index ad7577b70c..0000000000 --- a/tools/exec_wrapper.c +++ /dev/null @@ -1,94 +0,0 @@ -#include <stdio.h> -#include <unistd.h> -#include <stdlib.h> -#include <string.h> -#include <fcntl.h> - -#ifndef STDIN_FILENO -#define STDIN_FILENO 0 -#endif -#ifndef STDOUT_FILENO -#define STDOUT_FILENO 1 -#endif -#ifndef STDERR_FILENO -#define STDERR_FILENO 2 -#endif - -extern char **environ; -static void close_fd (int *fd) { if ((*fd) >= 0) close (*fd); *fd = -1; } - -int main(int argc, char *argv[]) { - if (argc < 10) { - // TODO: if argv > 3, assume pok[] is given, notifify parent. - // usage() and a man-page (help2man) would not be bad, either :) - return -1; - } - - int pok[2]; - int pin[2]; - int pout[2]; - - pok[0] = atoi(argv[1]); - pok[1] = atoi(argv[2]); - pin[0] = atoi(argv[3]); - pin[1] = atoi(argv[4]); - pout[0] = atoi(argv[5]); - pout[1] = atoi(argv[6]); - - int stderr_mode = atoi(argv[7]); - int nicelevel = atoi(argv[8]); - - /* vfork()ed child process - exec external process */ - close_fd(&pok[0]); - fcntl(pok[1], F_SETFD, FD_CLOEXEC); - - close_fd(&pin[1]); - if (pin[0] != STDIN_FILENO) { - dup2(pin[0], STDIN_FILENO); - } - close_fd(&pin[0]); - close_fd(&pout[0]); - if (pout[1] != STDOUT_FILENO) { - dup2(pout[1], STDOUT_FILENO); - } - - if (stderr_mode == 2) { - /* merge STDERR into output */ - if (pout[1] != STDERR_FILENO) { - dup2(pout[1], STDERR_FILENO); - } - } else if (stderr_mode == 1) { - /* ignore STDERR */ - close(STDERR_FILENO); - } else { - /* keep STDERR */ - } - - if (pout[1] != STDOUT_FILENO && pout[1] != STDERR_FILENO) { - close_fd(&pout[1]); - } - - if (nicelevel !=0) { - nice(nicelevel); - } - - /* copy current environment */ - char **envp = NULL; - int i=0; - envp = (char **) calloc(1, sizeof(char*)); - for (i=0;environ[i];++i) { - envp[i] = strdup(environ[i]); - envp = (char **) realloc(envp, (i+2) * sizeof(char*)); - } - envp[i] = 0; - - /* all systems go */ - execve(argv[9], &argv[9], envp); - - /* if we reach here something went wrong.. */ - char buf = 0; - (void) write(pok[1], &buf, 1 ); - close_fd(&pok[1]); - exit(-1); - return -1; -} |