diff --git a/run-command.c b/run-command.c index 1fb7fa5a8d..a866a06694 100644 --- a/run-command.c +++ b/run-command.c @@ -2,13 +2,12 @@ #include "run-command.h" #include "exec_cmd.h" -int run_command(struct child_process *cmd) +int start_command(struct child_process *cmd) { - pid_t pid = fork(); - - if (pid < 0) + cmd->pid = fork(); + if (cmd->pid < 0) return -ERR_RUN_COMMAND_FORK; - if (!pid) { + if (!cmd->pid) { if (cmd->no_stdin) { int fd = open("/dev/null", O_RDWR); dup2(fd, 0); @@ -23,9 +22,14 @@ int run_command(struct child_process *cmd) } die("exec %s failed.", cmd->argv[0]); } + return 0; +} + +int finish_command(struct child_process *cmd) +{ for (;;) { int status, code; - pid_t waiting = waitpid(pid, &status, 0); + pid_t waiting = waitpid(cmd->pid, &status, 0); if (waiting < 0) { if (errno == EINTR) @@ -33,7 +37,7 @@ int run_command(struct child_process *cmd) error("waitpid failed (%s)", strerror(errno)); return -ERR_RUN_COMMAND_WAITPID; } - if (waiting != pid) + if (waiting != cmd->pid) return -ERR_RUN_COMMAND_WAITPID_WRONG_PID; if (WIFSIGNALED(status)) return -ERR_RUN_COMMAND_WAITPID_SIGNAL; @@ -47,6 +51,14 @@ int run_command(struct child_process *cmd) } } +int run_command(struct child_process *cmd) +{ + int code = start_command(cmd); + if (code) + return code; + return finish_command(cmd); +} + int run_command_v_opt(const char **argv, int opt) { struct child_process cmd; diff --git a/run-command.h b/run-command.h index f9db2a7f8c..24cdb4eb19 100644 --- a/run-command.h +++ b/run-command.h @@ -12,11 +12,14 @@ enum { struct child_process { const char **argv; + pid_t pid; unsigned no_stdin:1; unsigned git_cmd:1; /* if this is to be git sub-command */ unsigned stdout_to_stderr:1; }; +int start_command(struct child_process *); +int finish_command(struct child_process *); int run_command(struct child_process *); #define RUN_COMMAND_NO_STDIN 1