Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
run-command: Redirect stderr to a pipe before redirecting stdout to s…
…tderr

With this patch, in the 'start_command' function after forking
we now take care of stderr in the child process before stdout.

This way if 'start_command' is called with a 'child_process'
argument like this:

	.err = -1;
	.stdout_to_stderr = 1;

then stderr will be redirected to a pipe before stdout is
redirected to stderr. So we can now get the process' stdout
from the pipe (as well as its stderr).

Earlier such a call would have redirected stdout to stderr
before stderr was itself redirected, and therefore stdout
would not have followed stderr, which would not have been
very useful anyway.

Update documentation in 'api-run-command.txt' accordingly.

Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
Acked-by: Johannes Sixt <johannes.sixt@telecom.at>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
chriscool authored and gitster committed Mar 5, 2008
1 parent c95b3ad commit ce2cf27
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 10 deletions.
7 changes: 4 additions & 3 deletions Documentation/technical/api-run-command.txt
Expand Up @@ -111,9 +111,10 @@ stderr as follows:
.no_stdin, .no_stdout, .no_stderr: The respective channel is
redirected to /dev/null.

.stdout_to_stderr: stdout of the child is redirected to the
parent's stderr (i.e. *not* to what .err or
.no_stderr specify).
.stdout_to_stderr: stdout of the child is redirected to its
stderr. This happens after stderr is itself redirected.
So stdout will follow stderr to wherever it is
redirected.

To modify the environment of the sub-process, specify an array of
string pointers (NULL terminated) in .env:
Expand Down
14 changes: 7 additions & 7 deletions run-command.c
Expand Up @@ -91,6 +91,13 @@ int start_command(struct child_process *cmd)
close(cmd->in);
}

if (cmd->no_stderr)
dup_devnull(2);
else if (need_err) {
dup2(fderr[1], 2);
close_pair(fderr);
}

if (cmd->no_stdout)
dup_devnull(1);
else if (cmd->stdout_to_stderr)
Expand All @@ -103,13 +110,6 @@ int start_command(struct child_process *cmd)
close(cmd->out);
}

if (cmd->no_stderr)
dup_devnull(2);
else if (need_err) {
dup2(fderr[1], 2);
close_pair(fderr);
}

if (cmd->dir && chdir(cmd->dir))
die("exec %s: cd to %s failed (%s)", cmd->argv[0],
cmd->dir, strerror(errno));
Expand Down

0 comments on commit ce2cf27

Please sign in to comment.