X-Git-Url: http://git.ozlabs.org/?p=petitboot;a=blobdiff_plain;f=lib%2Fprocess%2Fprocess.c;h=86c7fbbf246c374d50f1c23a637118079817a27c;hp=e1a158b0799519e391aa310228a3c8670cad7e47;hb=2ad0e66f61e8f8488cff208f8bb7f5127ec9f813;hpb=e52a8c61a640ab4fce0b4caaa796ae3e1c4ff8a3 diff --git a/lib/process/process.c b/lib/process/process.c index e1a158b..86c7fbb 100644 --- a/lib/process/process.c +++ b/lib/process/process.c @@ -29,6 +29,7 @@ struct procset { struct list async_list; int sigchld_pipe[2]; struct waiter *sigchld_waiter; + bool dry_run; }; /* Internal data type for process handling @@ -124,7 +125,10 @@ static void process_setup_stdout_child(struct process_info *procinfo) else dup2(log, STDOUT_FILENO); - dup2(log, STDERR_FILENO); + if (procinfo->process.keep_stdout && procinfo->process.add_stderr) + dup2(procinfo->stdout_pipe[1], STDERR_FILENO); + else + dup2(log, STDERR_FILENO); } static void process_finish_stdout(struct process_info *procinfo) @@ -245,13 +249,14 @@ static int process_fini(void *p) return 0; } -struct procset *process_init(void *ctx, struct waitset *set) +struct procset *process_init(void *ctx, struct waitset *set, bool dry_run) { struct sigaction sa; int rc; procset = talloc(ctx, struct procset); procset->waitset = set; + procset->dry_run = dry_run; list_init(&procset->async_list); rc = pipe(procset->sigchld_pipe); @@ -330,6 +335,8 @@ static int process_run_common(struct process_info *procinfo) if (pid == 0) { process_setup_stdout_child(procinfo); + if (procset->dry_run) + exit(EXIT_SUCCESS); execvp(process->path, (char * const *)process->argv); exit(EXIT_FAILURE); } @@ -351,8 +358,13 @@ int process_run_sync(struct process *process) process_read_stdout(procinfo); - rc = waitpid(process->pid, &process->exit_status, 0); - if (rc == -1) { + for (;;) { + rc = waitpid(process->pid, &process->exit_status, 0); + if (rc >= 0) + break; + if (errno == EINTR) + continue; + pb_log("%s: waitpid failed: %s\n", __func__, strerror(errno)); return rc; } @@ -435,3 +447,9 @@ int process_run_simple(void *ctx, const char *name, ...) return rc; } + +bool process_exit_ok(struct process *process) +{ + return WIFEXITED(process->exit_status) && + WEXITSTATUS(process->exit_status) == 0; +}