diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/System/Program.cpp | 2 | ||||
-rw-r--r-- | lib/System/Unix/Program.inc | 17 | ||||
-rw-r--r-- | lib/System/Win32/Program.inc | 3 |
3 files changed, 13 insertions, 9 deletions
diff --git a/lib/System/Program.cpp b/lib/System/Program.cpp index cd58c2cc57..90aba763fa 100644 --- a/lib/System/Program.cpp +++ b/lib/System/Program.cpp @@ -31,7 +31,7 @@ Program::ExecuteAndWait(const Path& path, 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; } diff --git a/lib/System/Unix/Program.inc b/lib/System/Unix/Program.inc index 76012afcba..b92d080bab 100644 --- a/lib/System/Unix/Program.inc +++ b/lib/System/Unix/Program.inc @@ -228,12 +228,6 @@ Program::Execute(const Path &path, const char **args, const char **envp, } #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 @@ Program::Execute(const Path &path, const char **args, const char **envp, } 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 @@ Program::Wait(unsigned secondsToWait, 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; diff --git a/lib/System/Win32/Program.inc b/lib/System/Win32/Program.inc index ea1b5a6a06..b55aa2fa80 100644 --- a/lib/System/Win32/Program.inc +++ b/lib/System/Win32/Program.inc @@ -337,7 +337,8 @@ Program::Execute(const Path& path, } int -Program::Wait(unsigned secondsToWait, +Program::Wait(const Path &path, + unsigned secondsToWait, std::string* ErrMsg) { if (Data_ == 0) { MakeErrMsg(ErrMsg, "Process not started!"); |