Code

run-command: Allow stderr to be a caller supplied pipe
authorShawn O. Pearce <spearce@spearce.org>
Fri, 5 Feb 2010 20:57:37 +0000 (12:57 -0800)
committerJunio C Hamano <gitster@pobox.com>
Sat, 6 Feb 2010 04:57:16 +0000 (20:57 -0800)
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>
Documentation/technical/api-run-command.txt
run-command.c
run-command.h

index b26c28133c143b23acf28fc1a3a06d16c10c65f8..a1280dd83755fc55ca13940b55ba37a64595b7f8 100644 (file)
@@ -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!
index cf2d8f7fae1356e50736cb9d599625df79738a2a..bfd231243d2293b1803fc3c3614f67279e959362 100644 (file)
@@ -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;
 }
index fb342090e3cac49f41689f9610bfe2d6c87c87c1..a29171adae9903420d29bdcdd4acb2191e683f75 100644 (file)
@@ -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!
         */