180814287SRaphael Isemann //===-- SBPlatform.cpp ----------------------------------------------------===//
2fbb76349SGreg Clayton //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6fbb76349SGreg Clayton //
7fbb76349SGreg Clayton //===----------------------------------------------------------------------===//
8fbb76349SGreg Clayton 
9fbb76349SGreg Clayton #include "lldb/API/SBPlatform.h"
10ca69be21SWalter Erquinigo #include "lldb/API/SBEnvironment.h"
11fbb76349SGreg Clayton #include "lldb/API/SBError.h"
12fbb76349SGreg Clayton #include "lldb/API/SBFileSpec.h"
131ef7b2c8SOleksiy Vyalov #include "lldb/API/SBLaunchInfo.h"
14ca69be21SWalter Erquinigo #include "lldb/API/SBPlatform.h"
1598d0a4b3SChaoren Lin #include "lldb/API/SBUnixSignals.h"
16fbb76349SGreg Clayton #include "lldb/Host/File.h"
17fbb76349SGreg Clayton #include "lldb/Target/Platform.h"
18b9c1b51eSKate Stone #include "lldb/Target/Target.h"
195f19b907SPavel Labath #include "lldb/Utility/ArchSpec.h"
20145d95c9SPavel Labath #include "lldb/Utility/Args.h"
211755f5b1SJonas Devlieghere #include "lldb/Utility/Instrumentation.h"
2297206d57SZachary Turner #include "lldb/Utility/Status.h"
23fbb76349SGreg Clayton 
247d86ee5aSZachary Turner #include "llvm/Support/FileSystem.h"
257d86ee5aSZachary Turner 
261ef7b2c8SOleksiy Vyalov #include <functional>
271ef7b2c8SOleksiy Vyalov 
28fbb76349SGreg Clayton using namespace lldb;
29fbb76349SGreg Clayton using namespace lldb_private;
30fbb76349SGreg Clayton 
31fbb76349SGreg Clayton // PlatformConnectOptions
32fbb76349SGreg Clayton struct PlatformConnectOptions {
PlatformConnectOptionsPlatformConnectOptions33a3436f73SKazu Hirata   PlatformConnectOptions(const char *url = nullptr) {
34fbb76349SGreg Clayton     if (url && url[0])
35fbb76349SGreg Clayton       m_url = url;
36fbb76349SGreg Clayton   }
37fbb76349SGreg Clayton 
38866b7a65SJonas Devlieghere   ~PlatformConnectOptions() = default;
39fbb76349SGreg Clayton 
40fbb76349SGreg Clayton   std::string m_url;
41fbb76349SGreg Clayton   std::string m_rsync_options;
42fbb76349SGreg Clayton   std::string m_rsync_remote_path_prefix;
439494c510SJonas Devlieghere   bool m_rsync_enabled = false;
449494c510SJonas Devlieghere   bool m_rsync_omit_hostname_from_remote_path = false;
45fbb76349SGreg Clayton   ConstString m_local_cache_directory;
46fbb76349SGreg Clayton };
47fbb76349SGreg Clayton 
48fbb76349SGreg Clayton // PlatformShellCommand
49fbb76349SGreg Clayton struct PlatformShellCommand {
PlatformShellCommandPlatformShellCommand50addb5148SMed Ismail Bennani   PlatformShellCommand(llvm::StringRef shell_interpreter,
5128c878aeSShafik Yaghmour                        llvm::StringRef shell_command) {
52addb5148SMed Ismail Bennani     if (!shell_interpreter.empty())
53addb5148SMed Ismail Bennani       m_shell = shell_interpreter.str();
54addb5148SMed Ismail Bennani 
55addb5148SMed Ismail Bennani     if (!m_shell.empty() && !shell_command.empty())
56addb5148SMed Ismail Bennani       m_command = shell_command.str();
57addb5148SMed Ismail Bennani   }
58addb5148SMed Ismail Bennani 
PlatformShellCommandPlatformShellCommand59a3436f73SKazu Hirata   PlatformShellCommand(llvm::StringRef shell_command = llvm::StringRef()) {
60addb5148SMed Ismail Bennani     if (!shell_command.empty())
61addb5148SMed Ismail Bennani       m_command = shell_command.str();
62fbb76349SGreg Clayton   }
63fbb76349SGreg Clayton 
64866b7a65SJonas Devlieghere   ~PlatformShellCommand() = default;
65fbb76349SGreg Clayton 
66addb5148SMed Ismail Bennani   std::string m_shell;
67fbb76349SGreg Clayton   std::string m_command;
68fbb76349SGreg Clayton   std::string m_working_dir;
69fbb76349SGreg Clayton   std::string m_output;
709494c510SJonas Devlieghere   int m_status = 0;
719494c510SJonas Devlieghere   int m_signo = 0;
7219dd1a0eSPavel Labath   Timeout<std::ratio<1>> m_timeout = llvm::None;
73fbb76349SGreg Clayton };
74fbb76349SGreg Clayton // SBPlatformConnectOptions
SBPlatformConnectOptions(const char * url)75b9c1b51eSKate Stone SBPlatformConnectOptions::SBPlatformConnectOptions(const char *url)
76baf5664fSJonas Devlieghere     : m_opaque_ptr(new PlatformConnectOptions(url)) {
771755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, url);
78baf5664fSJonas Devlieghere }
79fbb76349SGreg Clayton 
SBPlatformConnectOptions(const SBPlatformConnectOptions & rhs)80b9c1b51eSKate Stone SBPlatformConnectOptions::SBPlatformConnectOptions(
81b9c1b51eSKate Stone     const SBPlatformConnectOptions &rhs)
82b9c1b51eSKate Stone     : m_opaque_ptr(new PlatformConnectOptions()) {
831755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, rhs);
84baf5664fSJonas Devlieghere 
85fbb76349SGreg Clayton   *m_opaque_ptr = *rhs.m_opaque_ptr;
86fbb76349SGreg Clayton }
87fbb76349SGreg Clayton 
~SBPlatformConnectOptions()88b9c1b51eSKate Stone SBPlatformConnectOptions::~SBPlatformConnectOptions() { delete m_opaque_ptr; }
89fbb76349SGreg Clayton 
90bc0a35f3SJonas Devlieghere SBPlatformConnectOptions &
operator =(const SBPlatformConnectOptions & rhs)91bc0a35f3SJonas Devlieghere SBPlatformConnectOptions::operator=(const SBPlatformConnectOptions &rhs) {
921755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, rhs);
93baf5664fSJonas Devlieghere 
94fbb76349SGreg Clayton   *m_opaque_ptr = *rhs.m_opaque_ptr;
95d232abc3SJonas Devlieghere   return *this;
96fbb76349SGreg Clayton }
97fbb76349SGreg Clayton 
GetURL()98b9c1b51eSKate Stone const char *SBPlatformConnectOptions::GetURL() {
991755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
100baf5664fSJonas Devlieghere 
101fbb76349SGreg Clayton   if (m_opaque_ptr->m_url.empty())
102248a1305SKonrad Kleine     return nullptr;
103fbb76349SGreg Clayton   return m_opaque_ptr->m_url.c_str();
104fbb76349SGreg Clayton }
105fbb76349SGreg Clayton 
SetURL(const char * url)106b9c1b51eSKate Stone void SBPlatformConnectOptions::SetURL(const char *url) {
1071755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, url);
108baf5664fSJonas Devlieghere 
109fbb76349SGreg Clayton   if (url && url[0])
110fbb76349SGreg Clayton     m_opaque_ptr->m_url = url;
111fbb76349SGreg Clayton   else
112fbb76349SGreg Clayton     m_opaque_ptr->m_url.clear();
113fbb76349SGreg Clayton }
114fbb76349SGreg Clayton 
GetRsyncEnabled()115b9c1b51eSKate Stone bool SBPlatformConnectOptions::GetRsyncEnabled() {
1161755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
117baf5664fSJonas Devlieghere 
118fbb76349SGreg Clayton   return m_opaque_ptr->m_rsync_enabled;
119fbb76349SGreg Clayton }
120fbb76349SGreg Clayton 
EnableRsync(const char * options,const char * remote_path_prefix,bool omit_hostname_from_remote_path)121b9c1b51eSKate Stone void SBPlatformConnectOptions::EnableRsync(
122b9c1b51eSKate Stone     const char *options, const char *remote_path_prefix,
123b9c1b51eSKate Stone     bool omit_hostname_from_remote_path) {
1241755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, options, remote_path_prefix,
1251755f5b1SJonas Devlieghere                      omit_hostname_from_remote_path);
126baf5664fSJonas Devlieghere 
127fbb76349SGreg Clayton   m_opaque_ptr->m_rsync_enabled = true;
128b9c1b51eSKate Stone   m_opaque_ptr->m_rsync_omit_hostname_from_remote_path =
129b9c1b51eSKate Stone       omit_hostname_from_remote_path;
130fbb76349SGreg Clayton   if (remote_path_prefix && remote_path_prefix[0])
131fbb76349SGreg Clayton     m_opaque_ptr->m_rsync_remote_path_prefix = remote_path_prefix;
132fbb76349SGreg Clayton   else
133fbb76349SGreg Clayton     m_opaque_ptr->m_rsync_remote_path_prefix.clear();
134fbb76349SGreg Clayton 
135fbb76349SGreg Clayton   if (options && options[0])
136fbb76349SGreg Clayton     m_opaque_ptr->m_rsync_options = options;
137fbb76349SGreg Clayton   else
138fbb76349SGreg Clayton     m_opaque_ptr->m_rsync_options.clear();
139fbb76349SGreg Clayton }
140fbb76349SGreg Clayton 
DisableRsync()141b9c1b51eSKate Stone void SBPlatformConnectOptions::DisableRsync() {
1421755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
143baf5664fSJonas Devlieghere 
144fbb76349SGreg Clayton   m_opaque_ptr->m_rsync_enabled = false;
145fbb76349SGreg Clayton }
146fbb76349SGreg Clayton 
GetLocalCacheDirectory()147b9c1b51eSKate Stone const char *SBPlatformConnectOptions::GetLocalCacheDirectory() {
1481755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
149baf5664fSJonas Devlieghere 
150fbb76349SGreg Clayton   return m_opaque_ptr->m_local_cache_directory.GetCString();
151fbb76349SGreg Clayton }
152fbb76349SGreg Clayton 
SetLocalCacheDirectory(const char * path)153b9c1b51eSKate Stone void SBPlatformConnectOptions::SetLocalCacheDirectory(const char *path) {
1541755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, path);
155baf5664fSJonas Devlieghere 
156fbb76349SGreg Clayton   if (path && path[0])
157fbb76349SGreg Clayton     m_opaque_ptr->m_local_cache_directory.SetCString(path);
158fbb76349SGreg Clayton   else
159fbb76349SGreg Clayton     m_opaque_ptr->m_local_cache_directory = ConstString();
160fbb76349SGreg Clayton }
161fbb76349SGreg Clayton 
162fbb76349SGreg Clayton // SBPlatformShellCommand
SBPlatformShellCommand(const char * shell_interpreter,const char * shell_command)163addb5148SMed Ismail Bennani SBPlatformShellCommand::SBPlatformShellCommand(const char *shell_interpreter,
164addb5148SMed Ismail Bennani                                                const char *shell_command)
165addb5148SMed Ismail Bennani     : m_opaque_ptr(new PlatformShellCommand(shell_interpreter, shell_command)) {
1661755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, shell_interpreter, shell_command);
167addb5148SMed Ismail Bennani }
168addb5148SMed Ismail Bennani 
SBPlatformShellCommand(const char * shell_command)169b9c1b51eSKate Stone SBPlatformShellCommand::SBPlatformShellCommand(const char *shell_command)
170baf5664fSJonas Devlieghere     : m_opaque_ptr(new PlatformShellCommand(shell_command)) {
1711755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, shell_command);
172baf5664fSJonas Devlieghere }
173fbb76349SGreg Clayton 
SBPlatformShellCommand(const SBPlatformShellCommand & rhs)174b9c1b51eSKate Stone SBPlatformShellCommand::SBPlatformShellCommand(
175b9c1b51eSKate Stone     const SBPlatformShellCommand &rhs)
176b9c1b51eSKate Stone     : m_opaque_ptr(new PlatformShellCommand()) {
1771755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, rhs);
178baf5664fSJonas Devlieghere 
179fbb76349SGreg Clayton   *m_opaque_ptr = *rhs.m_opaque_ptr;
180fbb76349SGreg Clayton }
181fbb76349SGreg Clayton 
182bc0a35f3SJonas Devlieghere SBPlatformShellCommand &
operator =(const SBPlatformShellCommand & rhs)183bc0a35f3SJonas Devlieghere SBPlatformShellCommand::operator=(const SBPlatformShellCommand &rhs) {
184ede5cd9aSJonas Devlieghere 
1851755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, rhs);
186ede5cd9aSJonas Devlieghere 
187ede5cd9aSJonas Devlieghere   *m_opaque_ptr = *rhs.m_opaque_ptr;
188d232abc3SJonas Devlieghere   return *this;
189ede5cd9aSJonas Devlieghere }
190ede5cd9aSJonas Devlieghere 
~SBPlatformShellCommand()191b9c1b51eSKate Stone SBPlatformShellCommand::~SBPlatformShellCommand() { delete m_opaque_ptr; }
192fbb76349SGreg Clayton 
Clear()193b9c1b51eSKate Stone void SBPlatformShellCommand::Clear() {
1941755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
195baf5664fSJonas Devlieghere 
1963a29f8b9SPavel Labath   m_opaque_ptr->m_output = std::string();
197fbb76349SGreg Clayton   m_opaque_ptr->m_status = 0;
198fbb76349SGreg Clayton   m_opaque_ptr->m_signo = 0;
199fbb76349SGreg Clayton }
200fbb76349SGreg Clayton 
GetShell()201addb5148SMed Ismail Bennani const char *SBPlatformShellCommand::GetShell() {
2021755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
203addb5148SMed Ismail Bennani 
204addb5148SMed Ismail Bennani   if (m_opaque_ptr->m_shell.empty())
205addb5148SMed Ismail Bennani     return nullptr;
206addb5148SMed Ismail Bennani   return m_opaque_ptr->m_shell.c_str();
207addb5148SMed Ismail Bennani }
208addb5148SMed Ismail Bennani 
SetShell(const char * shell_interpreter)209addb5148SMed Ismail Bennani void SBPlatformShellCommand::SetShell(const char *shell_interpreter) {
2101755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, shell_interpreter);
211addb5148SMed Ismail Bennani 
212addb5148SMed Ismail Bennani   if (shell_interpreter && shell_interpreter[0])
213addb5148SMed Ismail Bennani     m_opaque_ptr->m_shell = shell_interpreter;
214addb5148SMed Ismail Bennani   else
215addb5148SMed Ismail Bennani     m_opaque_ptr->m_shell.clear();
216addb5148SMed Ismail Bennani }
217addb5148SMed Ismail Bennani 
GetCommand()218b9c1b51eSKate Stone const char *SBPlatformShellCommand::GetCommand() {
2191755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
220baf5664fSJonas Devlieghere 
221fbb76349SGreg Clayton   if (m_opaque_ptr->m_command.empty())
222248a1305SKonrad Kleine     return nullptr;
223fbb76349SGreg Clayton   return m_opaque_ptr->m_command.c_str();
224fbb76349SGreg Clayton }
225fbb76349SGreg Clayton 
SetCommand(const char * shell_command)226b9c1b51eSKate Stone void SBPlatformShellCommand::SetCommand(const char *shell_command) {
2271755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, shell_command);
228baf5664fSJonas Devlieghere 
229fbb76349SGreg Clayton   if (shell_command && shell_command[0])
230fbb76349SGreg Clayton     m_opaque_ptr->m_command = shell_command;
231fbb76349SGreg Clayton   else
232fbb76349SGreg Clayton     m_opaque_ptr->m_command.clear();
233fbb76349SGreg Clayton }
234fbb76349SGreg Clayton 
GetWorkingDirectory()235b9c1b51eSKate Stone const char *SBPlatformShellCommand::GetWorkingDirectory() {
2361755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
237baf5664fSJonas Devlieghere 
238fbb76349SGreg Clayton   if (m_opaque_ptr->m_working_dir.empty())
239248a1305SKonrad Kleine     return nullptr;
240fbb76349SGreg Clayton   return m_opaque_ptr->m_working_dir.c_str();
241fbb76349SGreg Clayton }
242fbb76349SGreg Clayton 
SetWorkingDirectory(const char * path)243b9c1b51eSKate Stone void SBPlatformShellCommand::SetWorkingDirectory(const char *path) {
2441755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, path);
245baf5664fSJonas Devlieghere 
246fbb76349SGreg Clayton   if (path && path[0])
247fbb76349SGreg Clayton     m_opaque_ptr->m_working_dir = path;
248fbb76349SGreg Clayton   else
249fbb76349SGreg Clayton     m_opaque_ptr->m_working_dir.clear();
250fbb76349SGreg Clayton }
251fbb76349SGreg Clayton 
GetTimeoutSeconds()252b9c1b51eSKate Stone uint32_t SBPlatformShellCommand::GetTimeoutSeconds() {
2531755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
254baf5664fSJonas Devlieghere 
25519dd1a0eSPavel Labath   if (m_opaque_ptr->m_timeout)
25619dd1a0eSPavel Labath     return m_opaque_ptr->m_timeout->count();
25719dd1a0eSPavel Labath   return UINT32_MAX;
258fbb76349SGreg Clayton }
259fbb76349SGreg Clayton 
SetTimeoutSeconds(uint32_t sec)260b9c1b51eSKate Stone void SBPlatformShellCommand::SetTimeoutSeconds(uint32_t sec) {
2611755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, sec);
262baf5664fSJonas Devlieghere 
26319dd1a0eSPavel Labath   if (sec == UINT32_MAX)
26419dd1a0eSPavel Labath     m_opaque_ptr->m_timeout = llvm::None;
26519dd1a0eSPavel Labath   else
26619dd1a0eSPavel Labath     m_opaque_ptr->m_timeout = std::chrono::seconds(sec);
267fbb76349SGreg Clayton }
268fbb76349SGreg Clayton 
GetSignal()269baf5664fSJonas Devlieghere int SBPlatformShellCommand::GetSignal() {
2701755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
271fbb76349SGreg Clayton 
272baf5664fSJonas Devlieghere   return m_opaque_ptr->m_signo;
273baf5664fSJonas Devlieghere }
274baf5664fSJonas Devlieghere 
GetStatus()275baf5664fSJonas Devlieghere int SBPlatformShellCommand::GetStatus() {
2761755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
277baf5664fSJonas Devlieghere 
278baf5664fSJonas Devlieghere   return m_opaque_ptr->m_status;
279baf5664fSJonas Devlieghere }
280fbb76349SGreg Clayton 
GetOutput()281b9c1b51eSKate Stone const char *SBPlatformShellCommand::GetOutput() {
2821755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
283baf5664fSJonas Devlieghere 
284fbb76349SGreg Clayton   if (m_opaque_ptr->m_output.empty())
285248a1305SKonrad Kleine     return nullptr;
286fbb76349SGreg Clayton   return m_opaque_ptr->m_output.c_str();
287fbb76349SGreg Clayton }
288fbb76349SGreg Clayton 
289fbb76349SGreg Clayton // SBPlatform
SBPlatform()2901755f5b1SJonas Devlieghere SBPlatform::SBPlatform() { LLDB_INSTRUMENT_VA(this); }
291fbb76349SGreg Clayton 
SBPlatform(const char * platform_name)292a3436f73SKazu Hirata SBPlatform::SBPlatform(const char *platform_name) {
2931755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, platform_name);
294baf5664fSJonas Devlieghere 
295af921006SPavel Labath   m_opaque_sp = Platform::Create(platform_name);
296fbb76349SGreg Clayton }
297fbb76349SGreg Clayton 
SBPlatform(const SBPlatform & rhs)29866dc4672SJonas Devlieghere SBPlatform::SBPlatform(const SBPlatform &rhs) {
2991755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, rhs);
30066dc4672SJonas Devlieghere 
30166dc4672SJonas Devlieghere   m_opaque_sp = rhs.m_opaque_sp;
30266dc4672SJonas Devlieghere }
30366dc4672SJonas Devlieghere 
operator =(const SBPlatform & rhs)304ede5cd9aSJonas Devlieghere SBPlatform &SBPlatform::operator=(const SBPlatform &rhs) {
3051755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, rhs);
30666dc4672SJonas Devlieghere 
30766dc4672SJonas Devlieghere   m_opaque_sp = rhs.m_opaque_sp;
308d232abc3SJonas Devlieghere   return *this;
30966dc4672SJonas Devlieghere }
31066dc4672SJonas Devlieghere 
311866b7a65SJonas Devlieghere SBPlatform::~SBPlatform() = default;
312fbb76349SGreg Clayton 
GetHostPlatform()313a31130f6STatyana Krasnukha SBPlatform SBPlatform::GetHostPlatform() {
3141755f5b1SJonas Devlieghere   LLDB_INSTRUMENT();
3155c2bf577SJonas Devlieghere 
316a31130f6STatyana Krasnukha   SBPlatform host_platform;
317a31130f6STatyana Krasnukha   host_platform.m_opaque_sp = Platform::GetHostPlatform();
318d232abc3SJonas Devlieghere   return host_platform;
319a31130f6STatyana Krasnukha }
320a31130f6STatyana Krasnukha 
IsValid() const321baf5664fSJonas Devlieghere bool SBPlatform::IsValid() const {
3221755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
3237f5237bcSPavel Labath   return this->operator bool();
3247f5237bcSPavel Labath }
operator bool() const3257f5237bcSPavel Labath SBPlatform::operator bool() const {
3261755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
327fbb76349SGreg Clayton 
328248a1305SKonrad Kleine   return m_opaque_sp.get() != nullptr;
329baf5664fSJonas Devlieghere }
330baf5664fSJonas Devlieghere 
Clear()331baf5664fSJonas Devlieghere void SBPlatform::Clear() {
3321755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
333baf5664fSJonas Devlieghere 
334baf5664fSJonas Devlieghere   m_opaque_sp.reset();
335baf5664fSJonas Devlieghere }
336fbb76349SGreg Clayton 
GetName()337b9c1b51eSKate Stone const char *SBPlatform::GetName() {
3381755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
339baf5664fSJonas Devlieghere 
340fbb76349SGreg Clayton   PlatformSP platform_sp(GetSP());
341fbb76349SGreg Clayton   if (platform_sp)
342d2edca62SPavel Labath     return ConstString(platform_sp->GetName()).AsCString();
343248a1305SKonrad Kleine   return nullptr;
344fbb76349SGreg Clayton }
345fbb76349SGreg Clayton 
GetSP() const346b9c1b51eSKate Stone lldb::PlatformSP SBPlatform::GetSP() const { return m_opaque_sp; }
347fbb76349SGreg Clayton 
SetSP(const lldb::PlatformSP & platform_sp)348b9c1b51eSKate Stone void SBPlatform::SetSP(const lldb::PlatformSP &platform_sp) {
349fbb76349SGreg Clayton   m_opaque_sp = platform_sp;
350fbb76349SGreg Clayton }
351fbb76349SGreg Clayton 
GetWorkingDirectory()352b9c1b51eSKate Stone const char *SBPlatform::GetWorkingDirectory() {
3531755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
354baf5664fSJonas Devlieghere 
355fbb76349SGreg Clayton   PlatformSP platform_sp(GetSP());
356fbb76349SGreg Clayton   if (platform_sp)
357*1b4b12a3SNico Weber     return platform_sp->GetWorkingDirectory().GetCString();
358248a1305SKonrad Kleine   return nullptr;
359fbb76349SGreg Clayton }
360fbb76349SGreg Clayton 
SetWorkingDirectory(const char * path)361b9c1b51eSKate Stone bool SBPlatform::SetWorkingDirectory(const char *path) {
3621755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, path);
363baf5664fSJonas Devlieghere 
364fbb76349SGreg Clayton   PlatformSP platform_sp(GetSP());
365b9c1b51eSKate Stone   if (platform_sp) {
366fbb76349SGreg Clayton     if (path)
3678f3be7a3SJonas Devlieghere       platform_sp->SetWorkingDirectory(FileSpec(path));
368fbb76349SGreg Clayton     else
3698f3be7a3SJonas Devlieghere       platform_sp->SetWorkingDirectory(FileSpec());
370fbb76349SGreg Clayton     return true;
371fbb76349SGreg Clayton   }
372fbb76349SGreg Clayton   return false;
373fbb76349SGreg Clayton }
374fbb76349SGreg Clayton 
ConnectRemote(SBPlatformConnectOptions & connect_options)375b9c1b51eSKate Stone SBError SBPlatform::ConnectRemote(SBPlatformConnectOptions &connect_options) {
3761755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, connect_options);
377baf5664fSJonas Devlieghere 
378fbb76349SGreg Clayton   SBError sb_error;
379fbb76349SGreg Clayton   PlatformSP platform_sp(GetSP());
380b9c1b51eSKate Stone   if (platform_sp && connect_options.GetURL()) {
381fbb76349SGreg Clayton     Args args;
382bbea3610SRaphael Isemann     args.AppendArgument(connect_options.GetURL());
383fbb76349SGreg Clayton     sb_error.ref() = platform_sp->ConnectRemote(args);
384b9c1b51eSKate Stone   } else {
385fbb76349SGreg Clayton     sb_error.SetErrorString("invalid platform");
386fbb76349SGreg Clayton   }
387d232abc3SJonas Devlieghere   return sb_error;
388fbb76349SGreg Clayton }
389fbb76349SGreg Clayton 
DisconnectRemote()390b9c1b51eSKate Stone void SBPlatform::DisconnectRemote() {
3911755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
392baf5664fSJonas Devlieghere 
393fbb76349SGreg Clayton   PlatformSP platform_sp(GetSP());
394fbb76349SGreg Clayton   if (platform_sp)
395fbb76349SGreg Clayton     platform_sp->DisconnectRemote();
396fbb76349SGreg Clayton }
397fbb76349SGreg Clayton 
IsConnected()398b9c1b51eSKate Stone bool SBPlatform::IsConnected() {
3991755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
400baf5664fSJonas Devlieghere 
401fbb76349SGreg Clayton   PlatformSP platform_sp(GetSP());
402fbb76349SGreg Clayton   if (platform_sp)
403ca38766cSJim Ingham     return platform_sp->IsConnected();
404fbb76349SGreg Clayton   return false;
405fbb76349SGreg Clayton }
406fbb76349SGreg Clayton 
GetTriple()407b9c1b51eSKate Stone const char *SBPlatform::GetTriple() {
4081755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
409baf5664fSJonas Devlieghere 
410fbb76349SGreg Clayton   PlatformSP platform_sp(GetSP());
411b9c1b51eSKate Stone   if (platform_sp) {
412ccd28a14STamas Berghammer     ArchSpec arch(platform_sp->GetSystemArchitecture());
413b9c1b51eSKate Stone     if (arch.IsValid()) {
414b9c1b51eSKate Stone       // Const-ify the string so we don't need to worry about the lifetime of
415b9c1b51eSKate Stone       // the string
416fbb76349SGreg Clayton       return ConstString(arch.GetTriple().getTriple().c_str()).GetCString();
417fbb76349SGreg Clayton     }
418fbb76349SGreg Clayton   }
419248a1305SKonrad Kleine   return nullptr;
420fbb76349SGreg Clayton }
421fbb76349SGreg Clayton 
GetOSBuild()422b9c1b51eSKate Stone const char *SBPlatform::GetOSBuild() {
4231755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
424baf5664fSJonas Devlieghere 
425fbb76349SGreg Clayton   PlatformSP platform_sp(GetSP());
426b9c1b51eSKate Stone   if (platform_sp) {
427aa88161bSKazu Hirata     std::string s = platform_sp->GetOSBuildString().value_or("");
428b9c1b51eSKate Stone     if (!s.empty()) {
429b9c1b51eSKate Stone       // Const-ify the string so we don't need to worry about the lifetime of
430b9c1b51eSKate Stone       // the string
43140e4ac3eSPavel Labath       return ConstString(s).GetCString();
432fbb76349SGreg Clayton     }
433fbb76349SGreg Clayton   }
434248a1305SKonrad Kleine   return nullptr;
435fbb76349SGreg Clayton }
436fbb76349SGreg Clayton 
GetOSDescription()437b9c1b51eSKate Stone const char *SBPlatform::GetOSDescription() {
4381755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
439baf5664fSJonas Devlieghere 
440fbb76349SGreg Clayton   PlatformSP platform_sp(GetSP());
441b9c1b51eSKate Stone   if (platform_sp) {
442aa88161bSKazu Hirata     std::string s = platform_sp->GetOSKernelDescription().value_or("");
443b9c1b51eSKate Stone     if (!s.empty()) {
444b9c1b51eSKate Stone       // Const-ify the string so we don't need to worry about the lifetime of
445b9c1b51eSKate Stone       // the string
446fbb76349SGreg Clayton       return ConstString(s.c_str()).GetCString();
447fbb76349SGreg Clayton     }
448fbb76349SGreg Clayton   }
449248a1305SKonrad Kleine   return nullptr;
450fbb76349SGreg Clayton }
451fbb76349SGreg Clayton 
GetHostname()452b9c1b51eSKate Stone const char *SBPlatform::GetHostname() {
4531755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
454baf5664fSJonas Devlieghere 
455fbb76349SGreg Clayton   PlatformSP platform_sp(GetSP());
456fbb76349SGreg Clayton   if (platform_sp)
457fbb76349SGreg Clayton     return platform_sp->GetHostname();
458248a1305SKonrad Kleine   return nullptr;
459fbb76349SGreg Clayton }
460fbb76349SGreg Clayton 
GetOSMajorVersion()461b9c1b51eSKate Stone uint32_t SBPlatform::GetOSMajorVersion() {
4621755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
463baf5664fSJonas Devlieghere 
4642272c481SPavel Labath   llvm::VersionTuple version;
4652272c481SPavel Labath   if (PlatformSP platform_sp = GetSP())
4662272c481SPavel Labath     version = platform_sp->GetOSVersion();
4672272c481SPavel Labath   return version.empty() ? UINT32_MAX : version.getMajor();
468fbb76349SGreg Clayton }
469fbb76349SGreg Clayton 
GetOSMinorVersion()470b9c1b51eSKate Stone uint32_t SBPlatform::GetOSMinorVersion() {
4711755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
472baf5664fSJonas Devlieghere 
4732272c481SPavel Labath   llvm::VersionTuple version;
4742272c481SPavel Labath   if (PlatformSP platform_sp = GetSP())
4752272c481SPavel Labath     version = platform_sp->GetOSVersion();
476aa88161bSKazu Hirata   return version.getMinor().value_or(UINT32_MAX);
477fbb76349SGreg Clayton }
478fbb76349SGreg Clayton 
GetOSUpdateVersion()479b9c1b51eSKate Stone uint32_t SBPlatform::GetOSUpdateVersion() {
4801755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
481baf5664fSJonas Devlieghere 
4822272c481SPavel Labath   llvm::VersionTuple version;
4832272c481SPavel Labath   if (PlatformSP platform_sp = GetSP())
4842272c481SPavel Labath     version = platform_sp->GetOSVersion();
485aa88161bSKazu Hirata   return version.getSubminor().value_or(UINT32_MAX);
486fbb76349SGreg Clayton }
487fbb76349SGreg Clayton 
SetSDKRoot(const char * sysroot)48890342453SPavel Labath void SBPlatform::SetSDKRoot(const char *sysroot) {
4891755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, sysroot);
49090342453SPavel Labath   if (PlatformSP platform_sp = GetSP())
49190342453SPavel Labath     platform_sp->SetSDKRootDirectory(ConstString(sysroot));
49290342453SPavel Labath }
49390342453SPavel Labath 
Get(SBFileSpec & src,SBFileSpec & dst)494b9c1b51eSKate Stone SBError SBPlatform::Get(SBFileSpec &src, SBFileSpec &dst) {
4951755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, src, dst);
496baf5664fSJonas Devlieghere 
497fbb76349SGreg Clayton   SBError sb_error;
498fbb76349SGreg Clayton   PlatformSP platform_sp(GetSP());
499b9c1b51eSKate Stone   if (platform_sp) {
500fbb76349SGreg Clayton     sb_error.ref() = platform_sp->GetFile(src.ref(), dst.ref());
501b9c1b51eSKate Stone   } else {
502fbb76349SGreg Clayton     sb_error.SetErrorString("invalid platform");
503fbb76349SGreg Clayton   }
504d232abc3SJonas Devlieghere   return sb_error;
505fbb76349SGreg Clayton }
506fbb76349SGreg Clayton 
Put(SBFileSpec & src,SBFileSpec & dst)507b9c1b51eSKate Stone SBError SBPlatform::Put(SBFileSpec &src, SBFileSpec &dst) {
5081755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, src, dst);
509d232abc3SJonas Devlieghere   return ExecuteConnected([&](const lldb::PlatformSP &platform_sp) {
510b9c1b51eSKate Stone     if (src.Exists()) {
511d232abc3SJonas Devlieghere       uint32_t permissions = FileSystem::Instance().GetPermissions(src.ref());
512b9c1b51eSKate Stone       if (permissions == 0) {
5133a58d898SJonas Devlieghere         if (FileSystem::Instance().IsDirectory(src.ref()))
514fbb76349SGreg Clayton           permissions = eFilePermissionsDirectoryDefault;
515fbb76349SGreg Clayton         else
516fbb76349SGreg Clayton           permissions = eFilePermissionsFileDefault;
517fbb76349SGreg Clayton       }
518fbb76349SGreg Clayton 
5191ef7b2c8SOleksiy Vyalov       return platform_sp->PutFile(src.ref(), dst.ref(), permissions);
520fbb76349SGreg Clayton     }
5211ef7b2c8SOleksiy Vyalov 
52297206d57SZachary Turner     Status error;
523b9c1b51eSKate Stone     error.SetErrorStringWithFormat("'src' argument doesn't exist: '%s'",
524b9c1b51eSKate Stone                                    src.ref().GetPath().c_str());
5251ef7b2c8SOleksiy Vyalov     return error;
526d232abc3SJonas Devlieghere   });
527fbb76349SGreg Clayton }
528fbb76349SGreg Clayton 
Install(SBFileSpec & src,SBFileSpec & dst)529b9c1b51eSKate Stone SBError SBPlatform::Install(SBFileSpec &src, SBFileSpec &dst) {
5301755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, src, dst);
531d232abc3SJonas Devlieghere   return ExecuteConnected([&](const lldb::PlatformSP &platform_sp) {
532fbb76349SGreg Clayton     if (src.Exists())
5331ef7b2c8SOleksiy Vyalov       return platform_sp->Install(src.ref(), dst.ref());
5341ef7b2c8SOleksiy Vyalov 
53597206d57SZachary Turner     Status error;
536b9c1b51eSKate Stone     error.SetErrorStringWithFormat("'src' argument doesn't exist: '%s'",
537b9c1b51eSKate Stone                                    src.ref().GetPath().c_str());
5381ef7b2c8SOleksiy Vyalov     return error;
539d232abc3SJonas Devlieghere   });
540fbb76349SGreg Clayton }
541fbb76349SGreg Clayton 
Run(SBPlatformShellCommand & shell_command)542b9c1b51eSKate Stone SBError SBPlatform::Run(SBPlatformShellCommand &shell_command) {
5431755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, shell_command);
544d232abc3SJonas Devlieghere   return ExecuteConnected(
545d232abc3SJonas Devlieghere       [&](const lldb::PlatformSP &platform_sp) {
546fbb76349SGreg Clayton         const char *command = shell_command.GetCommand();
5471ef7b2c8SOleksiy Vyalov         if (!command)
54897206d57SZachary Turner           return Status("invalid shell command (empty)");
5491ef7b2c8SOleksiy Vyalov 
550*1b4b12a3SNico Weber         const char *working_dir = shell_command.GetWorkingDirectory();
551*1b4b12a3SNico Weber         if (working_dir == nullptr) {
552*1b4b12a3SNico Weber           working_dir = platform_sp->GetWorkingDirectory().GetCString();
553*1b4b12a3SNico Weber           if (working_dir)
554*1b4b12a3SNico Weber             shell_command.SetWorkingDirectory(working_dir);
555fbb76349SGreg Clayton         }
556bc0a35f3SJonas Devlieghere         return platform_sp->RunShellCommand(
557*1b4b12a3SNico Weber             shell_command.m_opaque_ptr->m_shell, command, FileSpec(working_dir),
558fbb76349SGreg Clayton             &shell_command.m_opaque_ptr->m_status,
559fbb76349SGreg Clayton             &shell_command.m_opaque_ptr->m_signo,
560fbb76349SGreg Clayton             &shell_command.m_opaque_ptr->m_output,
56119dd1a0eSPavel Labath             shell_command.m_opaque_ptr->m_timeout);
562d232abc3SJonas Devlieghere       });
563fbb76349SGreg Clayton }
5641ef7b2c8SOleksiy Vyalov 
Launch(SBLaunchInfo & launch_info)565b9c1b51eSKate Stone SBError SBPlatform::Launch(SBLaunchInfo &launch_info) {
5661755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, launch_info);
567d232abc3SJonas Devlieghere   return ExecuteConnected([&](const lldb::PlatformSP &platform_sp) {
56862930e57SPavel Labath     ProcessLaunchInfo info = launch_info.ref();
56962930e57SPavel Labath     Status error = platform_sp->LaunchProcess(info);
57062930e57SPavel Labath     launch_info.set_ref(info);
57162930e57SPavel Labath     return error;
572d232abc3SJonas Devlieghere   });
5731ef7b2c8SOleksiy Vyalov }
5741ef7b2c8SOleksiy Vyalov 
Kill(const lldb::pid_t pid)575b9c1b51eSKate Stone SBError SBPlatform::Kill(const lldb::pid_t pid) {
5761755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, pid);
577d232abc3SJonas Devlieghere   return ExecuteConnected([&](const lldb::PlatformSP &platform_sp) {
5781ef7b2c8SOleksiy Vyalov     return platform_sp->KillProcess(pid);
579d232abc3SJonas Devlieghere   });
5801ef7b2c8SOleksiy Vyalov }
5811ef7b2c8SOleksiy Vyalov 
ExecuteConnected(const std::function<Status (const lldb::PlatformSP &)> & func)582b9c1b51eSKate Stone SBError SBPlatform::ExecuteConnected(
58397206d57SZachary Turner     const std::function<Status(const lldb::PlatformSP &)> &func) {
5841ef7b2c8SOleksiy Vyalov   SBError sb_error;
5851ef7b2c8SOleksiy Vyalov   const auto platform_sp(GetSP());
586b9c1b51eSKate Stone   if (platform_sp) {
5871ef7b2c8SOleksiy Vyalov     if (platform_sp->IsConnected())
5881ef7b2c8SOleksiy Vyalov       sb_error.ref() = func(platform_sp);
5891ef7b2c8SOleksiy Vyalov     else
590fbb76349SGreg Clayton       sb_error.SetErrorString("not connected");
591b9c1b51eSKate Stone   } else
592fbb76349SGreg Clayton     sb_error.SetErrorString("invalid platform");
5931ef7b2c8SOleksiy Vyalov 
594fbb76349SGreg Clayton   return sb_error;
595fbb76349SGreg Clayton }
596fbb76349SGreg Clayton 
MakeDirectory(const char * path,uint32_t file_permissions)597b9c1b51eSKate Stone SBError SBPlatform::MakeDirectory(const char *path, uint32_t file_permissions) {
5981755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, path, file_permissions);
599baf5664fSJonas Devlieghere 
600fbb76349SGreg Clayton   SBError sb_error;
601fbb76349SGreg Clayton   PlatformSP platform_sp(GetSP());
602b9c1b51eSKate Stone   if (platform_sp) {
603b9c1b51eSKate Stone     sb_error.ref() =
6048f3be7a3SJonas Devlieghere         platform_sp->MakeDirectory(FileSpec(path), file_permissions);
605b9c1b51eSKate Stone   } else {
606fbb76349SGreg Clayton     sb_error.SetErrorString("invalid platform");
607fbb76349SGreg Clayton   }
608d232abc3SJonas Devlieghere   return sb_error;
609fbb76349SGreg Clayton }
610fbb76349SGreg Clayton 
GetFilePermissions(const char * path)611b9c1b51eSKate Stone uint32_t SBPlatform::GetFilePermissions(const char *path) {
6121755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, path);
613baf5664fSJonas Devlieghere 
614fbb76349SGreg Clayton   PlatformSP platform_sp(GetSP());
615b9c1b51eSKate Stone   if (platform_sp) {
616fbb76349SGreg Clayton     uint32_t file_permissions = 0;
6178f3be7a3SJonas Devlieghere     platform_sp->GetFilePermissions(FileSpec(path), file_permissions);
618fbb76349SGreg Clayton     return file_permissions;
619fbb76349SGreg Clayton   }
620fbb76349SGreg Clayton   return 0;
621fbb76349SGreg Clayton }
622fbb76349SGreg Clayton 
SetFilePermissions(const char * path,uint32_t file_permissions)623b9c1b51eSKate Stone SBError SBPlatform::SetFilePermissions(const char *path,
624b9c1b51eSKate Stone                                        uint32_t file_permissions) {
6251755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, path, file_permissions);
626baf5664fSJonas Devlieghere 
627fbb76349SGreg Clayton   SBError sb_error;
628fbb76349SGreg Clayton   PlatformSP platform_sp(GetSP());
629b9c1b51eSKate Stone   if (platform_sp) {
6308f3be7a3SJonas Devlieghere     sb_error.ref() =
6318f3be7a3SJonas Devlieghere         platform_sp->SetFilePermissions(FileSpec(path), file_permissions);
632b9c1b51eSKate Stone   } else {
633fbb76349SGreg Clayton     sb_error.SetErrorString("invalid platform");
634fbb76349SGreg Clayton   }
635d232abc3SJonas Devlieghere   return sb_error;
636fbb76349SGreg Clayton }
637fbb76349SGreg Clayton 
GetUnixSignals() const638b9c1b51eSKate Stone SBUnixSignals SBPlatform::GetUnixSignals() const {
6391755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
64098d0a4b3SChaoren Lin 
641baf5664fSJonas Devlieghere   if (auto platform_sp = GetSP())
642d232abc3SJonas Devlieghere     return SBUnixSignals{platform_sp};
643baf5664fSJonas Devlieghere 
644d232abc3SJonas Devlieghere   return SBUnixSignals();
64598d0a4b3SChaoren Lin }
646ae211eceSMichal Gorny 
GetEnvironment()647ca69be21SWalter Erquinigo SBEnvironment SBPlatform::GetEnvironment() {
6481755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
649ca69be21SWalter Erquinigo   PlatformSP platform_sp(GetSP());
650ca69be21SWalter Erquinigo 
651ca69be21SWalter Erquinigo   if (platform_sp) {
652d232abc3SJonas Devlieghere     return SBEnvironment(platform_sp->GetEnvironment());
653ca69be21SWalter Erquinigo   }
654ca69be21SWalter Erquinigo 
655d232abc3SJonas Devlieghere   return SBEnvironment();
656ca69be21SWalter Erquinigo }
657