diff options
author | Dan Gohman <gohman@apple.com> | 2010-10-29 16:54:25 +0000 |
---|---|---|
committer | Dan Gohman <gohman@apple.com> | 2010-10-29 16:54:25 +0000 |
commit | e5f77cda25169fcbadc32f0f0b3da2e00ba86b7c (patch) | |
tree | 69ac8f68d8338ead3821fe230376627d5d36f6f8 /lib/System/Unix/Program.inc | |
parent | d8d716fad3eefce98fac5a76a70250d89fcf9a20 (diff) |
Make Program::Wait differentiate execution failure due to the file
being not found from the file being not executable.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@117664 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/System/Unix/Program.inc')
-rw-r--r-- | lib/System/Unix/Program.inc | 17 |
1 files changed, 10 insertions, 7 deletions
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; |