summaryrefslogtreecommitdiff
path: root/source/Target/ProcessLaunchInfo.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/Target/ProcessLaunchInfo.cpp')
-rw-r--r--source/Target/ProcessLaunchInfo.cpp348
1 files changed, 0 insertions, 348 deletions
diff --git a/source/Target/ProcessLaunchInfo.cpp b/source/Target/ProcessLaunchInfo.cpp
deleted file mode 100644
index ac1eba04f0cb8..0000000000000
--- a/source/Target/ProcessLaunchInfo.cpp
+++ /dev/null
@@ -1,348 +0,0 @@
-//===-- ProcessLaunchInfo.cpp -----------------------------------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include <climits>
-
-#include "lldb/Host/Config.h"
-#include "lldb/Host/FileSystem.h"
-#include "lldb/Host/HostInfo.h"
-#include "lldb/Target/FileAction.h"
-#include "lldb/Target/ProcessLaunchInfo.h"
-#include "lldb/Utility/Log.h"
-#include "lldb/Utility/StreamString.h"
-
-#include "llvm/Support/ConvertUTF.h"
-#include "llvm/Support/FileSystem.h"
-
-#if !defined(_WIN32)
-#include <limits.h>
-#endif
-
-using namespace lldb;
-using namespace lldb_private;
-
-//----------------------------------------------------------------------------
-// ProcessLaunchInfo member functions
-//----------------------------------------------------------------------------
-
-ProcessLaunchInfo::ProcessLaunchInfo()
- : ProcessInfo(), m_working_dir(), m_plugin_name(), m_flags(0),
- m_file_actions(), m_pty(new PseudoTerminal), m_resume_count(0),
- m_monitor_callback(nullptr), m_monitor_callback_baton(nullptr),
- m_monitor_signals(false), m_listener_sp(), m_hijack_listener_sp() {}
-
-ProcessLaunchInfo::ProcessLaunchInfo(const FileSpec &stdin_file_spec,
- const FileSpec &stdout_file_spec,
- const FileSpec &stderr_file_spec,
- const FileSpec &working_directory,
- uint32_t launch_flags)
- : ProcessInfo(), m_working_dir(), m_plugin_name(), m_flags(launch_flags),
- m_file_actions(), m_pty(new PseudoTerminal), m_resume_count(0),
- m_monitor_callback(nullptr), m_monitor_callback_baton(nullptr),
- m_monitor_signals(false), m_listener_sp(), m_hijack_listener_sp() {
- if (stdin_file_spec) {
- FileAction file_action;
- const bool read = true;
- const bool write = false;
- if (file_action.Open(STDIN_FILENO, stdin_file_spec, read, write))
- AppendFileAction(file_action);
- }
- if (stdout_file_spec) {
- FileAction file_action;
- const bool read = false;
- const bool write = true;
- if (file_action.Open(STDOUT_FILENO, stdout_file_spec, read, write))
- AppendFileAction(file_action);
- }
- if (stderr_file_spec) {
- FileAction file_action;
- const bool read = false;
- const bool write = true;
- if (file_action.Open(STDERR_FILENO, stderr_file_spec, read, write))
- AppendFileAction(file_action);
- }
- if (working_directory)
- SetWorkingDirectory(working_directory);
-}
-
-bool ProcessLaunchInfo::AppendCloseFileAction(int fd) {
- FileAction file_action;
- if (file_action.Close(fd)) {
- AppendFileAction(file_action);
- return true;
- }
- return false;
-}
-
-bool ProcessLaunchInfo::AppendDuplicateFileAction(int fd, int dup_fd) {
- FileAction file_action;
- if (file_action.Duplicate(fd, dup_fd)) {
- AppendFileAction(file_action);
- return true;
- }
- return false;
-}
-
-bool ProcessLaunchInfo::AppendOpenFileAction(int fd, const FileSpec &file_spec,
- bool read, bool write) {
- FileAction file_action;
- if (file_action.Open(fd, file_spec, read, write)) {
- AppendFileAction(file_action);
- return true;
- }
- return false;
-}
-
-bool ProcessLaunchInfo::AppendSuppressFileAction(int fd, bool read,
- bool write) {
- FileAction file_action;
- if (file_action.Open(fd, FileSpec(FileSystem::DEV_NULL), read, write)) {
- AppendFileAction(file_action);
- return true;
- }
- return false;
-}
-
-const FileAction *ProcessLaunchInfo::GetFileActionAtIndex(size_t idx) const {
- if (idx < m_file_actions.size())
- return &m_file_actions[idx];
- return nullptr;
-}
-
-const FileAction *ProcessLaunchInfo::GetFileActionForFD(int fd) const {
- for (size_t idx = 0, count = m_file_actions.size(); idx < count; ++idx) {
- if (m_file_actions[idx].GetFD() == fd)
- return &m_file_actions[idx];
- }
- return nullptr;
-}
-
-const FileSpec &ProcessLaunchInfo::GetWorkingDirectory() const {
- return m_working_dir;
-}
-
-void ProcessLaunchInfo::SetWorkingDirectory(const FileSpec &working_dir) {
- m_working_dir = working_dir;
-}
-
-const char *ProcessLaunchInfo::GetProcessPluginName() const {
- return (m_plugin_name.empty() ? nullptr : m_plugin_name.c_str());
-}
-
-void ProcessLaunchInfo::SetProcessPluginName(llvm::StringRef plugin) {
- m_plugin_name = plugin;
-}
-
-const FileSpec &ProcessLaunchInfo::GetShell() const { return m_shell; }
-
-void ProcessLaunchInfo::SetShell(const FileSpec &shell) {
- m_shell = shell;
- if (m_shell) {
- FileSystem::Instance().ResolveExecutableLocation(m_shell);
- m_flags.Set(lldb::eLaunchFlagLaunchInShell);
- } else
- m_flags.Clear(lldb::eLaunchFlagLaunchInShell);
-}
-
-void ProcessLaunchInfo::SetLaunchInSeparateProcessGroup(bool separate) {
- if (separate)
- m_flags.Set(lldb::eLaunchFlagLaunchInSeparateProcessGroup);
- else
- m_flags.Clear(lldb::eLaunchFlagLaunchInSeparateProcessGroup);
-}
-
-void ProcessLaunchInfo::SetShellExpandArguments(bool expand) {
- if (expand)
- m_flags.Set(lldb::eLaunchFlagShellExpandArguments);
- else
- m_flags.Clear(lldb::eLaunchFlagShellExpandArguments);
-}
-
-void ProcessLaunchInfo::Clear() {
- ProcessInfo::Clear();
- m_working_dir.Clear();
- m_plugin_name.clear();
- m_shell.Clear();
- m_flags.Clear();
- m_file_actions.clear();
- m_resume_count = 0;
- m_listener_sp.reset();
- m_hijack_listener_sp.reset();
-}
-
-void ProcessLaunchInfo::SetMonitorProcessCallback(
- const Host::MonitorChildProcessCallback &callback, bool monitor_signals) {
- m_monitor_callback = callback;
- m_monitor_signals = monitor_signals;
-}
-
-bool ProcessLaunchInfo::NoOpMonitorCallback(lldb::pid_t pid, bool exited, int signal, int status) {
- Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS);
- LLDB_LOG(log, "pid = {0}, exited = {1}, signal = {2}, status = {3}", pid,
- exited, signal, status);
- return true;
-}
-
-bool ProcessLaunchInfo::MonitorProcess() const {
- if (m_monitor_callback && ProcessIDIsValid()) {
- Host::StartMonitoringChildProcess(m_monitor_callback, GetProcessID(),
- m_monitor_signals);
- return true;
- }
- return false;
-}
-
-void ProcessLaunchInfo::SetDetachOnError(bool enable) {
- if (enable)
- m_flags.Set(lldb::eLaunchFlagDetachOnError);
- else
- m_flags.Clear(lldb::eLaunchFlagDetachOnError);
-}
-
-llvm::Error ProcessLaunchInfo::SetUpPtyRedirection() {
- Log *log = GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS);
- LLDB_LOG(log, "Generating a pty to use for stdin/out/err");
-
- int open_flags = O_RDWR | O_NOCTTY;
-#if !defined(_WIN32)
- // We really shouldn't be specifying platform specific flags that are
- // intended for a system call in generic code. But this will have to
- // do for now.
- open_flags |= O_CLOEXEC;
-#endif
- if (!m_pty->OpenFirstAvailableMaster(open_flags, nullptr, 0)) {
- return llvm::createStringError(llvm::inconvertibleErrorCode(),
- "PTY::OpenFirstAvailableMaster failed");
- }
- const FileSpec slave_file_spec(m_pty->GetSlaveName(nullptr, 0));
-
- // Only use the slave tty if we don't have anything specified for
- // input and don't have an action for stdin
- if (GetFileActionForFD(STDIN_FILENO) == nullptr)
- AppendOpenFileAction(STDIN_FILENO, slave_file_spec, true, false);
-
- // Only use the slave tty if we don't have anything specified for
- // output and don't have an action for stdout
- if (GetFileActionForFD(STDOUT_FILENO) == nullptr)
- AppendOpenFileAction(STDOUT_FILENO, slave_file_spec, false, true);
-
- // Only use the slave tty if we don't have anything specified for
- // error and don't have an action for stderr
- if (GetFileActionForFD(STDERR_FILENO) == nullptr)
- AppendOpenFileAction(STDERR_FILENO, slave_file_spec, false, true);
- return llvm::Error::success();
-}
-
-bool ProcessLaunchInfo::ConvertArgumentsForLaunchingInShell(
- Status &error, bool localhost, bool will_debug,
- bool first_arg_is_full_shell_command, int32_t num_resumes) {
- error.Clear();
-
- if (GetFlags().Test(eLaunchFlagLaunchInShell)) {
- if (m_shell) {
- std::string shell_executable = m_shell.GetPath();
-
- const char **argv = GetArguments().GetConstArgumentVector();
- if (argv == nullptr || argv[0] == nullptr)
- return false;
- Args shell_arguments;
- std::string safe_arg;
- shell_arguments.AppendArgument(shell_executable);
- const llvm::Triple &triple = GetArchitecture().GetTriple();
- if (triple.getOS() == llvm::Triple::Win32 &&
- !triple.isWindowsCygwinEnvironment())
- shell_arguments.AppendArgument(llvm::StringRef("/C"));
- else
- shell_arguments.AppendArgument(llvm::StringRef("-c"));
-
- StreamString shell_command;
- if (will_debug) {
- // Add a modified PATH environment variable in case argv[0] is a
- // relative path.
- const char *argv0 = argv[0];
- FileSpec arg_spec(argv0);
- if (arg_spec.IsRelative()) {
- // We have a relative path to our executable which may not work if we
- // just try to run "a.out" (without it being converted to "./a.out")
- FileSpec working_dir = GetWorkingDirectory();
- // Be sure to put quotes around PATH's value in case any paths have
- // spaces...
- std::string new_path("PATH=\"");
- const size_t empty_path_len = new_path.size();
-
- if (working_dir) {
- new_path += working_dir.GetPath();
- } else {
- llvm::SmallString<64> cwd;
- if (! llvm::sys::fs::current_path(cwd))
- new_path += cwd;
- }
- std::string curr_path;
- if (HostInfo::GetEnvironmentVar("PATH", curr_path)) {
- if (new_path.size() > empty_path_len)
- new_path += ':';
- new_path += curr_path;
- }
- new_path += "\" ";
- shell_command.PutCString(new_path);
- }
-
- if (triple.getOS() != llvm::Triple::Win32 ||
- triple.isWindowsCygwinEnvironment())
- shell_command.PutCString("exec");
-
- // Only Apple supports /usr/bin/arch being able to specify the
- // architecture
- if (GetArchitecture().IsValid() && // Valid architecture
- GetArchitecture().GetTriple().getVendor() ==
- llvm::Triple::Apple && // Apple only
- GetArchitecture().GetCore() !=
- ArchSpec::eCore_x86_64_x86_64h) // Don't do this for x86_64h
- {
- shell_command.Printf(" /usr/bin/arch -arch %s",
- GetArchitecture().GetArchitectureName());
- // Set the resume count to 2:
- // 1 - stop in shell
- // 2 - stop in /usr/bin/arch
- // 3 - then we will stop in our program
- SetResumeCount(num_resumes + 1);
- } else {
- // Set the resume count to 1:
- // 1 - stop in shell
- // 2 - then we will stop in our program
- SetResumeCount(num_resumes);
- }
- }
-
- if (first_arg_is_full_shell_command) {
- // There should only be one argument that is the shell command itself
- // to be used as is
- if (argv[0] && !argv[1])
- shell_command.Printf("%s", argv[0]);
- else
- return false;
- } else {
- for (size_t i = 0; argv[i] != nullptr; ++i) {
- const char *arg =
- Args::GetShellSafeArgument(m_shell, argv[i], safe_arg);
- shell_command.Printf(" %s", arg);
- }
- }
- shell_arguments.AppendArgument(shell_command.GetString());
- m_executable = m_shell;
- m_arguments = shell_arguments;
- return true;
- } else {
- error.SetErrorString("invalid shell path");
- }
- } else {
- error.SetErrorString("not launching in shell");
- }
- return false;
-}