Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(221)

Side by Side Diff: src/trusted/nonnacl_util/sel_ldr_launcher.cc

Issue 10180015: Split SelLdrLauncher into SelLdrLauncher{Standalone,Chrome} classes (Closed) Base URL: svn://svn.chromium.org/native_client/trunk/src/native_client
Patch Set: Copyright Created 8 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2012 The Native Client Authors. All rights reserved. 2 * Copyright (c) 2012 The Native Client Authors. All rights reserved.
3 * Use of this source code is governed by a BSD-style license that can be 3 * Use of this source code is governed by a BSD-style license that can be
4 * found in the LICENSE file. 4 * found in the LICENSE file.
5 */ 5 */
6 6
7 #include <assert.h> 7 #include <assert.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <iterator> 10 #include <iterator>
(...skipping 11 matching lines...) Expand all
22 #include "native_client/src/trusted/desc/nacl_desc_wrapper.h" 22 #include "native_client/src/trusted/desc/nacl_desc_wrapper.h"
23 #include "native_client/src/trusted/nonnacl_util/sel_ldr_launcher.h" 23 #include "native_client/src/trusted/nonnacl_util/sel_ldr_launcher.h"
24 #include "native_client/src/trusted/service_runtime/env_cleanser.h" 24 #include "native_client/src/trusted/service_runtime/env_cleanser.h"
25 #include "native_client/src/trusted/service_runtime/nacl_error_code.h" 25 #include "native_client/src/trusted/service_runtime/nacl_error_code.h"
26 26
27 using std::vector; 27 using std::vector;
28 28
29 29
30 namespace nacl { 30 namespace nacl {
31 31
32 SelLdrLauncher::SelLdrLauncher() 32 SelLdrLauncherBase::SelLdrLauncherBase()
33 : 33 : channel_(kInvalidHandle),
34 #if defined(NACL_STANDALONE)
35 child_process_(kInvalidHandle),
36 #endif
37 channel_(kInvalidHandle),
38 bootstrap_socket_(NULL), 34 bootstrap_socket_(NULL),
39 socket_addr_(NULL), 35 socket_addr_(NULL) {
36 }
37
38 SelLdrLauncherBase::~SelLdrLauncherBase() {
39 if (kInvalidHandle != channel_) {
40 Close(channel_);
41 }
42 }
43
44 SelLdrLauncherStandalone::SelLdrLauncherStandalone()
45 : child_process_(kInvalidHandle),
40 sel_ldr_locator_(new PluginSelLdrLocator()) { 46 sel_ldr_locator_(new PluginSelLdrLocator()) {
41 } 47 }
42 48
43 SelLdrLauncher::SelLdrLauncher(SelLdrLocator* sel_ldr_locator) 49 void SelLdrLauncherStandalone::GetPluginDirectory(char* buffer, size_t len) {
44 :
45 #if defined(NACL_STANDALONE)
46 child_process_(kInvalidHandle),
47 #endif
48 channel_(kInvalidHandle),
49 bootstrap_socket_(NULL),
50 socket_addr_(NULL),
51 sel_ldr_locator_(sel_ldr_locator) {
52 CHECK(sel_ldr_locator != NULL);
53 }
54
55 void SelLdrLauncher::GetPluginDirectory(char* buffer, size_t len) {
56 sel_ldr_locator_->GetDirectory(buffer, len); 50 sel_ldr_locator_->GetDirectory(buffer, len);
57 } 51 }
58 52
59 static DescWrapper* GetSockAddr(DescWrapper* desc) { 53 static DescWrapper* GetSockAddr(DescWrapper* desc) {
60 DescWrapper::MsgHeader header; 54 DescWrapper::MsgHeader header;
61 DescWrapper::MsgIoVec iovec[1]; 55 DescWrapper::MsgIoVec iovec[1];
62 DescWrapper* descs[NACL_ABI_IMC_USER_DESC_MAX]; 56 DescWrapper* descs[NACL_ABI_IMC_USER_DESC_MAX];
63 scoped_array<unsigned char> bytes( 57 scoped_array<unsigned char> bytes(
64 new unsigned char[NACL_ABI_IMC_USER_BYTES_MAX]); 58 new unsigned char[NACL_ABI_IMC_USER_BYTES_MAX]);
65 if (bytes.get() == NULL) { 59 if (bytes.get() == NULL) {
(...skipping 13 matching lines...) Expand all
79 return NULL; 73 return NULL;
80 } 74 }
81 // Check that there was exactly one descriptor passed. 75 // Check that there was exactly one descriptor passed.
82 if (1 != header.ndescv_length) { 76 if (1 != header.ndescv_length) {
83 return NULL; 77 return NULL;
84 } 78 }
85 79
86 return descs[0]; 80 return descs[0];
87 } 81 }
88 82
89 bool SelLdrLauncher::SetupCommandAndLoad(NaClSrpcChannel* command, 83 bool SelLdrLauncherBase::SetupCommandAndLoad(NaClSrpcChannel* command,
90 DescWrapper* nexe) { 84 DescWrapper* nexe) {
91 // Get the bootstrap socket. 85 // Get the bootstrap socket.
92 CHECK(factory_ == NULL); 86 CHECK(factory_ == NULL);
93 factory_.reset(new DescWrapperFactory); 87 factory_.reset(new DescWrapperFactory);
94 CHECK(channel_ != kInvalidHandle); 88 CHECK(channel_ != kInvalidHandle);
95 bootstrap_socket_.reset(factory_->MakeImcSock(channel_)); 89 bootstrap_socket_.reset(factory_->MakeImcSock(channel_));
96 if (bootstrap_socket_ == NULL) { 90 if (bootstrap_socket_ == NULL) {
97 NaClLog(4, ("SelLdrLauncher::SetupCommandAndLoad: " 91 NaClLog(4, ("SelLdrLauncher::SetupCommandAndLoad: "
98 "getting bootstrap socket failed\n")); 92 "getting bootstrap socket failed\n"));
99 return false; 93 return false;
100 } 94 }
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
134 "rpc_result= %d is not successful\n", 128 "rpc_result= %d is not successful\n",
135 static_cast<int>(rpc_result)); 129 static_cast<int>(rpc_result));
136 NaClSrpcDtor(command); 130 NaClSrpcDtor(command);
137 return false; 131 return false;
138 } 132 }
139 } 133 }
140 return true; 134 return true;
141 } 135 }
142 136
143 bool 137 bool
144 SelLdrLauncher::StartModuleAndSetupAppChannel(NaClSrpcChannel* command, 138 SelLdrLauncherBase::StartModuleAndSetupAppChannel(
145 NaClSrpcChannel* out_app_chan) { 139 NaClSrpcChannel* command,
140 NaClSrpcChannel* out_app_chan) {
146 // Start untrusted code module. 141 // Start untrusted code module.
147 int start_result; 142 int start_result;
148 NaClSrpcResultCodes rpc_result = NaClSrpcInvokeBySignature(command, 143 NaClSrpcResultCodes rpc_result = NaClSrpcInvokeBySignature(command,
149 "start_module::i", 144 "start_module::i",
150 &start_result); 145 &start_result);
151 NaClLog(4, "SelLdrLauncher::StartModule rpc result %d\n", 146 NaClLog(4, "SelLdrLauncher::StartModule rpc result %d\n",
152 static_cast<int>(rpc_result)); 147 static_cast<int>(rpc_result));
153 if (NACL_SRPC_RESULT_OK != rpc_result && LOAD_OK != start_result) { 148 if (NACL_SRPC_RESULT_OK != rpc_result && LOAD_OK != start_result) {
154 NaClSrpcDtor(command); 149 NaClSrpcDtor(command);
155 NaClLog(4, "SelLdrLauncher::StartModuleAndSetupAppChannel: " 150 NaClLog(4, "SelLdrLauncher::StartModuleAndSetupAppChannel: "
(...skipping 26 matching lines...) Expand all
182 static char **GetEnviron() { 177 static char **GetEnviron() {
183 #if NACL_OSX 178 #if NACL_OSX
184 /* Mac dynamic libraries cannot access the environ variable directly. */ 179 /* Mac dynamic libraries cannot access the environ variable directly. */
185 return *_NSGetEnviron(); 180 return *_NSGetEnviron();
186 #else 181 #else
187 return environ; 182 return environ;
188 #endif 183 #endif
189 } 184 }
190 #endif 185 #endif
191 186
192 void SelLdrLauncher::BuildCommandLine(vector<nacl::string>* command) { 187 void SelLdrLauncherStandalone::BuildCommandLine(vector<nacl::string>* command) {
193 assert(sel_ldr_ != NACL_NO_FILE_PATH); // Set by InitCommandLine(). 188 assert(sel_ldr_ != NACL_NO_FILE_PATH); // Set by InitCommandLine().
194 if (!command_prefix_.empty()) 189 if (!command_prefix_.empty())
195 command->insert(command->end(), 190 command->insert(command->end(),
196 command_prefix_.begin(), command_prefix_.end()); 191 command_prefix_.begin(), command_prefix_.end());
197 if (!sel_ldr_bootstrap_.empty()) 192 if (!sel_ldr_bootstrap_.empty())
198 command->push_back(sel_ldr_bootstrap_); 193 command->push_back(sel_ldr_bootstrap_);
199 command->push_back(sel_ldr_); 194 command->push_back(sel_ldr_);
200 if (!sel_ldr_bootstrap_.empty()) 195 if (!sel_ldr_bootstrap_.empty())
201 command->push_back("--r_debug=0xXXXXXXXXXXXXXXXX"); 196 command->push_back("--r_debug=0xXXXXXXXXXXXXXXXX");
202 command->push_back("-R"); // RPC will be used to point to the nexe. 197 command->push_back("-R"); // RPC will be used to point to the nexe.
(...skipping 22 matching lines...) Expand all
225 #endif 220 #endif
226 221
227 if (application_argv_.size() > 0) { 222 if (application_argv_.size() > 0) {
228 // Separator between sel_universal and app args. 223 // Separator between sel_universal and app args.
229 command->push_back("--"); 224 command->push_back("--");
230 command->insert(command->end(), 225 command->insert(command->end(),
231 application_argv_.begin(), application_argv_.end()); 226 application_argv_.begin(), application_argv_.end());
232 } 227 }
233 } 228 }
234 229
235 void SelLdrLauncher::InitCommandLine(const vector<nacl::string>& prefix, 230 void SelLdrLauncherStandalone::InitCommandLine(
236 const vector<nacl::string>& sel_ldr_argv, 231 const vector<nacl::string>& prefix,
237 const vector<nacl::string>& app_argv) { 232 const vector<nacl::string>& sel_ldr_argv,
233 const vector<nacl::string>& app_argv) {
238 assert(sel_ldr_ == NACL_NO_FILE_PATH); // Make sure we don't call this twice. 234 assert(sel_ldr_ == NACL_NO_FILE_PATH); // Make sure we don't call this twice.
239 235
240 char* var = getenv("NACL_SEL_LDR"); 236 char* var = getenv("NACL_SEL_LDR");
241 if (var != NULL) { 237 if (var != NULL) {
242 sel_ldr_ = var; 238 sel_ldr_ = var;
243 } else { 239 } else {
244 sel_ldr_ = GetSelLdrPathName(); 240 sel_ldr_ = GetSelLdrPathName();
245 } 241 }
246 char *bootstrap_var = getenv("NACL_SEL_LDR_BOOTSTRAP"); 242 char *bootstrap_var = getenv("NACL_SEL_LDR_BOOTSTRAP");
247 if (bootstrap_var != NULL) { 243 if (bootstrap_var != NULL) {
(...skipping 19 matching lines...) Expand all
267 // NaCl module. 263 // NaCl module.
268 // "-i" maps the host OS file descriptor dest_fd into the nexe namespace as 264 // "-i" maps the host OS file descriptor dest_fd into the nexe namespace as
269 // file descriptor 5. 265 // file descriptor 5.
270 // TODO(sehr): remove the -i option and use the dest_fd directly with -X. 266 // TODO(sehr): remove the -i option and use the dest_fd directly with -X.
271 sel_ldr_argv_.push_back("-X"); 267 sel_ldr_argv_.push_back("-X");
272 sel_ldr_argv_.push_back("5"); 268 sel_ldr_argv_.push_back("5");
273 sel_ldr_argv_.push_back("-i"); 269 sel_ldr_argv_.push_back("-i");
274 sel_ldr_argv_.push_back(nacl::string("5:") + dest_fd); 270 sel_ldr_argv_.push_back(nacl::string("5:") + dest_fd);
275 } 271 }
276 272
277 void SelLdrLauncher::CloseHandlesAfterLaunch() { 273 void SelLdrLauncherStandalone::CloseHandlesAfterLaunch() {
278 for (size_t i = 0; i < close_after_launch_.size(); i++) { 274 for (size_t i = 0; i < close_after_launch_.size(); i++) {
279 Close(close_after_launch_[i]); 275 Close(close_after_launch_[i]);
280 } 276 }
281 close_after_launch_.clear(); 277 close_after_launch_.clear();
282 } 278 }
283 279
284 DescWrapper* SelLdrLauncher::Wrap(NaClDesc* raw_desc) { 280 DescWrapper* SelLdrLauncherBase::Wrap(NaClDesc* raw_desc) {
285 CHECK(factory_ != NULL); 281 CHECK(factory_ != NULL);
286 return factory_->MakeGeneric(raw_desc); 282 return factory_->MakeGeneric(raw_desc);
287 } 283 }
288 284
289 DescWrapper* SelLdrLauncher::WrapCleanup(NaClDesc* raw_desc) { 285 DescWrapper* SelLdrLauncherBase::WrapCleanup(NaClDesc* raw_desc) {
290 CHECK(factory_ != NULL); 286 CHECK(factory_ != NULL);
291 return factory_->MakeGenericCleanup(raw_desc); 287 return factory_->MakeGenericCleanup(raw_desc);
292 } 288 }
293 289
294 #if defined(NACL_STANDALONE) 290 bool SelLdrLauncherStandalone::Start(const char* url) {
295 bool SelLdrLauncher::Start(const char* url) {
296 UNREFERENCED_PARAMETER(url); 291 UNREFERENCED_PARAMETER(url);
297 vector<nacl::string> prefix; 292 vector<nacl::string> prefix;
298 vector<nacl::string> args_for_sel_ldr; 293 vector<nacl::string> args_for_sel_ldr;
299 vector<nacl::string> args_for_nexe; 294 vector<nacl::string> args_for_nexe;
300 const char* irt_library_path = getenv("NACL_IRT_LIBRARY"); 295 const char* irt_library_path = getenv("NACL_IRT_LIBRARY");
301 if (NULL != irt_library_path) { 296 if (NULL != irt_library_path) {
302 args_for_sel_ldr.push_back("-B"); 297 args_for_sel_ldr.push_back("-B");
303 args_for_sel_ldr.push_back(irt_library_path); 298 args_for_sel_ldr.push_back(irt_library_path);
304 } 299 }
305 if (!StartViaCommandLine(prefix, args_for_sel_ldr, args_for_nexe)) { 300 if (!StartViaCommandLine(prefix, args_for_sel_ldr, args_for_nexe)) {
306 return false; 301 return false;
307 } 302 }
308 return true; 303 return true;
309 } 304 }
310 305
311 bool SelLdrLauncher::Start(int socket_count,
312 Handle* result_sockets,
313 const char* url) {
314 UNREFERENCED_PARAMETER(socket_count);
315 UNREFERENCED_PARAMETER(result_sockets);
316 return Start(url);
317 }
318 #endif // defined(NACL_STANDALONE)
319
320 } // namespace nacl 306 } // namespace nacl
OLDNEW
« no previous file with comments | « src/trusted/nonnacl_util/sel_ldr_launcher.h ('k') | src/trusted/nonnacl_util/sel_ldr_launcher_chrome.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698