blob: d068aa636bc7ffe2b382614329a6738a801b363a [file] [log] [blame]
Andrew Walbran3d2c1972020-04-07 12:24:26 +01001//===-- ProcessLaunchInfo.h -------------------------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef liblldb_ProcessLaunch_Info_h
10#define liblldb_ProcessLaunch_Info_h
11
12// C++ Headers
13#include <string>
14
15// LLDB Headers
16#include "lldb/Utility/Flags.h"
17
18#include "lldb/Host/FileAction.h"
19#include "lldb/Host/Host.h"
20#include "lldb/Host/PseudoTerminal.h"
21#include "lldb/Utility/FileSpec.h"
22#include "lldb/Utility/ProcessInfo.h"
23
24namespace lldb_private {
25
26// ProcessLaunchInfo
27//
28// Describes any information that is required to launch a process.
29
30class ProcessLaunchInfo : public ProcessInfo {
31public:
32 ProcessLaunchInfo();
33
34 ProcessLaunchInfo(const FileSpec &stdin_file_spec,
35 const FileSpec &stdout_file_spec,
36 const FileSpec &stderr_file_spec,
37 const FileSpec &working_dir, uint32_t launch_flags);
38
39 void AppendFileAction(const FileAction &info) {
40 m_file_actions.push_back(info);
41 }
42
43 bool AppendCloseFileAction(int fd);
44
45 bool AppendDuplicateFileAction(int fd, int dup_fd);
46
47 bool AppendOpenFileAction(int fd, const FileSpec &file_spec, bool read,
48 bool write);
49
50 bool AppendSuppressFileAction(int fd, bool read, bool write);
51
52 // Redirect stdin/stdout/stderr to a pty, if no action for the respective file
53 // descriptor is specified. (So if stdin and stdout already have file actions,
54 // but stderr doesn't, then only stderr will be redirected to a pty.)
55 llvm::Error SetUpPtyRedirection();
56
57 size_t GetNumFileActions() const { return m_file_actions.size(); }
58
59 const FileAction *GetFileActionAtIndex(size_t idx) const;
60
61 const FileAction *GetFileActionForFD(int fd) const;
62
63 Flags &GetFlags() { return m_flags; }
64
65 const Flags &GetFlags() const { return m_flags; }
66
67 const FileSpec &GetWorkingDirectory() const;
68
69 void SetWorkingDirectory(const FileSpec &working_dir);
70
71 const char *GetProcessPluginName() const;
72
73 void SetProcessPluginName(llvm::StringRef plugin);
74
75 const FileSpec &GetShell() const;
76
77 void SetShell(const FileSpec &shell);
78
79 uint32_t GetResumeCount() const { return m_resume_count; }
80
81 void SetResumeCount(uint32_t c) { m_resume_count = c; }
82
83 bool GetLaunchInSeparateProcessGroup() const {
84 return m_flags.Test(lldb::eLaunchFlagLaunchInSeparateProcessGroup);
85 }
86
87 void SetLaunchInSeparateProcessGroup(bool separate);
88
89 bool GetShellExpandArguments() const {
90 return m_flags.Test(lldb::eLaunchFlagShellExpandArguments);
91 }
92
93 void SetShellExpandArguments(bool expand);
94
95 void Clear();
96
97 bool ConvertArgumentsForLaunchingInShell(Status &error, bool localhost,
98 bool will_debug,
99 bool first_arg_is_full_shell_command,
100 int32_t num_resumes);
101
102 void
103 SetMonitorProcessCallback(const Host::MonitorChildProcessCallback &callback,
104 bool monitor_signals);
105
106 Host::MonitorChildProcessCallback GetMonitorProcessCallback() const {
107 return m_monitor_callback;
108 }
109
110 /// A Monitor callback which does not take any action on process events. Use
111 /// this if you don't need to take any particular action when the process
112 /// terminates, but you still need to reap it.
113 static bool NoOpMonitorCallback(lldb::pid_t pid, bool exited, int signal,
114 int status);
115
116 bool GetMonitorSignals() const { return m_monitor_signals; }
117
118 // If the LaunchInfo has a monitor callback, then arrange to monitor the
119 // process. Return true if the LaunchInfo has taken care of monitoring the
120 // process, and false if the caller might want to monitor the process
121 // themselves.
122
123 bool MonitorProcess() const;
124
125 PseudoTerminal &GetPTY() { return *m_pty; }
126
127 // Get and set the actual listener that will be used for the process events
128 lldb::ListenerSP GetListener() const { return m_listener_sp; }
129
130 void SetListener(const lldb::ListenerSP &listener_sp) {
131 m_listener_sp = listener_sp;
132 }
133
134 lldb::ListenerSP GetHijackListener() const { return m_hijack_listener_sp; }
135
136 void SetHijackListener(const lldb::ListenerSP &listener_sp) {
137 m_hijack_listener_sp = listener_sp;
138 }
139
140 void SetLaunchEventData(const char *data) { m_event_data.assign(data); }
141
142 const char *GetLaunchEventData() const { return m_event_data.c_str(); }
143
144 void SetDetachOnError(bool enable);
145
146 bool GetDetachOnError() const {
147 return m_flags.Test(lldb::eLaunchFlagDetachOnError);
148 }
149
150protected:
151 FileSpec m_working_dir;
152 std::string m_plugin_name;
153 FileSpec m_shell;
154 Flags m_flags; // Bitwise OR of bits from lldb::LaunchFlags
155 std::vector<FileAction> m_file_actions; // File actions for any other files
156 std::shared_ptr<PseudoTerminal> m_pty;
157 uint32_t m_resume_count; // How many times do we resume after launching
158 Host::MonitorChildProcessCallback m_monitor_callback;
159 void *m_monitor_callback_baton;
160 bool m_monitor_signals;
161 std::string m_event_data; // A string passed to the plugin launch, having no
162 // meaning to the upper levels of lldb.
163 lldb::ListenerSP m_listener_sp;
164 lldb::ListenerSP m_hijack_listener_sp;
165};
166}
167
168#endif // liblldb_ProcessLaunch_Info_h