Thanks Ansis and Alex, I applied this to master.
On Mon, Jun 10, 2013 at 11:13:50AM -0700, Ansis Atteka wrote: > Acked-by: Ansis Atteka <aatt...@nicira.com> > > > On Wed, Jun 5, 2013 at 1:05 PM, Ben Pfaff <b...@nicira.com> wrote: > > > They are unused. > > > > Signed-off-by: Ben Pfaff <b...@nicira.com> > > --- > > lib/process.c | 227 > > --------------------------------------------------------- > > lib/process.h | 8 -- > > 2 files changed, 0 insertions(+), 235 deletions(-) > > > > diff --git a/lib/process.c b/lib/process.c > > index 0aa1842..ccba97a 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 d40c1ac..45e2a00 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 */ > > -- > > 1.7.2.5 > > > > _______________________________________________ > > dev mailing list > > dev@openvswitch.org > > http://openvswitch.org/mailman/listinfo/dev > > _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev