| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium 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 <dirent.h> | 5 #include <dirent.h> |
| 6 #include <errno.h> | 6 #include <errno.h> |
| 7 #include <fcntl.h> | 7 #include <fcntl.h> |
| 8 #include <signal.h> | 8 #include <signal.h> |
| 9 #include <stdlib.h> | 9 #include <stdlib.h> |
| 10 #include <sys/resource.h> | 10 #include <sys/resource.h> |
| (...skipping 397 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 408 // own use and will complain if we try to close them. All of | 408 // own use and will complain if we try to close them. All of |
| 409 // these FDs are >= |max_fds|, so we can check against that here | 409 // these FDs are >= |max_fds|, so we can check against that here |
| 410 // before closing. See https://bugs.kde.org/show_bug.cgi?id=191758 | 410 // before closing. See https://bugs.kde.org/show_bug.cgi?id=191758 |
| 411 if (fd < static_cast<int>(max_fds)) { | 411 if (fd < static_cast<int>(max_fds)) { |
| 412 int ret = HANDLE_EINTR(close(fd)); | 412 int ret = HANDLE_EINTR(close(fd)); |
| 413 DPCHECK(ret == 0); | 413 DPCHECK(ret == 0); |
| 414 } | 414 } |
| 415 } | 415 } |
| 416 } | 416 } |
| 417 | 417 |
| 418 char** AlterEnvironment(const environment_vector& changes, | 418 char** AlterEnvironment(const EnvironmentVector& changes, |
| 419 const char* const* const env) { | 419 const char* const* const env) { |
| 420 unsigned count = 0; | 420 unsigned count = 0; |
| 421 unsigned size = 0; | 421 unsigned size = 0; |
| 422 | 422 |
| 423 // First assume that all of the current environment will be included. | 423 // First assume that all of the current environment will be included. |
| 424 for (unsigned i = 0; env[i]; i++) { | 424 for (unsigned i = 0; env[i]; i++) { |
| 425 const char *const pair = env[i]; | 425 const char *const pair = env[i]; |
| 426 count++; | 426 count++; |
| 427 size += strlen(pair) + 1 /* terminating NUL */; | 427 size += strlen(pair) + 1 /* terminating NUL */; |
| 428 } | 428 } |
| 429 | 429 |
| 430 for (environment_vector::const_iterator | 430 for (EnvironmentVector::const_iterator j = changes.begin(); |
| 431 j = changes.begin(); j != changes.end(); j++) { | 431 j != changes.end(); |
| 432 ++j) { |
| 432 bool found = false; | 433 bool found = false; |
| 433 const char *pair; | 434 const char *pair; |
| 434 | 435 |
| 435 for (unsigned i = 0; env[i]; i++) { | 436 for (unsigned i = 0; env[i]; i++) { |
| 436 pair = env[i]; | 437 pair = env[i]; |
| 437 const char *const equals = strchr(pair, '='); | 438 const char *const equals = strchr(pair, '='); |
| 438 if (!equals) | 439 if (!equals) |
| 439 continue; | 440 continue; |
| 440 const unsigned keylen = equals - pair; | 441 const unsigned keylen = equals - pair; |
| 441 if (keylen == j->first.size() && | 442 if (keylen == j->first.size() && |
| (...skipping 29 matching lines...) Expand all Loading... |
| 471 const char *const equals = strchr(pair, '='); | 472 const char *const equals = strchr(pair, '='); |
| 472 if (!equals) { | 473 if (!equals) { |
| 473 const unsigned len = strlen(pair); | 474 const unsigned len = strlen(pair); |
| 474 ret[k++] = scratch; | 475 ret[k++] = scratch; |
| 475 memcpy(scratch, pair, len + 1); | 476 memcpy(scratch, pair, len + 1); |
| 476 scratch += len + 1; | 477 scratch += len + 1; |
| 477 continue; | 478 continue; |
| 478 } | 479 } |
| 479 const unsigned keylen = equals - pair; | 480 const unsigned keylen = equals - pair; |
| 480 bool handled = false; | 481 bool handled = false; |
| 481 for (environment_vector::const_iterator | 482 for (EnvironmentVector::const_iterator |
| 482 j = changes.begin(); j != changes.end(); j++) { | 483 j = changes.begin(); j != changes.end(); j++) { |
| 483 if (j->first.size() == keylen && | 484 if (j->first.size() == keylen && |
| 484 memcmp(j->first.data(), pair, keylen) == 0) { | 485 memcmp(j->first.data(), pair, keylen) == 0) { |
| 485 if (!j->second.empty()) { | 486 if (!j->second.empty()) { |
| 486 ret[k++] = scratch; | 487 ret[k++] = scratch; |
| 487 memcpy(scratch, pair, keylen + 1); | 488 memcpy(scratch, pair, keylen + 1); |
| 488 scratch += keylen + 1; | 489 scratch += keylen + 1; |
| 489 memcpy(scratch, j->second.c_str(), j->second.size() + 1); | 490 memcpy(scratch, j->second.c_str(), j->second.size() + 1); |
| 490 scratch += j->second.size() + 1; | 491 scratch += j->second.size() + 1; |
| 491 } | 492 } |
| 492 handled = true; | 493 handled = true; |
| 493 break; | 494 break; |
| 494 } | 495 } |
| 495 } | 496 } |
| 496 | 497 |
| 497 if (!handled) { | 498 if (!handled) { |
| 498 const unsigned len = strlen(pair); | 499 const unsigned len = strlen(pair); |
| 499 ret[k++] = scratch; | 500 ret[k++] = scratch; |
| 500 memcpy(scratch, pair, len + 1); | 501 memcpy(scratch, pair, len + 1); |
| 501 scratch += len + 1; | 502 scratch += len + 1; |
| 502 } | 503 } |
| 503 } | 504 } |
| 504 | 505 |
| 505 // Now handle new elements | 506 // Now handle new elements |
| 506 for (environment_vector::const_iterator | 507 for (EnvironmentVector::const_iterator |
| 507 j = changes.begin(); j != changes.end(); j++) { | 508 j = changes.begin(); j != changes.end(); j++) { |
| 508 if (j->second.empty()) | 509 if (j->second.empty()) |
| 509 continue; | 510 continue; |
| 510 | 511 |
| 511 bool found = false; | 512 bool found = false; |
| 512 for (unsigned i = 0; env[i]; i++) { | 513 for (unsigned i = 0; env[i]; i++) { |
| 513 const char *const pair = env[i]; | 514 const char *const pair = env[i]; |
| 514 const char *const equals = strchr(pair, '='); | 515 const char *const equals = strchr(pair, '='); |
| 515 if (!equals) | 516 if (!equals) |
| 516 continue; | 517 continue; |
| (...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 689 ioctl(options.ctrl_terminal_fd, TIOCSCTTY, NULL)) == -1) { | 690 ioctl(options.ctrl_terminal_fd, TIOCSCTTY, NULL)) == -1) { |
| 690 RAW_LOG(WARNING, "ioctl(TIOCSCTTY), ctrl terminal not set"); | 691 RAW_LOG(WARNING, "ioctl(TIOCSCTTY), ctrl terminal not set"); |
| 691 } | 692 } |
| 692 } else { | 693 } else { |
| 693 RAW_LOG(WARNING, "setsid failed, ctrl terminal not set"); | 694 RAW_LOG(WARNING, "setsid failed, ctrl terminal not set"); |
| 694 } | 695 } |
| 695 } | 696 } |
| 696 #endif // defined(OS_CHROMEOS) | 697 #endif // defined(OS_CHROMEOS) |
| 697 | 698 |
| 698 if (options.fds_to_remap) { | 699 if (options.fds_to_remap) { |
| 699 for (file_handle_mapping_vector::const_iterator | 700 for (FileHandleMappingVector::const_iterator |
| 700 it = options.fds_to_remap->begin(); | 701 it = options.fds_to_remap->begin(); |
| 701 it != options.fds_to_remap->end(); ++it) { | 702 it != options.fds_to_remap->end(); ++it) { |
| 702 fd_shuffle1.push_back(InjectionArc(it->first, it->second, false)); | 703 fd_shuffle1.push_back(InjectionArc(it->first, it->second, false)); |
| 703 fd_shuffle2.push_back(InjectionArc(it->first, it->second, false)); | 704 fd_shuffle2.push_back(InjectionArc(it->first, it->second, false)); |
| 704 } | 705 } |
| 705 } | 706 } |
| 706 | 707 |
| 707 #if defined(OS_MACOSX) | 708 #if defined(OS_MACOSX) |
| 708 if (options.synchronize) { | 709 if (options.synchronize) { |
| 709 // Remap the read side of the synchronization pipe back onto itself, | 710 // Remap the read side of the synchronization pipe back onto itself, |
| (...skipping 613 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1323 if (IsChildDead(process)) | 1324 if (IsChildDead(process)) |
| 1324 return; | 1325 return; |
| 1325 | 1326 |
| 1326 BackgroundReaper* reaper = new BackgroundReaper(process, 0); | 1327 BackgroundReaper* reaper = new BackgroundReaper(process, 0); |
| 1327 PlatformThread::CreateNonJoinable(0, reaper); | 1328 PlatformThread::CreateNonJoinable(0, reaper); |
| 1328 } | 1329 } |
| 1329 | 1330 |
| 1330 #endif // !defined(OS_MACOSX) | 1331 #endif // !defined(OS_MACOSX) |
| 1331 | 1332 |
| 1332 } // namespace base | 1333 } // namespace base |
| OLD | NEW |