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>
This commit is contained in:

committed by
Junio C Hamano

parent
2b26e0e189
commit
4f41b61148
@ -135,7 +135,7 @@ stderr as follows:
|
|||||||
|
|
||||||
.in: The FD must be readable; it becomes child's stdin.
|
.in: The FD must be readable; it becomes child's stdin.
|
||||||
.out: The FD must be writable; it becomes child's stdout.
|
.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
|
The specified FD is closed by start_command(), even if it fails to
|
||||||
run the sub-process!
|
run the sub-process!
|
||||||
|
@ -94,6 +94,9 @@ fail_pipe:
|
|||||||
else if (need_err) {
|
else if (need_err) {
|
||||||
dup2(fderr[1], 2);
|
dup2(fderr[1], 2);
|
||||||
close_pair(fderr);
|
close_pair(fderr);
|
||||||
|
} else if (cmd->err > 1) {
|
||||||
|
dup2(cmd->err, 2);
|
||||||
|
close(cmd->err);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cmd->no_stdout)
|
if (cmd->no_stdout)
|
||||||
@ -156,6 +159,9 @@ fail_pipe:
|
|||||||
} else if (need_err) {
|
} else if (need_err) {
|
||||||
s2 = dup(2);
|
s2 = dup(2);
|
||||||
dup2(fderr[1], 2);
|
dup2(fderr[1], 2);
|
||||||
|
} else if (cmd->err > 2) {
|
||||||
|
s2 = dup(2);
|
||||||
|
dup2(cmd->err, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cmd->no_stdout) {
|
if (cmd->no_stdout) {
|
||||||
@ -228,6 +234,8 @@ fail_pipe:
|
|||||||
|
|
||||||
if (need_err)
|
if (need_err)
|
||||||
close(fderr[1]);
|
close(fderr[1]);
|
||||||
|
else if (cmd->err)
|
||||||
|
close(cmd->err);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -18,7 +18,7 @@ struct child_process {
|
|||||||
* - Specify > 0 to set a channel to a particular FD as follows:
|
* - Specify > 0 to set a channel to a particular FD as follows:
|
||||||
* .in: a readable FD, becomes child's stdin
|
* .in: a readable FD, becomes child's stdin
|
||||||
* .out: a writable FD, becomes child's stdout/stderr
|
* .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
|
* The specified FD is closed by start_command(), even in case
|
||||||
* of errors!
|
* of errors!
|
||||||
*/
|
*/
|
||||||
|
Reference in New Issue
Block a user