1
//===- llvm/System/Unix/Program.cpp -----------------------------*- C++ -*-===//
3
// The LLVM Compiler Infrastructure
5
// This file is distributed under the University of Illinois Open Source
6
// License. See LICENSE.TXT for details.
8
//===----------------------------------------------------------------------===//
10
// This file implements the Unix specific portion of the Program class.
12
//===----------------------------------------------------------------------===//
14
//===----------------------------------------------------------------------===//
15
//=== WARNING: Implementation here must contain only generic UNIX code that
16
//=== is guaranteed to work on *all* UNIX variants.
17
//===----------------------------------------------------------------------===//
19
#include <llvm/Config/config.h>
24
#if HAVE_SYS_RESOURCE_H
25
#include <sys/resource.h>
33
#ifdef HAVE_POSIX_SPAWN
35
#if !defined(__APPLE__)
36
extern char **environ;
38
#include <crt_externs.h> // _NSGetEnviron
45
Program::Program() : Data_(0) {}
47
Program::~Program() {}
49
unsigned Program::GetPid() const {
50
uint64_t pid = reinterpret_cast<uint64_t>(Data_);
51
return static_cast<unsigned>(pid);
54
// This function just uses the PATH environment variable to find the program.
56
Program::FindProgramByName(const std::string& progName) {
58
// Check some degenerate cases
59
if (progName.length() == 0) // no program
62
if (!temp.set(progName)) // invalid name
64
// Use the given path verbatim if it contains any slashes; this matches
65
// the behavior of sh(1) and friends.
66
if (progName.find('/') != std::string::npos)
69
// At this point, the file name does not contain slashes. Search for it
70
// through the directories specified in the PATH environment variable.
72
// Get the path. If its empty, we can't do anything to find it.
73
const char *PathStr = getenv("PATH");
77
// Now we have a colon separated list of directories to search; try them.
78
size_t PathLen = strlen(PathStr);
80
// Find the first colon...
81
const char *Colon = std::find(PathStr, PathStr+PathLen, ':');
83
// Check to see if this first directory contains the executable...
85
if (FilePath.set(std::string(PathStr,Colon))) {
86
FilePath.appendComponent(progName);
87
if (FilePath.canExecute())
88
return FilePath; // Found the executable!
91
// Nope it wasn't in this directory, check the next path in the list!
92
PathLen -= Colon-PathStr;
95
// Advance past duplicate colons
96
while (*PathStr == ':') {
104
static bool RedirectIO(const Path *Path, int FD, std::string* ErrMsg) {
105
if (Path == 0) // Noop
109
// Redirect empty paths to /dev/null
112
File = Path->c_str();
115
int InFD = open(File, FD == 0 ? O_RDONLY : O_WRONLY|O_CREAT, 0666);
117
MakeErrMsg(ErrMsg, "Cannot open file '" + std::string(File) + "' for "
118
+ (FD == 0 ? "input" : "output"));
122
// Install it as the requested FD
123
if (dup2(InFD, FD) == -1) {
124
MakeErrMsg(ErrMsg, "Cannot dup2");
128
close(InFD); // Close the original FD
132
#ifdef HAVE_POSIX_SPAWN
133
static bool RedirectIO_PS(const Path *Path, int FD, std::string *ErrMsg,
134
posix_spawn_file_actions_t &FileActions) {
135
if (Path == 0) // Noop
139
// Redirect empty paths to /dev/null
142
File = Path->c_str();
144
if (int Err = posix_spawn_file_actions_addopen(&FileActions, FD,
145
File, FD == 0 ? O_RDONLY : O_WRONLY|O_CREAT, 0666))
146
return MakeErrMsg(ErrMsg, "Cannot dup2", Err);
151
static void TimeOutHandler(int Sig) {
154
static void SetMemoryLimits (unsigned size)
156
#if HAVE_SYS_RESOURCE_H && HAVE_GETRLIMIT && HAVE_SETRLIMIT
158
__typeof__ (r.rlim_cur) limit = (__typeof__ (r.rlim_cur)) (size) * 1048576;
161
getrlimit (RLIMIT_DATA, &r);
163
setrlimit (RLIMIT_DATA, &r);
165
// Resident set size.
166
getrlimit (RLIMIT_RSS, &r);
168
setrlimit (RLIMIT_RSS, &r);
170
#ifdef RLIMIT_AS // e.g. NetBSD doesn't have it.
172
getrlimit (RLIMIT_AS, &r);
174
setrlimit (RLIMIT_AS, &r);
180
Program::Execute(const Path &path, const char **args, const char **envp,
181
const Path **redirects, unsigned memoryLimit,
182
std::string *ErrMsg) {
183
// If this OS has posix_spawn and there is no memory limit being implied, use
184
// posix_spawn. It is more efficient than fork/exec.
185
#ifdef HAVE_POSIX_SPAWN
186
if (memoryLimit == 0) {
187
posix_spawn_file_actions_t FileActions;
188
posix_spawn_file_actions_init(&FileActions);
191
// Redirect stdin/stdout.
192
if (RedirectIO_PS(redirects[0], 0, ErrMsg, FileActions) ||
193
RedirectIO_PS(redirects[1], 1, ErrMsg, FileActions))
195
if (redirects[1] == 0 || redirects[2] == 0 ||
196
*redirects[1] != *redirects[2]) {
197
// Just redirect stderr
198
if (RedirectIO_PS(redirects[2], 2, ErrMsg, FileActions)) return false;
200
// If stdout and stderr should go to the same place, redirect stderr
201
// to the FD already open for stdout.
202
if (int Err = posix_spawn_file_actions_adddup2(&FileActions, 1, 2))
203
return !MakeErrMsg(ErrMsg, "Can't redirect stderr to stdout", Err);
208
#if !defined(__APPLE__)
209
envp = const_cast<const char **>(environ);
211
// environ is missing in dylibs.
212
envp = const_cast<const char **>(*_NSGetEnviron());
216
int Err = posix_spawn(&PID, path.c_str(), &FileActions, /*attrp*/0,
217
const_cast<char **>(args), const_cast<char **>(envp));
219
posix_spawn_file_actions_destroy(&FileActions);
222
return !MakeErrMsg(ErrMsg, "posix_spawn failed", Err);
224
Data_ = reinterpret_cast<void*>(PID);
229
if (!path.canExecute()) {
231
*ErrMsg = path.str() + " is not executable";
235
// Create a child process.
238
// An error occured: Return to the caller.
240
MakeErrMsg(ErrMsg, "Couldn't fork");
243
// Child process: Execute the program.
245
// Redirect file descriptors...
248
if (RedirectIO(redirects[0], 0, ErrMsg)) { return false; }
250
if (RedirectIO(redirects[1], 1, ErrMsg)) { return false; }
251
if (redirects[1] && redirects[2] &&
252
*(redirects[1]) == *(redirects[2])) {
253
// If stdout and stderr should go to the same place, redirect stderr
254
// to the FD already open for stdout.
255
if (-1 == dup2(1,2)) {
256
MakeErrMsg(ErrMsg, "Can't redirect stderr to stdout");
260
// Just redirect stderr
261
if (RedirectIO(redirects[2], 2, ErrMsg)) { return false; }
266
if (memoryLimit!=0) {
267
SetMemoryLimits(memoryLimit);
273
const_cast<char **>(args),
274
const_cast<char **>(envp));
277
const_cast<char **>(args));
278
// If the execve() failed, we should exit. Follow Unix protocol and
279
// return 127 if the executable was not found, and 126 otherwise.
280
// Use _exit rather than exit so that atexit functions and static
281
// object destructors cloned from the parent process aren't
282
// redundantly run, and so that any data buffered in stdio buffers
283
// cloned from the parent aren't redundantly written out.
284
_exit(errno == ENOENT ? 127 : 126);
287
// Parent process: Break out of the switch to do our processing.
292
Data_ = reinterpret_cast<void*>(child);
298
Program::Wait(unsigned secondsToWait,
301
#ifdef HAVE_SYS_WAIT_H
302
struct sigaction Act, Old;
305
MakeErrMsg(ErrMsg, "Process not started!");
309
// Install a timeout handler. The handler itself does nothing, but the simple
310
// fact of having a handler at all causes the wait below to return with EINTR,
311
// unlike if we used SIG_IGN.
313
memset(&Act, 0, sizeof(Act));
314
Act.sa_handler = TimeOutHandler;
315
sigemptyset(&Act.sa_mask);
316
sigaction(SIGALRM, &Act, &Old);
317
alarm(secondsToWait);
320
// Parent process: Wait for the child process to terminate.
322
uint64_t pid = reinterpret_cast<uint64_t>(Data_);
323
pid_t child = static_cast<pid_t>(pid);
324
while (waitpid(pid, &status, 0) != child)
325
if (secondsToWait && errno == EINTR) {
327
kill(child, SIGKILL);
329
// Turn off the alarm and restore the signal handler
331
sigaction(SIGALRM, &Old, 0);
333
// Wait for child to die
334
if (wait(&status) != child)
335
MakeErrMsg(ErrMsg, "Child timed out but wouldn't die");
337
MakeErrMsg(ErrMsg, "Child timed out", 0);
339
return -1; // Timeout detected
340
} else if (errno != EINTR) {
341
MakeErrMsg(ErrMsg, "Error waiting for child process");
345
// We exited normally without timeout, so turn off the timer.
348
sigaction(SIGALRM, &Old, 0);
351
// Return the proper exit status. 0=success, >0 is programs' exit status,
352
// <0 means a signal was returned, -9999999 means the program dumped core.
354
if (WIFEXITED(status))
355
result = WEXITSTATUS(status);
356
else if (WIFSIGNALED(status))
357
result = 0 - WTERMSIG(status);
359
else if (WCOREDUMP(status))
360
result |= 0x01000000;
370
Program::Kill(std::string* ErrMsg) {
372
MakeErrMsg(ErrMsg, "Process not started!");
376
uint64_t pid64 = reinterpret_cast<uint64_t>(Data_);
377
pid_t pid = static_cast<pid_t>(pid64);
379
if (kill(pid, SIGKILL) != 0) {
380
MakeErrMsg(ErrMsg, "The process couldn't be killed!");
387
bool Program::ChangeStdinToBinary(){
388
// Do nothing, as Unix doesn't differentiate between text and binary.
392
bool Program::ChangeStdoutToBinary(){
393
// Do nothing, as Unix doesn't differentiate between text and binary.
397
bool Program::ChangeStderrToBinary(){
398
// Do nothing, as Unix doesn't differentiate between text and binary.