mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-04 18:24:38 +00:00
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
This commit is contained in:
@ -90,12 +90,13 @@ namespace sys {
|
|||||||
/// @see Execute
|
/// @see Execute
|
||||||
/// @brief Waits for the program to exit.
|
/// @brief Waits for the program to exit.
|
||||||
int Wait
|
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
|
///< of time to wait for the child process to exit. If the time
|
||||||
///< expires, the child is killed and this call returns. If zero,
|
///< expires, the child is killed and this call returns. If zero,
|
||||||
///< this function will wait until the child finishes or forever if
|
///< this function will wait until the child finishes or forever if
|
||||||
///< it doesn't.
|
///< 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
|
///< instance in which error messages will be returned. If the string
|
||||||
///< is non-empty upon return an error occurred while waiting.
|
///< is non-empty upon return an error occurred while waiting.
|
||||||
);
|
);
|
||||||
|
@ -31,7 +31,7 @@ Program::ExecuteAndWait(const Path& path,
|
|||||||
std::string* ErrMsg) {
|
std::string* ErrMsg) {
|
||||||
Program prg;
|
Program prg;
|
||||||
if (prg.Execute(path, args, envp, redirects, memoryLimit, ErrMsg))
|
if (prg.Execute(path, args, envp, redirects, memoryLimit, ErrMsg))
|
||||||
return prg.Wait(secondsToWait, ErrMsg);
|
return prg.Wait(path, secondsToWait, ErrMsg);
|
||||||
else
|
else
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -228,12 +228,6 @@ Program::Execute(const Path &path, const char **args, const char **envp,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!path.canExecute()) {
|
|
||||||
if (ErrMsg)
|
|
||||||
*ErrMsg = path.str() + " is not executable";
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create a child process.
|
// Create a child process.
|
||||||
int child = fork();
|
int child = fork();
|
||||||
switch (child) {
|
switch (child) {
|
||||||
@ -297,7 +291,8 @@ Program::Execute(const Path &path, const char **args, const char **envp,
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
Program::Wait(unsigned secondsToWait,
|
Program::Wait(const sys::Path &path,
|
||||||
|
unsigned secondsToWait,
|
||||||
std::string* ErrMsg)
|
std::string* ErrMsg)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_SYS_WAIT_H
|
#ifdef HAVE_SYS_WAIT_H
|
||||||
@ -355,6 +350,14 @@ Program::Wait(unsigned secondsToWait,
|
|||||||
int result = 0;
|
int result = 0;
|
||||||
if (WIFEXITED(status)) {
|
if (WIFEXITED(status)) {
|
||||||
result = WEXITSTATUS(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) {
|
if (result == 127) {
|
||||||
*ErrMsg = llvm::sys::StrError(ENOENT);
|
*ErrMsg = llvm::sys::StrError(ENOENT);
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -337,7 +337,8 @@ Program::Execute(const Path& path,
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
Program::Wait(unsigned secondsToWait,
|
Program::Wait(const Path &path,
|
||||||
|
unsigned secondsToWait,
|
||||||
std::string* ErrMsg) {
|
std::string* ErrMsg) {
|
||||||
if (Data_ == 0) {
|
if (Data_ == 0) {
|
||||||
MakeErrMsg(ErrMsg, "Process not started!");
|
MakeErrMsg(ErrMsg, "Process not started!");
|
||||||
|
Reference in New Issue
Block a user