1 //===-- CommandOptionsProcessLaunch.cpp -----------------------------------===//
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 #include "CommandOptionsProcessLaunch.h"
10
11 #include "lldb/Host/FileSystem.h"
12 #include "lldb/Host/HostInfo.h"
13 #include "lldb/Host/OptionParser.h"
14 #include "lldb/Interpreter/CommandCompletions.h"
15 #include "lldb/Interpreter/OptionArgParser.h"
16 #include "lldb/Target/ExecutionContext.h"
17 #include "lldb/Target/Platform.h"
18 #include "lldb/Target/Target.h"
19
20 #include "llvm/ADT/ArrayRef.h"
21
22 using namespace llvm;
23 using namespace lldb;
24 using namespace lldb_private;
25
26 #define LLDB_OPTIONS_process_launch
27 #include "CommandOptions.inc"
28
SetOptionValue(uint32_t option_idx,llvm::StringRef option_arg,ExecutionContext * execution_context)29 Status CommandOptionsProcessLaunch::SetOptionValue(
30 uint32_t option_idx, llvm::StringRef option_arg,
31 ExecutionContext *execution_context) {
32 Status error;
33 const int short_option = g_process_launch_options[option_idx].short_option;
34
35 switch (short_option) {
36 case 's': // Stop at program entry point
37 launch_info.GetFlags().Set(eLaunchFlagStopAtEntry);
38 break;
39
40 case 'i': // STDIN for read only
41 {
42 FileAction action;
43 if (action.Open(STDIN_FILENO, FileSpec(option_arg), true, false))
44 launch_info.AppendFileAction(action);
45 break;
46 }
47
48 case 'o': // Open STDOUT for write only
49 {
50 FileAction action;
51 if (action.Open(STDOUT_FILENO, FileSpec(option_arg), false, true))
52 launch_info.AppendFileAction(action);
53 break;
54 }
55
56 case 'e': // STDERR for write only
57 {
58 FileAction action;
59 if (action.Open(STDERR_FILENO, FileSpec(option_arg), false, true))
60 launch_info.AppendFileAction(action);
61 break;
62 }
63
64 case 'P': // Process plug-in name
65 launch_info.SetProcessPluginName(option_arg);
66 break;
67
68 case 'n': // Disable STDIO
69 {
70 FileAction action;
71 const FileSpec dev_null(FileSystem::DEV_NULL);
72 if (action.Open(STDIN_FILENO, dev_null, true, false))
73 launch_info.AppendFileAction(action);
74 if (action.Open(STDOUT_FILENO, dev_null, false, true))
75 launch_info.AppendFileAction(action);
76 if (action.Open(STDERR_FILENO, dev_null, false, true))
77 launch_info.AppendFileAction(action);
78 break;
79 }
80
81 case 'w':
82 launch_info.SetWorkingDirectory(FileSpec(option_arg));
83 break;
84
85 case 't': // Open process in new terminal window
86 launch_info.GetFlags().Set(eLaunchFlagLaunchInTTY);
87 break;
88
89 case 'a': {
90 TargetSP target_sp =
91 execution_context ? execution_context->GetTargetSP() : TargetSP();
92 PlatformSP platform_sp =
93 target_sp ? target_sp->GetPlatform() : PlatformSP();
94 launch_info.GetArchitecture() =
95 Platform::GetAugmentedArchSpec(platform_sp.get(), option_arg);
96 } break;
97
98 case 'A': // Disable ASLR.
99 {
100 bool success;
101 const bool disable_aslr_arg =
102 OptionArgParser::ToBoolean(option_arg, true, &success);
103 if (success)
104 disable_aslr = disable_aslr_arg ? eLazyBoolYes : eLazyBoolNo;
105 else
106 error.SetErrorStringWithFormat(
107 "Invalid boolean value for disable-aslr option: '%s'",
108 option_arg.empty() ? "<null>" : option_arg.str().c_str());
109 break;
110 }
111
112 case 'X': // shell expand args.
113 {
114 bool success;
115 const bool expand_args =
116 OptionArgParser::ToBoolean(option_arg, true, &success);
117 if (success)
118 launch_info.SetShellExpandArguments(expand_args);
119 else
120 error.SetErrorStringWithFormat(
121 "Invalid boolean value for shell-expand-args option: '%s'",
122 option_arg.empty() ? "<null>" : option_arg.str().c_str());
123 break;
124 }
125
126 case 'c':
127 if (!option_arg.empty())
128 launch_info.SetShell(FileSpec(option_arg));
129 else
130 launch_info.SetShell(HostInfo::GetDefaultShell());
131 break;
132
133 case 'E':
134 launch_info.GetEnvironment().insert(option_arg);
135 break;
136
137 default:
138 error.SetErrorStringWithFormat("unrecognized short option character '%c'",
139 short_option);
140 break;
141 }
142 return error;
143 }
144
GetDefinitions()145 llvm::ArrayRef<OptionDefinition> CommandOptionsProcessLaunch::GetDefinitions() {
146 return llvm::makeArrayRef(g_process_launch_options);
147 }
148