blob: d3e769ae675b17da16a7747c5d61ed663cd27655 [file] [log] [blame]
Greg Claytonfbb76342013-11-20 21:07:01 +00001//===-- SBPlatform.cpp ------------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "lldb/API/SBPlatform.h"
11#include "lldb/API/SBError.h"
12#include "lldb/API/SBFileSpec.h"
13#include "lldb/Core/ArchSpec.h"
14#include "lldb/Core/Error.h"
15#include "lldb/Host/File.h"
16#include "lldb/Interpreter/Args.h"
17#include "lldb/Target/Target.h"
18#include "lldb/Target/Platform.h"
19
20using namespace lldb;
21using namespace lldb_private;
22
23//----------------------------------------------------------------------
24// PlatformConnectOptions
25//----------------------------------------------------------------------
26struct PlatformConnectOptions {
27 PlatformConnectOptions(const char *url = NULL) :
28 m_url(),
29 m_rsync_options(),
30 m_rsync_remote_path_prefix(),
31 m_rsync_enabled(false),
32 m_rsync_omit_hostname_from_remote_path(false),
33 m_local_cache_directory ()
34 {
35 if (url && url[0])
36 m_url = url;
37 }
38
39 ~PlatformConnectOptions()
40 {
41 }
42
43 std::string m_url;
44 std::string m_rsync_options;
45 std::string m_rsync_remote_path_prefix;
46 bool m_rsync_enabled;
47 bool m_rsync_omit_hostname_from_remote_path;
48 ConstString m_local_cache_directory;
49};
50
51//----------------------------------------------------------------------
52// PlatformShellCommand
53//----------------------------------------------------------------------
54struct PlatformShellCommand {
55 PlatformShellCommand(const char *shell_command = NULL) :
56 m_command(),
57 m_working_dir(),
58 m_status(0),
59 m_signo(0),
60 m_timeout_sec(UINT32_MAX)
61 {
62 if (shell_command && shell_command[0])
63 m_command = shell_command;
64 }
65
66 ~PlatformShellCommand()
67 {
68 }
69
70 std::string m_command;
71 std::string m_working_dir;
72 std::string m_output;
73 int m_status;
74 int m_signo;
75 uint32_t m_timeout_sec;
76};
77//----------------------------------------------------------------------
78// SBPlatformConnectOptions
79//----------------------------------------------------------------------
80SBPlatformConnectOptions::SBPlatformConnectOptions (const char *url) :
81 m_opaque_ptr(new PlatformConnectOptions(url))
82{
83
84}
85
86SBPlatformConnectOptions::SBPlatformConnectOptions(const SBPlatformConnectOptions &rhs) :
87 m_opaque_ptr(new PlatformConnectOptions())
88{
89 *m_opaque_ptr = *rhs.m_opaque_ptr;
90}
91
92SBPlatformConnectOptions::~SBPlatformConnectOptions ()
93{
94 delete m_opaque_ptr;
95}
96
97void
98SBPlatformConnectOptions::operator=(const SBPlatformConnectOptions &rhs)
99{
100 *m_opaque_ptr = *rhs.m_opaque_ptr;
101}
102
103const char *
104SBPlatformConnectOptions::GetURL()
105{
106 if (m_opaque_ptr->m_url.empty())
107 return NULL;
108 return m_opaque_ptr->m_url.c_str();
109}
110
111void
112SBPlatformConnectOptions::SetURL(const char *url)
113{
114 if (url && url[0])
115 m_opaque_ptr->m_url = url;
116 else
117 m_opaque_ptr->m_url.clear();
118}
119
120bool
121SBPlatformConnectOptions::GetRsyncEnabled()
122{
123 return m_opaque_ptr->m_rsync_enabled;
124}
125
126void
127SBPlatformConnectOptions::EnableRsync (const char *options,
128 const char *remote_path_prefix,
129 bool omit_hostname_from_remote_path)
130{
131 m_opaque_ptr->m_rsync_enabled = true;
132 m_opaque_ptr->m_rsync_omit_hostname_from_remote_path = omit_hostname_from_remote_path;
133 if (remote_path_prefix && remote_path_prefix[0])
134 m_opaque_ptr->m_rsync_remote_path_prefix = remote_path_prefix;
135 else
136 m_opaque_ptr->m_rsync_remote_path_prefix.clear();
137
138 if (options && options[0])
139 m_opaque_ptr->m_rsync_options = options;
140 else
141 m_opaque_ptr->m_rsync_options.clear();
142
143}
144
145void
146SBPlatformConnectOptions::DisableRsync ()
147{
148 m_opaque_ptr->m_rsync_enabled = false;
149}
150
151const char *
152SBPlatformConnectOptions::GetLocalCacheDirectory()
153{
154 return m_opaque_ptr->m_local_cache_directory.GetCString();
155}
156
157void
158SBPlatformConnectOptions::SetLocalCacheDirectory(const char *path)
159{
160 if (path && path[0])
161 m_opaque_ptr->m_local_cache_directory.SetCString(path);
162 else
163 m_opaque_ptr->m_local_cache_directory = ConstString();
164}
165
166//----------------------------------------------------------------------
167// SBPlatformShellCommand
168//----------------------------------------------------------------------
169SBPlatformShellCommand::SBPlatformShellCommand (const char *shell_command) :
170 m_opaque_ptr(new PlatformShellCommand(shell_command))
171{
172}
173
174SBPlatformShellCommand::SBPlatformShellCommand (const SBPlatformShellCommand &rhs) :
175 m_opaque_ptr(new PlatformShellCommand())
176{
177 *m_opaque_ptr = *rhs.m_opaque_ptr;
178}
179
180SBPlatformShellCommand::~SBPlatformShellCommand()
181{
182 delete m_opaque_ptr;
183}
184
185void
186SBPlatformShellCommand::Clear()
187{
188 m_opaque_ptr->m_output = std::move(std::string());
189 m_opaque_ptr->m_status = 0;
190 m_opaque_ptr->m_signo = 0;
191}
192
193const char *
194SBPlatformShellCommand::GetCommand()
195{
196 if (m_opaque_ptr->m_command.empty())
197 return NULL;
198 return m_opaque_ptr->m_command.c_str();
199}
200
201void
202SBPlatformShellCommand::SetCommand(const char *shell_command)
203{
204 if (shell_command && shell_command[0])
205 m_opaque_ptr->m_command = shell_command;
206 else
207 m_opaque_ptr->m_command.clear();
208}
209
210const char *
211SBPlatformShellCommand::GetWorkingDirectory ()
212{
213 if (m_opaque_ptr->m_working_dir.empty())
214 return NULL;
215 return m_opaque_ptr->m_working_dir.c_str();
216}
217
218void
219SBPlatformShellCommand::SetWorkingDirectory (const char *path)
220{
221 if (path && path[0])
222 m_opaque_ptr->m_working_dir = path;
223 else
224 m_opaque_ptr->m_working_dir.clear();
225}
226
227uint32_t
228SBPlatformShellCommand::GetTimeoutSeconds ()
229{
230 return m_opaque_ptr->m_timeout_sec;
231}
232
233void
234SBPlatformShellCommand::SetTimeoutSeconds (uint32_t sec)
235{
236 m_opaque_ptr->m_timeout_sec = sec;
237}
238
239int
240SBPlatformShellCommand::GetSignal ()
241{
242 return m_opaque_ptr->m_signo;
243}
244
245int
246SBPlatformShellCommand::GetStatus ()
247{
248 return m_opaque_ptr->m_status;
249}
250
251const char *
252SBPlatformShellCommand::GetOutput ()
253{
254 if (m_opaque_ptr->m_output.empty())
255 return NULL;
256 return m_opaque_ptr->m_output.c_str();
257}
258
259//----------------------------------------------------------------------
260// SBPlatform
261//----------------------------------------------------------------------
262SBPlatform::SBPlatform () :
263 m_opaque_sp ()
264{
265
266}
267
268SBPlatform::SBPlatform (const char *platform_name) :
269 m_opaque_sp ()
270{
271 Error error;
Greg Clayton615eb7e2014-09-19 20:11:50 +0000272 if (platform_name && platform_name[0])
273 m_opaque_sp = Platform::Create (ConstString(platform_name), error);
Greg Claytonfbb76342013-11-20 21:07:01 +0000274}
275
276SBPlatform::~SBPlatform()
277{
278}
279
280bool
281SBPlatform::IsValid () const
282{
283 return m_opaque_sp.get() != NULL;
284}
285
286void
287SBPlatform::Clear ()
288{
289 m_opaque_sp.reset();
290}
291
292const char *
293SBPlatform::GetName ()
294{
295 PlatformSP platform_sp(GetSP());
296 if (platform_sp)
297 return platform_sp->GetName().GetCString();
298 return NULL;
299}
300
301lldb::PlatformSP
302SBPlatform::GetSP () const
303{
304 return m_opaque_sp;
305}
306
307void
308SBPlatform::SetSP (const lldb::PlatformSP& platform_sp)
309{
310 m_opaque_sp = platform_sp;
311}
312
313const char *
314SBPlatform::GetWorkingDirectory()
315{
316 PlatformSP platform_sp(GetSP());
317 if (platform_sp)
318 return platform_sp->GetWorkingDirectory().GetCString();
319 return NULL;
320}
321
322bool
323SBPlatform::SetWorkingDirectory(const char *path)
324{
325 PlatformSP platform_sp(GetSP());
326 if (platform_sp)
327 {
328 if (path)
329 platform_sp->SetWorkingDirectory(ConstString(path));
330 else
331 platform_sp->SetWorkingDirectory(ConstString());
332 return true;
333 }
334 return false;
335}
336
337SBError
338SBPlatform::ConnectRemote (SBPlatformConnectOptions &connect_options)
339{
340 SBError sb_error;
341 PlatformSP platform_sp(GetSP());
342 if (platform_sp && connect_options.GetURL())
343 {
344 Args args;
345 args.AppendArgument(connect_options.GetURL());
346 sb_error.ref() = platform_sp->ConnectRemote(args);
347 }
348 else
349 {
350 sb_error.SetErrorString("invalid platform");
351 }
352 return sb_error;
353}
354
355void
356SBPlatform::DisconnectRemote ()
357{
358 PlatformSP platform_sp(GetSP());
359 if (platform_sp)
360 platform_sp->DisconnectRemote();
361}
362
363bool
364SBPlatform::IsConnected()
365{
366 PlatformSP platform_sp(GetSP());
367 if (platform_sp)
368 platform_sp->IsConnected();
369 return false;
370}
371
372const char *
373SBPlatform::GetTriple()
374{
375 PlatformSP platform_sp(GetSP());
376 if (platform_sp)
377 {
378 ArchSpec arch(platform_sp->GetRemoteSystemArchitecture());
379 if (arch.IsValid())
380 {
381 // Const-ify the string so we don't need to worry about the lifetime of the string
382 return ConstString(arch.GetTriple().getTriple().c_str()).GetCString();
383 }
384 }
385 return NULL;
386}
387
388const char *
389SBPlatform::GetOSBuild()
390{
391 PlatformSP platform_sp(GetSP());
392 if (platform_sp)
393 {
394 std::string s;
395 if (platform_sp->GetOSBuildString(s))
396 {
397 if (!s.empty())
398 {
399 // Const-ify the string so we don't need to worry about the lifetime of the string
400 return ConstString(s.c_str()).GetCString();
401 }
402 }
403 }
404 return NULL;
405}
406
407const char *
408SBPlatform::GetOSDescription()
409{
410 PlatformSP platform_sp(GetSP());
411 if (platform_sp)
412 {
413 std::string s;
414 if (platform_sp->GetOSKernelDescription(s))
415 {
416 if (!s.empty())
417 {
418 // Const-ify the string so we don't need to worry about the lifetime of the string
419 return ConstString(s.c_str()).GetCString();
420 }
421 }
422 }
423 return NULL;
424}
425
426const char *
427SBPlatform::GetHostname ()
428{
429 PlatformSP platform_sp(GetSP());
430 if (platform_sp)
431 return platform_sp->GetHostname();
432 return NULL;
433}
434
435uint32_t
436SBPlatform::GetOSMajorVersion ()
437{
438 uint32_t major, minor, update;
439 PlatformSP platform_sp(GetSP());
440 if (platform_sp && platform_sp->GetOSVersion(major, minor, update))
441 return major;
442 return UINT32_MAX;
443
444}
445
446uint32_t
447SBPlatform::GetOSMinorVersion ()
448{
449 uint32_t major, minor, update;
450 PlatformSP platform_sp(GetSP());
451 if (platform_sp && platform_sp->GetOSVersion(major, minor, update))
452 return minor;
453 return UINT32_MAX;
454}
455
456uint32_t
457SBPlatform::GetOSUpdateVersion ()
458{
459 uint32_t major, minor, update;
460 PlatformSP platform_sp(GetSP());
461 if (platform_sp && platform_sp->GetOSVersion(major, minor, update))
462 return update;
463 return UINT32_MAX;
464}
465
466SBError
467SBPlatform::Get (SBFileSpec &src,
468 SBFileSpec &dst)
469{
470 SBError sb_error;
471 PlatformSP platform_sp(GetSP());
472 if (platform_sp)
473 {
474 sb_error.ref() = platform_sp->GetFile(src.ref(), dst.ref());
475 }
476 else
477 {
478 sb_error.SetErrorString("invalid platform");
479 }
480 return sb_error;
481}
482
483SBError
484SBPlatform::Put (SBFileSpec &src,
485 SBFileSpec &dst)
486{
487 SBError sb_error;
488
489 PlatformSP platform_sp(GetSP());
490 if (platform_sp)
491 {
492 if (src.Exists())
493 {
494 uint32_t permissions = src.ref().GetPermissions();
495 if (permissions == 0)
496 {
497 if (src.ref().GetFileType() == FileSpec::eFileTypeDirectory)
498 permissions = eFilePermissionsDirectoryDefault;
499 else
500 permissions = eFilePermissionsFileDefault;
501 }
502
503 sb_error.ref() = platform_sp->PutFile(src.ref(),
504 dst.ref(),
505 permissions);
506 }
507 else
508 {
509 sb_error.ref().SetErrorStringWithFormat("'src' argument doesn't exist: '%s'", src.ref().GetPath().c_str());
510 }
511 }
512 else
513 {
514 sb_error.SetErrorString("invalid platform");
515 }
516 return sb_error;
517}
518
519SBError
520SBPlatform::Install (SBFileSpec &src,
521 SBFileSpec &dst)
522{
523 SBError sb_error;
524 PlatformSP platform_sp(GetSP());
525 if (platform_sp)
526 {
527 if (src.Exists())
528 {
529 sb_error.ref() = platform_sp->Install(src.ref(), dst.ref());
530 }
531 else
532 {
533 sb_error.ref().SetErrorStringWithFormat("'src' argument doesn't exist: '%s'", src.ref().GetPath().c_str());
534 }
535 }
536 else
537 {
538 sb_error.SetErrorString("invalid platform");
539 }
540 return sb_error;
541}
542
543
544SBError
545SBPlatform::Run (SBPlatformShellCommand &shell_command)
546{
547 SBError sb_error;
548 PlatformSP platform_sp(GetSP());
549 if (platform_sp)
550 {
551 if (platform_sp->IsConnected())
552 {
553 const char *command = shell_command.GetCommand();
554 if (command)
555 {
556 const char *working_dir = shell_command.GetWorkingDirectory();
557 if (working_dir == NULL)
558 {
559 working_dir = platform_sp->GetWorkingDirectory().GetCString();
560 if (working_dir)
561 shell_command.SetWorkingDirectory(working_dir);
562 }
563 sb_error.ref() = platform_sp->RunShellCommand(command,
564 working_dir,
565 &shell_command.m_opaque_ptr->m_status,
566 &shell_command.m_opaque_ptr->m_signo,
567 &shell_command.m_opaque_ptr->m_output,
568 shell_command.m_opaque_ptr->m_timeout_sec);
569 }
570 else
571 {
572 sb_error.SetErrorString("invalid shell command (empty)");
573 }
574 }
575 else
576 {
577 sb_error.SetErrorString("not connected");
578 }
579 }
580 else
581 {
582 sb_error.SetErrorString("invalid platform");
583 }
584 return sb_error;
585}
586
587SBError
588SBPlatform::MakeDirectory (const char *path, uint32_t file_permissions)
589{
590 SBError sb_error;
591 PlatformSP platform_sp(GetSP());
592 if (platform_sp)
593 {
594 sb_error.ref() = platform_sp->MakeDirectory(path, file_permissions);
595 }
596 else
597 {
598 sb_error.SetErrorString("invalid platform");
599 }
600 return sb_error;
601}
602
603uint32_t
604SBPlatform::GetFilePermissions (const char *path)
605{
606 PlatformSP platform_sp(GetSP());
607 if (platform_sp)
608 {
609 uint32_t file_permissions = 0;
610 platform_sp->GetFilePermissions(path, file_permissions);
611 return file_permissions;
612 }
613 return 0;
614
615}
616
617SBError
618SBPlatform::SetFilePermissions (const char *path, uint32_t file_permissions)
619{
620 SBError sb_error;
621 PlatformSP platform_sp(GetSP());
622 if (platform_sp)
623 {
624 sb_error.ref() = platform_sp->SetFilePermissions(path, file_permissions);
625 }
626 else
627 {
628 sb_error.SetErrorString("invalid platform");
629 }
630 return sb_error;
631
632}
633