diff options
| author | Daniel Malea <daniel.malea@intel.com> | 2013-01-08 14:49:22 +0000 |
|---|---|---|
| committer | Daniel Malea <daniel.malea@intel.com> | 2013-01-08 14:49:22 +0000 |
| commit | 6217d2ae379b2c6b64bf558321eca40bf1368be4 (patch) | |
| tree | e3fc2ed988becd900645745e4feb83936346e8ca /lldb/source/Plugins/Process/FreeBSD/ProcessMonitor.cpp | |
| parent | 7daa1a22014c9b5a400dba5e6cfb0ff7cc94b443 (diff) | |
Implement -w flag to process launch (allow launching inferior process in different working directory) on Linux/FreeBSD
- fixes test case TestProcessLaunch
llvm-svn: 171854
Diffstat (limited to 'lldb/source/Plugins/Process/FreeBSD/ProcessMonitor.cpp')
| -rw-r--r-- | lldb/source/Plugins/Process/FreeBSD/ProcessMonitor.cpp | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/lldb/source/Plugins/Process/FreeBSD/ProcessMonitor.cpp b/lldb/source/Plugins/Process/FreeBSD/ProcessMonitor.cpp index e37a660925ba..e88d792d7373 100644 --- a/lldb/source/Plugins/Process/FreeBSD/ProcessMonitor.cpp +++ b/lldb/source/Plugins/Process/FreeBSD/ProcessMonitor.cpp @@ -627,14 +627,16 @@ ProcessMonitor::LaunchArgs::LaunchArgs(ProcessMonitor *monitor, char const **envp, const char *stdin_path, const char *stdout_path, - const char *stderr_path) + const char *stderr_path, + const char *working_dir) : OperationArgs(monitor), m_module(module), m_argv(argv), m_envp(envp), m_stdin_path(stdin_path), m_stdout_path(stdout_path), - m_stderr_path(stderr_path) { } + m_stderr_path(stderr_path), + m_working_dir(working_dir) { } ProcessMonitor::LaunchArgs::~LaunchArgs() { } @@ -665,6 +667,7 @@ ProcessMonitor::ProcessMonitor(ProcessPOSIX *process, const char *stdin_path, const char *stdout_path, const char *stderr_path, + const char *working_dir, lldb_private::Error &error) : m_process(static_cast<ProcessFreeBSD *>(process)), m_operation_thread(LLDB_INVALID_HOST_THREAD), @@ -678,7 +681,7 @@ ProcessMonitor::ProcessMonitor(ProcessPOSIX *process, std::auto_ptr<LaunchArgs> args; args.reset(new LaunchArgs(this, module, argv, envp, - stdin_path, stdout_path, stderr_path)); + stdin_path, stdout_path, stderr_path, working_dir)); // Server/client descriptors. @@ -839,6 +842,7 @@ ProcessMonitor::Launch(LaunchArgs *args) const char *stdin_path = args->m_stdin_path; const char *stdout_path = args->m_stdout_path; const char *stderr_path = args->m_stderr_path; + const char *working_dir = args->m_working_dir; lldb::pid_t pid; lldb::ThreadSP inferior; @@ -853,6 +857,7 @@ ProcessMonitor::Launch(LaunchArgs *args) eDupStdinFailed, eDupStdoutFailed, eDupStderrFailed, + eChdirFailed, eExecFailed }; @@ -887,6 +892,11 @@ ProcessMonitor::Launch(LaunchArgs *args) if (!DupDescriptor(stderr_path, STDERR_FILENO, O_WRONLY | O_CREAT)) exit(eDupStderrFailed); + // Change working directory + if (working_dir != NULL && working_dir[0]) + if (0 != ::chdir(working_dir)) + exit(eChdirFailed); + // Execute. We should never return. execve(argv[0], const_cast<char *const *>(argv), @@ -920,6 +930,9 @@ ProcessMonitor::Launch(LaunchArgs *args) case eDupStderrFailed: args->m_error.SetErrorString("Child open stderr failed."); break; + case eChdirFailed: + args->m_error.SetErrorString("Child failed to set working directory."); + break; case eExecFailed: args->m_error.SetErrorString("Child exec failed."); break; |
