diff options
author | Shawn O. Pearce <spearce@spearce.org> | 2010-02-05 12:57:37 -0800 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2010-02-05 20:57:16 -0800 |
commit | 4f41b611481bad08319966f7787fc7c4c7bfaa52 (patch) | |
tree | 3a333aed6eefc5c10742efc2dce64741e3fdc837 | |
parent | 2b26e0e18907132eaac2a8163de0cac552217082 (diff) | |
download | git-4f41b611481bad08319966f7787fc7c4c7bfaa52.tar.gz git-4f41b611481bad08319966f7787fc7c4c7bfaa52.tar.xz |
run-command: Allow stderr to be a caller supplied pipe
Like .out, .err may now be set to a file descriptor > 0, which
is a writable pipe/socket/file that the child's stderr will be
redirected into.
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r-- | Documentation/technical/api-run-command.txt | 2 | ||||
-rw-r--r-- | run-command.c | 8 | ||||
-rw-r--r-- | run-command.h | 2 |
3 files changed, 10 insertions, 2 deletions
diff --git a/Documentation/technical/api-run-command.txt b/Documentation/technical/api-run-command.txt index b26c28133..a1280dd83 100644 --- a/Documentation/technical/api-run-command.txt +++ b/Documentation/technical/api-run-command.txt @@ -135,7 +135,7 @@ stderr as follows: .in: The FD must be readable; it becomes child's stdin. .out: The FD must be writable; it becomes child's stdout. - .err > 0 is not supported. + .err: The FD must be writable; it becomes child's stderr. The specified FD is closed by start_command(), even if it fails to run the sub-process! diff --git a/run-command.c b/run-command.c index cf2d8f7fa..bfd231243 100644 --- a/run-command.c +++ b/run-command.c @@ -94,6 +94,9 @@ fail_pipe: else if (need_err) { dup2(fderr[1], 2); close_pair(fderr); + } else if (cmd->err > 1) { + dup2(cmd->err, 2); + close(cmd->err); } if (cmd->no_stdout) @@ -156,6 +159,9 @@ fail_pipe: } else if (need_err) { s2 = dup(2); dup2(fderr[1], 2); + } else if (cmd->err > 2) { + s2 = dup(2); + dup2(cmd->err, 2); } if (cmd->no_stdout) { @@ -228,6 +234,8 @@ fail_pipe: if (need_err) close(fderr[1]); + else if (cmd->err) + close(cmd->err); return 0; } diff --git a/run-command.h b/run-command.h index fb342090e..a29171ada 100644 --- a/run-command.h +++ b/run-command.h @@ -18,7 +18,7 @@ struct child_process { * - Specify > 0 to set a channel to a particular FD as follows: * .in: a readable FD, becomes child's stdin * .out: a writable FD, becomes child's stdout/stderr - * .err > 0 not supported + * .err: a writable FD, becomes child's stderr * The specified FD is closed by start_command(), even in case * of errors! */ |