]> git.saurik.com Git - wxWidgets.git/commitdiff
Don't ignore child process output if it exits with -1 exit code.
authorVadim Zeitlin <vadim@wxwidgets.org>
Wed, 3 Jul 2013 00:33:04 +0000 (00:33 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Wed, 3 Jul 2013 00:33:04 +0000 (00:33 +0000)
While this code is used by us if the program couldn't be launched at all, it
doesn't mean that it didn't run as -1 could also be returned by the child
process to indicate an error after outputting something, so we should still
read its output in this case.

Closes #15205.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@74352 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/changes.txt
samples/exec/exec.cpp
src/common/utilscmn.cpp

index ca2dc13101d4eb5255a5334c53f777fb59464961..d72694e1a34e71cec66d02ca63816d59077769fa 100644 (file)
@@ -575,6 +575,7 @@ All:
   wxEVT_COMMAND_MENU_SELECTED is now wxEVT_MENU (but the old name remains
   available for compatibility) (Catalin Raceanu).
 - Fix wxExecute() implementation under Unix (Rob Bresalier).
+- Also fix reading output from children exiting with -1 () (Jonathan Dagresta).
 - Add wxEvtHandler::CallAfter() method for asynchronous method calls.
 - Add support for symlinks to wxFileName (David Hart).
 - Add wxDIR_NO_FOLLOW flag for wxDir traversal (David Hart).
index d72c89a7adb37a9c9c81de81ae4685e16fd44da9..ada37bb7ac233b319a4981ff779be79c38bccea3 100644 (file)
@@ -962,11 +962,8 @@ void MyFrame::OnExecWithRedirect(wxCommandEvent& WXUNUSED(event))
         wxLogStatus("Command \"%s\" terminated after %ldms; exit code %d.",
                     cmd, sw.Time(), code);
 
-        if ( code != -1 )
-        {
-            ShowOutput(cmd, output, wxT("Output"));
-            ShowOutput(cmd, errors, wxT("Errors"));
-        }
+        ShowOutput(cmd, output, wxT("Output"));
+        ShowOutput(cmd, errors, wxT("Errors"));
     }
     else // async exec
     {
index a451976b170e9e06ed2c08cf383be6ce37b6ec7e..f5ba00045b353b1969facff50324b6799bb591cb 100644 (file)
@@ -618,13 +618,15 @@ bool wxGetEnvMap(wxEnvVariableHashMap *map)
 // wxExecute
 // ----------------------------------------------------------------------------
 
-// wxDoExecuteWithCapture() helper: reads an entire stream into one array
+// wxDoExecuteWithCapture() helper: reads an entire stream into one array if
+// the stream is non-NULL (it doesn't do anything if it's NULL).
 //
 // returns true if ok, false if error
 #if wxUSE_STREAMS
 static bool ReadAll(wxInputStream *is, wxArrayString& output)
 {
-    wxCHECK_MSG( is, false, wxT("NULL stream in wxExecute()?") );
+    if ( !is )
+        return true;
 
     // the stream could be already at EOF or in wxSTREAM_BROKEN_PIPE state
     is->Reset();
@@ -671,17 +673,16 @@ static long wxDoExecuteWithCapture(const wxString& command,
     long rc = wxExecute(command, wxEXEC_SYNC | flags, process, env);
 
 #if wxUSE_STREAMS
-    if ( rc != -1 )
+    // Notice that while -1 indicates an error exit code for us, a program
+    // exiting with this code could still have written something to its stdout
+    // and, especially, stderr, so we still need to read from them.
+    if ( !ReadAll(process->GetInputStream(), output) )
+        rc = -1;
+
+    if ( error )
     {
-        if ( !ReadAll(process->GetInputStream(), output) )
+        if ( !ReadAll(process->GetErrorStream(), *error) )
             rc = -1;
-
-        if ( error )
-        {
-            if ( !ReadAll(process->GetErrorStream(), *error) )
-                rc = -1;
-        }
-
     }
 #else
     wxUnusedVar(output);