From e5b3e1559b97e04f73ea01465a1810383468e9f7 Mon Sep 17 00:00:00 2001 From: John Criswell Date: Wed, 17 Sep 2003 19:02:49 +0000 Subject: [PATCH] In ExecWait(), made the child process exit if it can't execve() the new program. Added the use of const (which compiles and is hopefully correct). Added comments. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@8585 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/Support/SystemUtils.h | 2 +- include/llvm/Support/SystemUtils.h | 2 +- lib/Support/SystemUtils.cpp | 36 ++++++++++++++++++----------- support/lib/Support/SystemUtils.cpp | 36 ++++++++++++++++++----------- 4 files changed, 48 insertions(+), 28 deletions(-) diff --git a/include/Support/SystemUtils.h b/include/Support/SystemUtils.h index 7a4c6277dc5..b4d2c697f6e 100644 --- a/include/Support/SystemUtils.h +++ b/include/Support/SystemUtils.h @@ -41,5 +41,5 @@ int RunProgramWithTimeout(const std::string &ProgramPath, const char **Args, /// Execute a program with the given arguments and environment and /// wait for it to terminate. /// -int ExecWait (char ** argv, char ** envp); +int ExecWait (const char * const argv[], const char * const envp[]); #endif diff --git a/include/llvm/Support/SystemUtils.h b/include/llvm/Support/SystemUtils.h index 7a4c6277dc5..b4d2c697f6e 100644 --- a/include/llvm/Support/SystemUtils.h +++ b/include/llvm/Support/SystemUtils.h @@ -41,5 +41,5 @@ int RunProgramWithTimeout(const std::string &ProgramPath, const char **Args, /// Execute a program with the given arguments and environment and /// wait for it to terminate. /// -int ExecWait (char ** argv, char ** envp); +int ExecWait (const char * const argv[], const char * const envp[]); #endif diff --git a/lib/Support/SystemUtils.cpp b/lib/Support/SystemUtils.cpp index 641358b2351..7cb9f70936c 100644 --- a/lib/Support/SystemUtils.cpp +++ b/lib/Support/SystemUtils.cpp @@ -192,8 +192,10 @@ int RunProgramWithTimeout(const std::string &ProgramPath, const char **Args, // a generic library function. The caller or executed program should report // errors in the way it sees fit. // +// This function does not use $PATH to find programs. +// int -ExecWait (char ** argv, char **envp) +ExecWait (const char * const old_argv[], const char * const old_envp[]) { // Child process ID register int child; @@ -202,32 +204,40 @@ ExecWait (char ** argv, char **envp) int status; // - // Because UNIX is sometimes less than convenient, we need to use - // FindExecutable() to find the full pathname to the file to execute. - // - // This is becausse execvp() doesn't use PATH, and we want to look for - // programs in the LLVM binary directory first anyway. + // Create local versions of the parameters that can be passed into execve() + // without creating const problems. // - std::string Program = FindExecutable (argv[0], ""); - if (Program.empty()) - { - return 1; - } + char ** const argv = (char ** const) old_argv; + char ** const envp = (char ** const) old_envp; // // Create a child process. // switch (child=fork()) { + // + // An error occured: Return to the caller. + // case -1: return 1; break; + // + // Child process: Execute the program. + // case 0: - execve (Program.c_str(), argv, envp); - return 1; + execve (argv[0], argv, envp); + + // + // If the execve() failed, we should exit and let the parent pick up + // our non-zero exit status. + // + exit (1); break; + // + // Parent process: Break out of the switch to do our processing. + // default: break; } diff --git a/support/lib/Support/SystemUtils.cpp b/support/lib/Support/SystemUtils.cpp index 641358b2351..7cb9f70936c 100644 --- a/support/lib/Support/SystemUtils.cpp +++ b/support/lib/Support/SystemUtils.cpp @@ -192,8 +192,10 @@ int RunProgramWithTimeout(const std::string &ProgramPath, const char **Args, // a generic library function. The caller or executed program should report // errors in the way it sees fit. // +// This function does not use $PATH to find programs. +// int -ExecWait (char ** argv, char **envp) +ExecWait (const char * const old_argv[], const char * const old_envp[]) { // Child process ID register int child; @@ -202,32 +204,40 @@ ExecWait (char ** argv, char **envp) int status; // - // Because UNIX is sometimes less than convenient, we need to use - // FindExecutable() to find the full pathname to the file to execute. - // - // This is becausse execvp() doesn't use PATH, and we want to look for - // programs in the LLVM binary directory first anyway. + // Create local versions of the parameters that can be passed into execve() + // without creating const problems. // - std::string Program = FindExecutable (argv[0], ""); - if (Program.empty()) - { - return 1; - } + char ** const argv = (char ** const) old_argv; + char ** const envp = (char ** const) old_envp; // // Create a child process. // switch (child=fork()) { + // + // An error occured: Return to the caller. + // case -1: return 1; break; + // + // Child process: Execute the program. + // case 0: - execve (Program.c_str(), argv, envp); - return 1; + execve (argv[0], argv, envp); + + // + // If the execve() failed, we should exit and let the parent pick up + // our non-zero exit status. + // + exit (1); break; + // + // Parent process: Break out of the switch to do our processing. + // default: break; } -- 2.34.1