aboutsummaryrefslogtreecommitdiff
path: root/support/lib/Support/SystemUtils.cpp
diff options
context:
space:
mode:
authorJohn Criswell <criswell@uiuc.edu>2003-09-17 19:02:49 +0000
committerJohn Criswell <criswell@uiuc.edu>2003-09-17 19:02:49 +0000
commite5b3e1559b97e04f73ea01465a1810383468e9f7 (patch)
treeaf32dbbcd8231b04ddbb39bc3ce6da2bfb3a1c8f /support/lib/Support/SystemUtils.cpp
parentf1d01fb6a45a6fa94d9f66a58107c98bfc451946 (diff)
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
Diffstat (limited to 'support/lib/Support/SystemUtils.cpp')
-rw-r--r--support/lib/Support/SystemUtils.cpp36
1 files changed, 23 insertions, 13 deletions
diff --git a/support/lib/Support/SystemUtils.cpp b/support/lib/Support/SystemUtils.cpp
index 641358b235..7cb9f70936 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;
}