From: Ben Pfaff Date: Wed, 8 May 2013 21:46:30 +0000 (-0700) Subject: process: Remove process_run(), process_run_capture(), and related code. X-Git-Tag: sliver-openvswitch-1.10.90-3~6^2~141 X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=21f0192507c8e14e4f43501104f7fc1d185136ae;p=sliver-openvswitch.git process: Remove process_run(), process_run_capture(), and related code. They are unused. Signed-off-by: Ben Pfaff Acked-by: Ansis Atteka --- diff --git a/lib/process.c b/lib/process.c index 0aa18422d..ccba97a96 100644 --- a/lib/process.c +++ b/lib/process.c @@ -36,8 +36,6 @@ VLOG_DEFINE_THIS_MODULE(process); -COVERAGE_DEFINE(process_run); -COVERAGE_DEFINE(process_run_capture); COVERAGE_DEFINE(process_sigchld); COVERAGE_DEFINE(process_start); @@ -311,32 +309,6 @@ process_status(const struct process *p) return p->status; } -int -process_run(char **argv, - const int keep_fds[], size_t n_keep_fds, - const int null_fds[], size_t n_null_fds, - int *status) -{ - struct process *p; - int retval; - - COVERAGE_INC(process_run); - retval = process_start(argv, keep_fds, n_keep_fds, null_fds, n_null_fds, - &p); - if (retval) { - *status = 0; - return retval; - } - - while (!process_exited(p)) { - process_wait(p); - poll_block(); - } - *status = process_status(p); - process_destroy(p); - return 0; -} - /* Given 'status', which is a process status in the form reported by waitpid(2) * and returned by process_status(), returns a string describing how the * process terminated. The caller is responsible for freeing the string when @@ -403,205 +375,6 @@ process_search_path(const char *name) return NULL; } -/* process_run_capture() and supporting functions. */ - -struct stream { - size_t max_size; - struct ds log; - int fds[2]; -}; - -static int -stream_open(struct stream *s, size_t max_size) -{ - int error; - - s->max_size = max_size; - ds_init(&s->log); - if (pipe(s->fds)) { - VLOG_WARN("failed to create pipe: %s", strerror(errno)); - return errno; - } - error = set_nonblocking(s->fds[0]); - if (error) { - close(s->fds[0]); - close(s->fds[1]); - } - return error; -} - -static void -stream_read(struct stream *s) -{ - if (s->fds[0] < 0) { - return; - } - - for (;;) { - char buffer[512]; - int error; - size_t n; - - error = read_fully(s->fds[0], buffer, sizeof buffer, &n); - ds_put_buffer(&s->log, buffer, n); - if (error) { - if (error == EAGAIN || error == EWOULDBLOCK) { - return; - } else { - if (error != EOF) { - VLOG_WARN("error reading subprocess pipe: %s", - strerror(error)); - } - break; - } - } else if (s->log.length > s->max_size) { - VLOG_WARN("subprocess output overflowed %zu-byte buffer", - s->max_size); - break; - } - } - close(s->fds[0]); - s->fds[0] = -1; -} - -static void -stream_wait(struct stream *s) -{ - if (s->fds[0] >= 0) { - poll_fd_wait(s->fds[0], POLLIN); - } -} - -static void -stream_close(struct stream *s) -{ - ds_destroy(&s->log); - if (s->fds[0] >= 0) { - close(s->fds[0]); - } - if (s->fds[1] >= 0) { - close(s->fds[1]); - } -} - -/* Starts the process whose arguments are given in the null-terminated array - * 'argv' and waits for it to exit. On success returns 0 and stores the - * process exit value (suitable for passing to process_status_msg()) in - * '*status'. On failure, returns a positive errno value and stores 0 in - * '*status'. - * - * If 'stdout_log' is nonnull, then the subprocess's output to stdout (up to a - * limit of 'log_max' bytes) is captured in a memory buffer, which - * when this function returns 0 is stored as a null-terminated string in - * '*stdout_log'. The caller is responsible for freeing '*stdout_log' (by - * passing it to free()). When this function returns an error, '*stdout_log' - * is set to NULL. - * - * If 'stderr_log' is nonnull, then it is treated like 'stdout_log' except - * that it captures the subprocess's output to stderr. */ -int -process_run_capture(char **argv, char **stdout_log, char **stderr_log, - size_t max_log, int *status) -{ - struct stream s_stdout, s_stderr; - sigset_t oldsigs; - pid_t pid; - int error; - - COVERAGE_INC(process_run_capture); - if (stdout_log) { - *stdout_log = NULL; - } - if (stderr_log) { - *stderr_log = NULL; - } - *status = 0; - error = process_prestart(argv); - if (error) { - return error; - } - - error = stream_open(&s_stdout, max_log); - if (error) { - return error; - } - - error = stream_open(&s_stderr, max_log); - if (error) { - stream_close(&s_stdout); - return error; - } - - block_sigchld(&oldsigs); - pid = fork(); - if (pid < 0) { - error = errno; - - unblock_sigchld(&oldsigs); - VLOG_WARN("fork failed: %s", strerror(error)); - - stream_close(&s_stdout); - stream_close(&s_stderr); - *status = 0; - return error; - } else if (pid) { - /* Running in parent process. */ - struct process *p; - - p = process_register(argv[0], pid); - unblock_sigchld(&oldsigs); - - close(s_stdout.fds[1]); - close(s_stderr.fds[1]); - while (!process_exited(p)) { - stream_read(&s_stdout); - stream_read(&s_stderr); - - stream_wait(&s_stdout); - stream_wait(&s_stderr); - process_wait(p); - poll_block(); - } - stream_read(&s_stdout); - stream_read(&s_stderr); - - if (stdout_log) { - *stdout_log = ds_steal_cstr(&s_stdout.log); - } - if (stderr_log) { - *stderr_log = ds_steal_cstr(&s_stderr.log); - } - - stream_close(&s_stdout); - stream_close(&s_stderr); - - *status = process_status(p); - process_destroy(p); - return 0; - } else { - /* Running in child process. */ - int max_fds; - int i; - - fatal_signal_fork(); - unblock_sigchld(&oldsigs); - - dup2(get_null_fd(), 0); - dup2(s_stdout.fds[1], 1); - dup2(s_stderr.fds[1], 2); - - max_fds = get_max_fds(); - for (i = 3; i < max_fds; i++) { - close(i); - } - - execvp(argv[0], argv); - fprintf(stderr, "execvp(\"%s\") failed: %s\n", - argv[0], strerror(errno)); - exit(EXIT_FAILURE); - } -} - static void sigchld_handler(int signr OVS_UNUSED) { diff --git a/lib/process.h b/lib/process.h index d40c1ac05..45e2a0039 100644 --- a/lib/process.h +++ b/lib/process.h @@ -30,11 +30,6 @@ int process_start(char **argv, void process_destroy(struct process *); int process_kill(const struct process *, int signr); -int process_run(char **argv, - const int *keep_fds, size_t n_keep_fds, - const int *null_fds, size_t n_null_fds, - int *status); - pid_t process_pid(const struct process *); const char *process_name(const struct process *); bool process_exited(struct process *); @@ -45,7 +40,4 @@ void process_wait(struct process *); char *process_search_path(const char *); -int process_run_capture(char **argv, char **stdout_log, char **stderr_log, - size_t max_log, int *status); - #endif /* process.h */