X-Git-Url: http://git.ozlabs.org/?p=petitboot;a=blobdiff_plain;f=lib%2Fprocess%2Fprocess.c;h=bc392dc779510245a315c0061b4a14f5d3c06f24;hp=c1606a52b342406de99d44d9cd07a678a327ba29;hb=214de247193d14a2de014e5e4cad1ab3df956c13;hpb=2914110af0cc490566446f18c929452368121b98 diff --git a/lib/process/process.c b/lib/process/process.c index c1606a5..bc392dc 100644 --- a/lib/process/process.c +++ b/lib/process/process.c @@ -92,7 +92,7 @@ static int process_read_stdout_once(struct process_info *procinfo, char **line) if (rc < 0) { if (errno == EINTR) return 1; - pb_log("%s: read failed: %s\n", __func__, strerror(errno)); + pb_log_fn("read failed: %s\n", strerror(errno)); return rc; } @@ -178,28 +178,7 @@ static int process_read_stdout(struct process_info *procinfo) return rc < 0 ? rc : 0; } -static int process_stdout_cb(void *arg) -{ - struct process_info *procinfo = arg; - int rc; - - rc = process_read_stdout_once(procinfo, NULL); - - /* if we're going to signal to the waitset that we're done (ie, non-zero - * return value), then the waiters will remove us, so we drop the - * reference */ - if (rc < 0) { - talloc_unlink(procset, procinfo); - procinfo->stdout_waiter = NULL; - rc = -1; - } else { - rc = 0; - } - - return rc; -} - -int process_stdout_custom(struct process_info *procinfo, char **line) +int process_process_stdout(struct process_info *procinfo, char **line) { int rc; @@ -232,7 +211,7 @@ static void sigchld_sigaction(int signo, siginfo_t *info, rc = write(procset->sigchld_pipe[1], &pid, sizeof(pid)); if (rc != sizeof(pid)) - pb_log("%s: write failed: %s\n", __func__, strerror(errno)); + pb_log_fn("write failed: %s\n", strerror(errno)); } static int sigchld_pipe_event(void *arg) @@ -306,7 +285,7 @@ struct procset *process_init(void *ctx, struct waitset *set, bool dry_run) rc = pipe(procset->sigchld_pipe); if (rc) { - pb_log("%s: pipe() failed: %s\n", __func__, strerror(errno)); + pb_log_fn("pipe() failed: %s\n", strerror(errno)); goto err_free; } @@ -322,7 +301,7 @@ struct procset *process_init(void *ctx, struct waitset *set, bool dry_run) rc = sigaction(SIGCHLD, &sa, NULL); if (rc) { - pb_log("%s: sigaction() failed: %s\n", __func__, + pb_log_fn("sigaction() failed: %s\n", strerror(errno)); goto err_remove; } @@ -374,7 +353,7 @@ static int process_run_common(struct process_info *procinfo) pid = fork(); if (pid < 0) { - pb_log("%s: fork failed: %s\n", __func__, strerror(errno)); + pb_log_fn("fork failed: %s\n", strerror(errno)); return pid; } @@ -410,17 +389,21 @@ int process_run_sync(struct process *process) if (errno == EINTR) continue; - pb_log("%s: waitpid failed: %s\n", __func__, strerror(errno)); + pb_log_fn("waitpid failed: %s\n", strerror(errno)); return rc; } return 0; } +static int process_stdout_cb(struct process_info *procinfo) +{ + return process_process_stdout(procinfo, NULL); +} + int process_run_async(struct process *process) { struct process_info *procinfo = get_info(process); - waiter_cb stdout_cb; int rc; rc = process_run_common(procinfo); @@ -428,7 +411,8 @@ int process_run_async(struct process *process) return rc; if (process->keep_stdout) { - stdout_cb = process->stdout_cb ?: process_stdout_cb; + waiter_cb stdout_cb = process->stdout_cb ?: + (waiter_cb)process_stdout_cb; procinfo->stdout_waiter = waiter_register_io(procset->waitset, procinfo->stdout_pipe[0], WAIT_IN, stdout_cb, procinfo);