Treat redirection of standard handles on Windows as it is done on Unix.
authorEli Zaretskii <eliz@gnu.org>
Wed, 1 Oct 2014 15:26:28 +0000 (18:26 +0300)
committerEli Zaretskii <eliz@gnu.org>
Wed, 1 Oct 2014 15:26:28 +0000 (18:26 +0300)
* job.c (start_job_command) [WINDOWS32]: Compute outfd and errfd
as on Posix platforms, and pass the results to process_easy.
* function.c (windows32_openpipe) [WINDOWS32]: Accept an
additional argument ERRFD and use it for redirecting the standard
error handle passed to the subprocess.
(func_shell_base) [WINDOWS32]: Pass the computed errfd to
windows32_openpipe.

function.c
job.c

index 9bb0623103d4c9cf19dc5640865a1333374cd0af..169c3a17e8802f1c47bfb391293e9a2e5bfc67d1 100644 (file)
@@ -1454,7 +1454,7 @@ int shell_function_pid = 0, shell_function_completed;
 
 
 int
-windows32_openpipe (int *pipedes, pid_t *pid_p, char **command_argv, char **envp)
+windows32_openpipe (int *pipedes, int errfd, pid_t *pid_p, char **command_argv, char **envp)
 {
   SECURITY_ATTRIBUTES saAttr;
   HANDLE hIn = INVALID_HANDLE_VALUE;
@@ -1500,7 +1500,7 @@ windows32_openpipe (int *pipedes, pid_t *pid_p, char **command_argv, char **envp
           return -1;
         }
     }
-  tmpErr = GetStdHandle (STD_ERROR_HANDLE);
+  tmpErr = (HANDLE)_get_osfhandle (errfd);
   if (DuplicateHandle (GetCurrentProcess (), tmpErr,
                        GetCurrentProcess (), &hErr,
                        0, TRUE, DUPLICATE_SAME_ACCESS) == FALSE)
@@ -1729,7 +1729,7 @@ func_shell_base (char *o, char **argv, int trim_newlines)
       return o;
     }
 #elif defined(WINDOWS32)
-  windows32_openpipe (pipedes, &pid, command_argv, envp);
+  windows32_openpipe (pipedes, errfd, &pid, command_argv, envp);
   /* Restore the value of just_print_flag.  */
   just_print_flag = j_p_f;
 
diff --git a/job.c b/job.c
index cb10f64ae7320a8f706adea249d4790161192cfc..d22e26c4a9cd6518294a029d36b809e4d4b7be78 100644 (file)
--- a/job.c
+++ b/job.c
@@ -1639,14 +1639,18 @@ start_job_command (struct child *child)
       sync_Path_environment ();
 
 #ifndef NO_OUTPUT_SYNC
-          /* Divert child output if output_sync in use.  Don't capture
-             recursive make output unless we are synchronizing "make" mode.  */
-          if (child->output.syncout)
-            hPID = process_easy (argv, child->environment,
-                                 child->output.out, child->output.err);
-          else
+      /* Divert child output if output_sync in use.  */
+      if (child->output.syncout)
+        {
+          if (child->output.out >= 0)
+            outfd = child->output.out;
+          if (child->output.err >= 0)
+            errfd = child->output.err;
+        }
+#else
+      outfd = errfd = -1;
 #endif
-            hPID = process_easy (argv, child->environment, -1, -1);
+      hPID = process_easy (argv, child->environment, outfd, errfd);
 
       if (hPID != INVALID_HANDLE_VALUE)
         child->pid = (pid_t) hPID;