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 | fc81579b5e10b1c627c1bdbd9d1d035868cf11ee (patch) | |
tree | bc10e40064cbd10a57f8aa991b420046046e4f02 /llvm/lib/System/Unix | |
parent | 305ec65927b64b9b35406c6680d0751df29b36c2 (diff) | |
download | bcm5719-llvm-fc81579b5e10b1c627c1bdbd9d1d035868cf11ee.tar.gz bcm5719-llvm-fc81579b5e10b1c627c1bdbd9d1d035868cf11ee.zip |
Make Program::Wait differentiate execution failure due to the file
being not found from the file being not executable.
llvm-svn: 117664
Diffstat (limited to 'llvm/lib/System/Unix')
-rw-r--r-- | llvm/lib/System/Unix/Program.inc | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/llvm/lib/System/Unix/Program.inc b/llvm/lib/System/Unix/Program.inc index 76012afcbaa..b92d080bab4 100644 --- a/llvm/lib/System/Unix/Program.inc +++ b/llvm/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; |