aboutsummaryrefslogtreecommitdiffstats
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
parentf1d01fb6a45a6fa94d9f66a58107c98bfc451946 (diff)
downloadexternal_llvm-e5b3e1559b97e04f73ea01465a1810383468e9f7.tar.gz
external_llvm-e5b3e1559b97e04f73ea01465a1810383468e9f7.tar.bz2
external_llvm-e5b3e1559b97e04f73ea01465a1810383468e9f7.zip
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
-rw-r--r--include/Support/SystemUtils.h2
-rw-r--r--include/llvm/Support/SystemUtils.h2
-rw-r--r--lib/Support/SystemUtils.cpp36
-rw-r--r--support/lib/Support/SystemUtils.cpp36
4 files changed, 48 insertions, 28 deletions
diff --git a/include/Support/SystemUtils.h b/include/Support/SystemUtils.h
index 7a4c6277dc..b4d2c697f6 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 7a4c6277dc..b4d2c697f6 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 641358b235..7cb9f70936 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 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;
}