summaryrefslogtreecommitdiff
path: root/run-command.c
diff options
context:
space:
mode:
authorShawn O. Pearce <spearce@spearce.org>2007-03-10 03:28:05 -0500
committerJunio C Hamano <junkio@cox.net>2007-03-11 22:49:37 -0700
commitebcb5d16ca911d5e21bb8071c185fb47a0c1fbb3 (patch)
treecb912d237836c26730119693c2b252b4b9ae18fb /run-command.c
parentf1000898d43a30f6a0d3bbde7b4927e97913d010 (diff)
downloadgit-ebcb5d16ca911d5e21bb8071c185fb47a0c1fbb3.tar.gz
Split run_command into two halves (start/finish)
If the calling process wants to send data to stdin of a child process it will need to arrange for a pipe and get the child process running, feed data to it, then wait for the child process to finish. So we split the run function into two halves, allowing callers to first start the child then later finish it. Signed-off-by: Shawn O. Pearce <spearce@spearce.org> Signed-off-by: Junio C Hamano <junkio@cox.net>
Diffstat (limited to 'run-command.c')
-rw-r--r--run-command.c26
1 files changed, 19 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;