diff options
author | Reid Spencer <rspencer@reidspencer.com> | 2004-12-13 23:15:32 +0000 |
---|---|---|
committer | Reid Spencer <rspencer@reidspencer.com> | 2004-12-13 23:15:32 +0000 |
commit | 90484fb9a2847a217f6dbd584cc9ddfcb8b5fa33 (patch) | |
tree | 4618e009ceefa72749c838148e1d7d79b7d10c7b /tools/llee/SysUtils.c | |
parent | 395fd5949b5c73721c9ee9a8a5b14fe7ed791749 (diff) |
For PR351:
llee was a nice hack, but it wasn't portable so its gone, with Misha's
approval. Operating systems have facilities available for making bytecode
directly executable without this utility.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@18916 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools/llee/SysUtils.c')
-rw-r--r-- | tools/llee/SysUtils.c | 127 |
1 files changed, 0 insertions, 127 deletions
diff --git a/tools/llee/SysUtils.c b/tools/llee/SysUtils.c deleted file mode 100644 index 60912b246d..0000000000 --- a/tools/llee/SysUtils.c +++ /dev/null @@ -1,127 +0,0 @@ -/*===- SystemUtils.h - Utilities to do low-level system stuff -------------===*\ - * - * The LLVM Compiler Infrastructure - * - * This file was developed by the LLVM research group and is distributed under - * the University of Illinois Open Source License. See LICENSE.TXT for details. - * - *===----------------------------------------------------------------------=== - * - * This file contains functions used to do a variety of low-level, often - * system-specific, tasks. - * -\*===----------------------------------------------------------------------===*/ - -#include "SysUtils.h" -#include "llvm/Config/dlfcn.h" -#include "llvm/Config/fcntl.h" -#include "llvm/Config/unistd.h" -#include "llvm/Config/sys/stat.h" -#include "llvm/Config/sys/types.h" -#include "llvm/Config/sys/wait.h" -#include <errno.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -/* - * isExecutable - This function returns true if given struct stat describes the - * file as being executable. - */ -unsigned isExecutable(const struct stat *buf) { - if (!(buf->st_mode & S_IFREG)) - return 0; // Not a regular file? - - if (buf->st_uid == getuid()) // Owner of file? - return buf->st_mode & S_IXUSR; - else if (buf->st_gid == getgid()) // In group of file? - return buf->st_mode & S_IXGRP; - else // Unrelated to file? - return buf->st_mode & S_IXOTH; -} - -/* - * isExecutableFile - This function returns true if the filename specified - * exists and is executable. - */ -unsigned isExecutableFile(const char *ExeFileName) { - struct stat buf; - if (stat(ExeFileName, &buf)) - return 0; // Must not be executable! - - return isExecutable(&buf); -} - - -/* - * FindExecutable - Find a named executable in the directories listed in $PATH. - * If the executable cannot be found, returns NULL. - */ -char *FindExecutable(const char *ExeName) { - /* Try to find the executable in the path */ - const char *PathStr = getenv("PATH"); - if (PathStr == 0) return 0; - - /* Now we have a colon separated list of directories to search, try them. */ - unsigned PathLen = strlen(PathStr); - while (PathLen) { - /* Find the next colon */ - const char *Colon = strchr(PathStr, ':'); - - /* Check to see if this first directory contains the executable... */ - unsigned DirLen = Colon ? (unsigned)(Colon-PathStr) : strlen(PathStr); - char *FilePath = alloca(sizeof(char) * (DirLen+1+strlen(ExeName)+1)); - unsigned i, e; - for (i = 0; i != DirLen; ++i) - FilePath[i] = PathStr[i]; - FilePath[i] = '/'; - for (i = 0, e = strlen(ExeName); i != e; ++i) - FilePath[DirLen + 1 + i] = ExeName[i]; - FilePath[DirLen + 1 + i] = '\0'; - if (isExecutableFile(FilePath)) - return strdup(FilePath); /* Found the executable! */ - - /* If Colon is NULL, there are no more colon separators and no more dirs */ - if (!Colon) break; - - /* Nope, it wasn't in this directory, check the next range! */ - PathLen -= DirLen; - PathStr = Colon; - while (*PathStr == ':') { /* Advance past colons */ - PathStr++; - PathLen--; - } - - /* Advance past the colon */ - ++Colon; - } - - /* If we fell out, we ran out of directories to search, return failure. */ - return NULL; -} - -/* - * The type of the execve() function is long and boring, but required. - */ -typedef int(*execveTy)(const char*, char *const[], char *const[]); - -/* - * This method finds the real `execve' call in the C library and executes the - * given program. - */ -int executeProgram(const char *filename, char *const argv[], char *const envp[]) -{ - /* - * Find a pointer to the *real* execve() function starting the search in the - * next library and forward, to avoid finding the one defined in this file. - */ - const char *error; - execveTy execvePtr = (execveTy) dlsym(RTLD_NEXT, "execve"); - if ((error = dlerror()) != NULL) { - fprintf(stderr, "%s\n", error); - return -1; - } - - /* Really execute the program */ - return execvePtr(filename, argv, envp); -} |