summaryrefslogtreecommitdiff
path: root/lib/process.c
diff options
context:
space:
mode:
authorBen Pfaff <blp@nicira.com>2013-05-08 14:46:30 -0700
committerBen Pfaff <blp@nicira.com>2013-06-10 13:48:08 -0700
commit21f0192507c8e14e4f43501104f7fc1d185136ae (patch)
tree1b88bc5c397a8315265b598c76eddabeaec2b192 /lib/process.c
parent09672174bf12baf8096fb628c16d2bae656eed95 (diff)
downloadopenvswitch-21f0192507c8e14e4f43501104f7fc1d185136ae.tar.gz
process: Remove process_run(), process_run_capture(), and related code.
They are unused. Signed-off-by: Ben Pfaff <blp@nicira.com> Acked-by: Ansis Atteka <aatteka@nicira.com>
Diffstat (limited to 'lib/process.c')
-rw-r--r--lib/process.c227
1 files changed, 0 insertions, 227 deletions
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)
{