aboutsummaryrefslogtreecommitdiff
path: root/run-command.c
diff options
context:
space:
mode:
authorShawn O. Pearce <spearce@spearce.org>2007-03-12 14:37:45 -0400
committerJunio C Hamano <junkio@cox.net>2007-03-12 23:40:17 -0700
commitf4bba25bdc0ecb4ac338de81a2a65af487701833 (patch)
treec589a5069a36db7941e3b3648a8e3dbb4978a914 /run-command.c
parent27ebd6e0443bdd795869f598ecebc9eadd64a26c (diff)
downloadgit-f4bba25bdc0ecb4ac338de81a2a65af487701833.tar.gz
git-f4bba25bdc0ecb4ac338de81a2a65af487701833.tar.xz
Teach run-command about stdout redirection
Some potential callers of the run_command family of functions need to control not only the stdin redirection of the child, but also the stdout redirection of the child. This can now be setup much like the already existing stdin redirection. 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.c30
1 files changed, 29 insertions, 1 deletions
diff --git a/run-command.c b/run-command.c
index bef9775e0..d20a6ef80 100644
--- a/run-command.c
+++ b/run-command.c
@@ -11,7 +11,8 @@ static inline void close_pair(int fd[2])
int start_command(struct child_process *cmd)
{
int need_in = !cmd->no_stdin && cmd->in < 0;
- int fdin[2];
+ int need_out = !cmd->stdout_to_stderr && cmd->out < 0;
+ int fdin[2], fdout[2];
if (need_in) {
if (pipe(fdin) < 0)
@@ -20,10 +21,22 @@ int start_command(struct child_process *cmd)
cmd->close_in = 1;
}
+ if (need_out) {
+ if (pipe(fdout) < 0) {
+ if (need_in)
+ close_pair(fdin);
+ return -ERR_RUN_COMMAND_PIPE;
+ }
+ cmd->out = fdout[0];
+ cmd->close_out = 1;
+ }
+
cmd->pid = fork();
if (cmd->pid < 0) {
if (need_in)
close_pair(fdin);
+ if (need_out)
+ close_pair(fdout);
return -ERR_RUN_COMMAND_FORK;
}
@@ -42,6 +55,14 @@ int start_command(struct child_process *cmd)
if (cmd->stdout_to_stderr)
dup2(2, 1);
+ else if (need_out) {
+ dup2(fdout[1], 1);
+ close_pair(fdout);
+ } else if (cmd->out > 1) {
+ dup2(cmd->out, 1);
+ close(cmd->out);
+ }
+
if (cmd->git_cmd) {
execv_git_cmd(cmd->argv);
} else {
@@ -55,6 +76,11 @@ int start_command(struct child_process *cmd)
else if (cmd->in)
close(cmd->in);
+ if (need_out)
+ close(fdout[1]);
+ else if (cmd->out > 1)
+ close(cmd->out);
+
return 0;
}
@@ -62,6 +88,8 @@ int finish_command(struct child_process *cmd)
{
if (cmd->close_in)
close(cmd->in);
+ if (cmd->close_out)
+ close(cmd->out);
for (;;) {
int status, code;