summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--run-command.c26
-rw-r--r--run-command.h3
2 files changed, 22 insertions, 7 deletions
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