From e5f77cda25169fcbadc32f0f0b3da2e00ba86b7c Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Fri, 29 Oct 2010 16:54:25 +0000 Subject: 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 --- lib/System/Unix/Program.inc | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) (limited to 'lib/System/Unix/Program.inc') 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; -- cgit v1.2.3-18-g5258