Make Program::Wait differentiate execution failure due to the file

being not found from the file being not executable. 

llvm-svn: 117664
This commit is contained in:
Dan Gohman 2010-10-29 16:54:25 +00:00
parent 305ec65927
commit fc81579b5e
4 changed files with 16 additions and 11 deletions

View File

@ -90,12 +90,13 @@ namespace sys {
/// @see Execute
/// @brief Waits for the program to exit.
int Wait
( unsigned secondsToWait = 0, ///< If non-zero, this specifies the amount
( const Path& path, ///< The path to the child process executable.
unsigned secondsToWait, ///< If non-zero, this specifies the amount
///< of time to wait for the child process to exit. If the time
///< expires, the child is killed and this call returns. If zero,
///< this function will wait until the child finishes or forever if
///< it doesn't.
std::string* ErrMsg = 0 ///< If non-zero, provides a pointer to a string
std::string* ErrMsg ///< If non-zero, provides a pointer to a string
///< instance in which error messages will be returned. If the string
///< is non-empty upon return an error occurred while waiting.
);

View File

@ -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;
}

View File

@ -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;

View File

@ -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!");