[llvm-commits] [llvm] r117664 - in /llvm/trunk: include/llvm/System/Program.h lib/System/Program.cpp lib/System/Unix/Program.inc lib/System/Win32/Program.inc

Dan Gohman gohman at apple.com
Fri Oct 29 09:54:25 PDT 2010


Author: djg
Date: Fri Oct 29 11:54:25 2010
New Revision: 117664

URL: http://llvm.org/viewvc/llvm-project?rev=117664&view=rev
Log:
Make Program::Wait differentiate execution failure due to the file
being not found from the file being not executable. 

Modified:
    llvm/trunk/include/llvm/System/Program.h
    llvm/trunk/lib/System/Program.cpp
    llvm/trunk/lib/System/Unix/Program.inc
    llvm/trunk/lib/System/Win32/Program.inc

Modified: llvm/trunk/include/llvm/System/Program.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/System/Program.h?rev=117664&r1=117663&r2=117664&view=diff
==============================================================================
--- llvm/trunk/include/llvm/System/Program.h (original)
+++ llvm/trunk/include/llvm/System/Program.h Fri Oct 29 11:54:25 2010
@@ -90,12 +90,13 @@
     /// @see Execute
     /// @brief Waits for the program to exit.
     int Wait
-    ( unsigned secondsToWait = 0, ///< If non-zero, this specifies the amount
+    ( const Path& path, ///< The path to the child process executable.
+      unsigned secondsToWait, ///< If non-zero, this specifies the amount
       ///< of time to wait for the child process to exit. If the time
       ///< expires, the child is killed and this call returns. If zero,
       ///< this function will wait until the child finishes or forever if
       ///< it doesn't.
-      std::string* ErrMsg = 0 ///< If non-zero, provides a pointer to a string
+      std::string* ErrMsg ///< If non-zero, provides a pointer to a string
       ///< instance in which error messages will be returned. If the string
       ///< is non-empty upon return an error occurred while waiting.
       );

Modified: llvm/trunk/lib/System/Program.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Program.cpp?rev=117664&r1=117663&r2=117664&view=diff
==============================================================================
--- llvm/trunk/lib/System/Program.cpp (original)
+++ llvm/trunk/lib/System/Program.cpp Fri Oct 29 11:54:25 2010
@@ -31,7 +31,7 @@
                         std::string* ErrMsg) {
   Program prg;
   if (prg.Execute(path, args, envp, redirects, memoryLimit, ErrMsg))
-    return prg.Wait(secondsToWait, ErrMsg);
+    return prg.Wait(path, secondsToWait, ErrMsg);
   else
     return -1;
 }

Modified: llvm/trunk/lib/System/Unix/Program.inc
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Unix/Program.inc?rev=117664&r1=117663&r2=117664&view=diff
==============================================================================
--- llvm/trunk/lib/System/Unix/Program.inc (original)
+++ llvm/trunk/lib/System/Unix/Program.inc Fri Oct 29 11:54:25 2010
@@ -228,12 +228,6 @@
   }
 #endif
 
-  if (!path.canExecute()) {
-    if (ErrMsg)
-      *ErrMsg = path.str() + " is not executable";
-    return false;
-  }
-
   // Create a child process.
   int child = fork();
   switch (child) {
@@ -297,7 +291,8 @@
 }
 
 int
-Program::Wait(unsigned secondsToWait,
+Program::Wait(const sys::Path &path,
+              unsigned secondsToWait,
               std::string* ErrMsg)
 {
 #ifdef HAVE_SYS_WAIT_H
@@ -355,6 +350,14 @@
   int result = 0;
   if (WIFEXITED(status)) {
     result = WEXITSTATUS(status);
+#ifdef HAVE_POSIX_SPAWN
+    // The posix_spawn child process returns 127 on any kind of error.
+    // Following the POSIX convention for command-line tools (which posix_spawn
+    // itself apparently does not), check to see if the failure was due to some
+    // reason other than the file not existing, and return 126 in this case.
+    if (result == 127 && path.exists())
+      result = 126;
+#endif
     if (result == 127) {
       *ErrMsg = llvm::sys::StrError(ENOENT);
       return -1;

Modified: llvm/trunk/lib/System/Win32/Program.inc
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Win32/Program.inc?rev=117664&r1=117663&r2=117664&view=diff
==============================================================================
--- llvm/trunk/lib/System/Win32/Program.inc (original)
+++ llvm/trunk/lib/System/Win32/Program.inc Fri Oct 29 11:54:25 2010
@@ -337,7 +337,8 @@
 }
 
 int
-Program::Wait(unsigned secondsToWait,
+Program::Wait(const Path &path,
+              unsigned secondsToWait,
               std::string* ErrMsg) {
   if (Data_ == 0) {
     MakeErrMsg(ErrMsg, "Process not started!");





More information about the llvm-commits mailing list