OLD | NEW |
1 // Copyright (c) 2009 The Native Client Authors. All rights reserved. | 1 // Copyright (c) 2009 The Native Client Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <limits> | 5 #include <limits> |
6 #include <new> | 6 #include <new> |
7 #include "native_client/src/include/portability.h" | 7 #include "native_client/src/include/portability.h" |
8 #include "native_client/src/include/portability_string.h" | 8 #include "native_client/src/include/portability_string.h" |
9 #include "native_client/src/shared/imc/nacl_imc.h" | 9 #include "native_client/src/shared/imc/nacl_imc.h" |
10 #include "native_client/src/shared/platform/nacl_log.h" | 10 #include "native_client/src/shared/platform/nacl_log.h" |
(...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
319 #endif // NACL_STANDALONE | 319 #endif // NACL_STANDALONE |
320 | 320 |
321 DescWrapper* DescWrapperFactory::MakeGeneric(struct NaClDesc* desc) { | 321 DescWrapper* DescWrapperFactory::MakeGeneric(struct NaClDesc* desc) { |
322 // Return an error if the factory wasn't properly initialized. | 322 // Return an error if the factory wasn't properly initialized. |
323 if (!common_data_->is_initialized()) { | 323 if (!common_data_->is_initialized()) { |
324 return NULL; | 324 return NULL; |
325 } | 325 } |
326 return new(std::nothrow) DescWrapper(common_data_, desc); | 326 return new(std::nothrow) DescWrapper(common_data_, desc); |
327 } | 327 } |
328 | 328 |
329 DescWrapper* DescWrapperFactory::MakeSocketAddress(const char* str) { | |
330 struct NaClDescConnCap* conn_cap = NULL; | |
331 DescWrapper* wrapper = NULL; | |
332 | |
333 // Ensure argument is a valid string short enough to be a socket address. | |
334 if (NULL == str) { | |
335 return NULL; | |
336 } | |
337 size_t len = strnlen(str, NACL_PATH_MAX); | |
338 // strnlen ensures NACL_PATH_MAX >= len. If NACL_PATH_MAX == len, then | |
339 // there is not enough room to hold the address. | |
340 if (NACL_PATH_MAX == len) { | |
341 return NULL; | |
342 } | |
343 // Create a NaClSocketAddress from the string. | |
344 struct NaClSocketAddress sock_addr; | |
345 // We need len + 1 to guarantee the zero byte is written. This is safe, | |
346 // since NACL_PATH_MAX >= len + 1 from above. | |
347 strncpy(sock_addr.path, str, len + 1); | |
348 // Create a NaClDescConnCap from the socket address. | |
349 conn_cap = reinterpret_cast<NaClDescConnCap*>( | |
350 calloc(1, sizeof(*conn_cap))); | |
351 if (NULL == conn_cap) { | |
352 goto cleanup; | |
353 } | |
354 if (!NaClDescConnCapCtor(conn_cap, &sock_addr)) { | |
355 free(conn_cap); | |
356 conn_cap = NULL; | |
357 goto cleanup; | |
358 } | |
359 wrapper = MakeGeneric(reinterpret_cast<struct NaClDesc*>(conn_cap)); | |
360 if (NULL == wrapper) { | |
361 goto cleanup; | |
362 } | |
363 // If wrapper was created, it took ownership. If not, NaClDescUnref freed it. | |
364 conn_cap = NULL; | |
365 return wrapper; | |
366 | |
367 cleanup: | |
368 NaClDescSafeUnref(reinterpret_cast<struct NaClDesc*>(conn_cap)); | |
369 return NULL; | |
370 } | |
371 | |
372 int DescWrapperFactory::MakeSocketPair(DescWrapper* pair[2]) { | 329 int DescWrapperFactory::MakeSocketPair(DescWrapper* pair[2]) { |
373 // Return an error if the factory wasn't properly initialized. | 330 // Return an error if the factory wasn't properly initialized. |
374 if (!common_data_->is_initialized()) { | 331 if (!common_data_->is_initialized()) { |
375 return -1; | 332 return -1; |
376 } | 333 } |
377 struct NaClDesc* descs[2] = { NULL, NULL }; | 334 struct NaClDesc* descs[2] = { NULL, NULL }; |
378 DescWrapper* tmp_pair[2] = { NULL, NULL }; | 335 DescWrapper* tmp_pair[2] = { NULL, NULL }; |
379 | 336 |
380 int ret = NaClCommonDescSocketPair(descs); | 337 int ret = NaClCommonDescSocketPair(descs); |
381 if (0 != ret) { | 338 if (0 != ret) { |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
466 } | 423 } |
467 | 424 |
468 DescWrapper::~DescWrapper() { | 425 DescWrapper::~DescWrapper() { |
469 if (NULL != common_data_) { | 426 if (NULL != common_data_) { |
470 common_data_->Unref(); | 427 common_data_->Unref(); |
471 } | 428 } |
472 NaClDescSafeUnref(desc_); | 429 NaClDescSafeUnref(desc_); |
473 desc_ = NULL; | 430 desc_ = NULL; |
474 } | 431 } |
475 | 432 |
476 const char* DescWrapper::conn_cap_path() const { | |
477 if (NULL == desc_ || NACL_DESC_CONN_CAP != type_tag()) { | |
478 return NULL; | |
479 } | |
480 struct NaClDescConnCap* conn_cap = | |
481 reinterpret_cast<struct NaClDescConnCap*>(desc_); | |
482 return conn_cap->cap.path; | |
483 } | |
484 | |
485 int DescWrapper::Map(void** addr, size_t* size) { | 433 int DescWrapper::Map(void** addr, size_t* size) { |
486 return NaClDescMapDescriptor(desc_, common_data_->effp(), addr, size); | 434 return NaClDescMapDescriptor(desc_, common_data_->effp(), addr, size); |
487 } | 435 } |
488 | 436 |
489 int DescWrapper::Unmap(void* start_addr, size_t len) { | 437 int DescWrapper::Unmap(void* start_addr, size_t len) { |
490 return desc_->vtbl->Unmap(desc_, common_data_->effp(), start_addr, len); | 438 return desc_->vtbl->Unmap(desc_, common_data_->effp(), start_addr, len); |
491 } | 439 } |
492 | 440 |
493 ssize_t DescWrapper::Read(void* buf, size_t len) { | 441 ssize_t DescWrapper::Read(void* buf, size_t len) { |
494 return desc_->vtbl->Read(desc_, common_data_->effp(), buf, len); | 442 return desc_->vtbl->Read(desc_, common_data_->effp(), buf, len); |
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
715 | 663 |
716 int DescWrapper::SemWait() { | 664 int DescWrapper::SemWait() { |
717 return desc_->vtbl->SemWait(desc_, common_data_->effp()); | 665 return desc_->vtbl->SemWait(desc_, common_data_->effp()); |
718 } | 666 } |
719 | 667 |
720 int DescWrapper::GetValue() { | 668 int DescWrapper::GetValue() { |
721 return desc_->vtbl->GetValue(desc_, common_data_->effp()); | 669 return desc_->vtbl->GetValue(desc_, common_data_->effp()); |
722 } | 670 } |
723 | 671 |
724 } // namespace nacl | 672 } // namespace nacl |
OLD | NEW |