aboutsummaryrefslogtreecommitdiff
path: root/lib/System/Win32/Program.cpp
diff options
context:
space:
mode:
authorReid Spencer <rspencer@reidspencer.com>2005-01-09 23:29:00 +0000
committerReid Spencer <rspencer@reidspencer.com>2005-01-09 23:29:00 +0000
commitbccc8abc79338d1cfdd5ea20f7288452ddf75b84 (patch)
treec7009daa6a24f65cb6addfee22bc6bc8f40b0d4b /lib/System/Win32/Program.cpp
parent5cdcc58d51c792d329202bab97c34aefbc043b15 (diff)
Rename Unix/*.cpp and Win32/*.cpp to have a *.inc suffix so that the silly
gdb debugger doesn't get confused on which file it is reading (the one in lib/System or the one in lib/System/{Win32,Unix}) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@19426 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/System/Win32/Program.cpp')
-rw-r--r--lib/System/Win32/Program.cpp169
1 files changed, 0 insertions, 169 deletions
diff --git a/lib/System/Win32/Program.cpp b/lib/System/Win32/Program.cpp
deleted file mode 100644
index 2d3580d3db..0000000000
--- a/lib/System/Win32/Program.cpp
+++ /dev/null
@@ -1,169 +0,0 @@
-//===- Win32/Program.cpp - Win32 Program Implementation ------- -*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file was developed by Jeff Cohen and is distributed under the
-// University of Illinois Open Source License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// This file provides the Win32 specific implementation of the Program class.
-//
-//===----------------------------------------------------------------------===//
-
-#include "Win32.h"
-#include <malloc.h>
-
-//===----------------------------------------------------------------------===//
-//=== WARNING: Implementation here must contain only Win32 specific code
-//=== and must not be UNIX code
-//===----------------------------------------------------------------------===//
-
-namespace llvm {
-using namespace sys;
-
-// This function just uses the PATH environment variable to find the program.
-Path
-Program::FindProgramByName(const std::string& progName) {
-
- // Check some degenerate cases
- if (progName.length() == 0) // no program
- return Path();
- Path temp;
- if (!temp.setFile(progName)) // invalid name
- return Path();
- if (temp.executable()) // already executable as is
- return temp;
-
- // At this point, the file name is valid and its not executable.
- // Let Windows search for it.
- char buffer[MAX_PATH];
- char *dummy = NULL;
- DWORD len = SearchPath(NULL, progName.c_str(), ".exe", MAX_PATH,
- buffer, &dummy);
-
- // See if it wasn't found.
- if (len == 0)
- return Path();
-
- // See if we got the entire path.
- if (len < MAX_PATH)
- return Path(buffer);
-
- // Buffer was too small; grow and retry.
- while (true) {
- char *b = reinterpret_cast<char *>(_alloca(len+1));
- DWORD len2 = SearchPath(NULL, progName.c_str(), ".exe", len+1, b, &dummy);
-
- // It is unlikely the search failed, but it's always possible some file
- // was added or removed since the last search, so be paranoid...
- if (len2 == 0)
- return Path();
- else if (len2 <= len)
- return Path(b);
-
- len = len2;
- }
-}
-
-//
-int
-Program::ExecuteAndWait(const Path& path,
- const char** args,
- const char** envp,
- const Path** redirects,
- unsigned secondsToWait) {
- if (!path.executable())
- throw path.toString() + " is not executable";
-
- // Windows wants a command line, not an array of args, to pass to the new
- // process. We have to concatenate them all, while quoting the args that
- // have embedded spaces.
-
- // First, determine the length of the command line.
- std::string progname(path.getLast());
- unsigned len = progname.length() + 1;
- if (progname.find(' ') != std::string::npos)
- len += 2;
-
- for (unsigned i = 0; args[i]; i++) {
- len += strlen(args[i]) + 1;
- if (strchr(args[i], ' '))
- len += 2;
- }
-
- // Now build the command line.
- char *command = reinterpret_cast<char *>(_alloca(len));
- char *p = command;
-
- bool needsQuoting = progname.find(' ') != std::string::npos;
- if (needsQuoting)
- *p++ = '"';
- memcpy(p, progname.c_str(), progname.length());
- p += progname.length();
- if (needsQuoting)
- *p++ = '"';
- *p++ = ' ';
-
- for (unsigned i = 0; args[i]; i++) {
- const char *arg = args[i];
- size_t len = strlen(arg);
- needsQuoting = strchr(arg, ' ') != 0;
- if (needsQuoting)
- *p++ = '"';
- memcpy(p, arg, len);
- p += len;
- if (needsQuoting)
- *p++ = '"';
- *p++ = ' ';
- }
-
- *p = 0;
-
- // Create a child process.
- STARTUPINFO si;
- memset(&si, 0, sizeof(si));
- si.cb = sizeof(si);
-
- // TODO: do replacement of standard input/output/error handles.
-
- PROCESS_INFORMATION pi;
- memset(&pi, 0, sizeof(pi));
-
- if (!CreateProcess(path.c_str(), command, NULL, NULL, FALSE, 0,
- envp, NULL, &si, &pi))
- {
- ThrowError(std::string("Couldn't execute program '") +
- path.toString() + "'");
- }
-
- // Wait for it to terminate.
- DWORD millisecondsToWait = INFINITE;
- if (secondsToWait > 0)
- millisecondsToWait = secondsToWait * 1000;
-
- if (WaitForSingleObject(pi.hProcess, millisecondsToWait) == WAIT_TIMEOUT) {
- if (!TerminateProcess(pi.hProcess, 1)) {
- ThrowError(std::string("Failed to terminate timed-out program '") +
- path.toString() + "'");
- }
- WaitForSingleObject(pi.hProcess, INFINITE);
- }
-
- // Get its exit status.
- DWORD status;
- BOOL rc = GetExitCodeProcess(pi.hProcess, &status);
-
- // Done with the handles; go close them.
- CloseHandle(pi.hProcess);
- CloseHandle(pi.hThread);
-
- if (!rc)
- ThrowError(std::string("Failed getting status for program '") +
- path.toString() + "'");
-
- return status;
-}
-
-}
-// vim: sw=2 smartindent smarttab tw=80 autoindent expandtab