aboutsummaryrefslogtreecommitdiff
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)
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;
}