From: "Shawn O. Pearce" <spearce@xxxxxxxxxxx> 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). Update documentation in 'api-run-command.txt' accordingly. Signed-off-by: Christian Couder <chriscool@xxxxxxxxxxxxx> --- Documentation/technical/api-run-command.txt | 7 ++++--- run-command.c | 14 +++++++------- 2 files changed, 11 insertions(+), 10 deletions(-) The changes since the previous versions are: - added documentation, - added 'From: "Shawn O. Pearce" <spearce@xxxxxxxxxxx>', - improved title. diff --git a/Documentation/technical/api-run-command.txt b/Documentation/technical/api-run-command.txt index dfbf9ac..c097f8b 100644 --- a/Documentation/technical/api-run-command.txt +++ b/Documentation/technical/api-run-command.txt @@ -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 before 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: diff --git a/run-command.c b/run-command.c index 743757c..44100a7 100644 --- a/run-command.c +++ b/run-command.c @@ -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) @@ -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)); -- 1.5.4.3.395.g492b.dirty -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html