summaryrefslogtreecommitdiff
path: root/lib/System
diff options
context:
space:
mode:
authorDan Gohman <gohman@apple.com>2010-10-29 16:54:25 +0000
committerDan Gohman <gohman@apple.com>2010-10-29 16:54:25 +0000
commite5f77cda25169fcbadc32f0f0b3da2e00ba86b7c (patch)
tree69ac8f68d8338ead3821fe230376627d5d36f6f8 /lib/System
parentd8d716fad3eefce98fac5a76a70250d89fcf9a20 (diff)
downloadllvm-e5f77cda25169fcbadc32f0f0b3da2e00ba86b7c.tar.gz
llvm-e5f77cda25169fcbadc32f0f0b3da2e00ba86b7c.tar.bz2
llvm-e5f77cda25169fcbadc32f0f0b3da2e00ba86b7c.tar.xz
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')
-rw-r--r--lib/System/Program.cpp2
-rw-r--r--lib/System/Unix/Program.inc17
-rw-r--r--lib/System/Win32/Program.inc3
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!");