Make Program::Wait provide an error message string for errors
authorDan Gohman <gohman@apple.com>
Fri, 29 Oct 2010 16:39:01 +0000 (16:39 +0000)
committerDan Gohman <gohman@apple.com>
Fri, 29 Oct 2010 16:39:01 +0000 (16:39 +0000)
executing the child process and abnormal child process termination.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@117661 91177308-0d34-0410-b5e6-96231b3b80d8

lib/System/Unix/Program.inc

index 110a6d14f48673de8f63e5eed64168f8009c4336..76012afcbaa3257b21bdf6bd935127584bcfa3de 100644 (file)
@@ -350,22 +350,32 @@ Program::Wait(unsigned secondsToWait,
     sigaction(SIGALRM, &Old, 0);
   }
 
-  // Return the proper exit status. 0=success, >0 is programs' exit status,
-  // <0 means a signal was returned, -9999999 means the program dumped core.
+  // Return the proper exit status. Detect error conditions
+  // so we can return -1 for them and set ErrMsg informatively.
   int result = 0;
-  if (WIFEXITED(status))
+  if (WIFEXITED(status)) {
     result = WEXITSTATUS(status);
-  else if (WIFSIGNALED(status))
-    result = 0 - WTERMSIG(status);
+    if (result == 127) {
+      *ErrMsg = llvm::sys::StrError(ENOENT);
+      return -1;
+    }
+    if (result == 126) {
+      *ErrMsg = "Program could not be executed";
+      return -1;
+    }
+  } else if (WIFSIGNALED(status)) {
+    *ErrMsg = strsignal(WTERMSIG(status));
 #ifdef WCOREDUMP
-  else if (WCOREDUMP(status))
-    result |= 0x01000000;
+    if (WCOREDUMP(status))
+      *ErrMsg += " (core dumped)";
 #endif
+    return -1;
+  }
   return result;
 #else
-  return -99;
+  *ErrMsg = "Program::Wait is not implemented on this platform yet!";
+  return -1;
 #endif
-
 }
 
 bool