| OLD | NEW |
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 97 }; | 97 }; |
| 98 typedef scoped_ptr_malloc<DIR, ScopedDIRClose> ScopedDIR; | 98 typedef scoped_ptr_malloc<DIR, ScopedDIRClose> ScopedDIR; |
| 99 | 99 |
| 100 void CloseSuperfluousFds(const base::InjectiveMultimap& saved_mapping) { | 100 void CloseSuperfluousFds(const base::InjectiveMultimap& saved_mapping) { |
| 101 #if defined(OS_LINUX) | 101 #if defined(OS_LINUX) |
| 102 static const rlim_t kSystemDefaultMaxFds = 8192; | 102 static const rlim_t kSystemDefaultMaxFds = 8192; |
| 103 static const char fd_dir[] = "/proc/self/fd"; | 103 static const char fd_dir[] = "/proc/self/fd"; |
| 104 #elif defined(OS_MACOSX) | 104 #elif defined(OS_MACOSX) |
| 105 static const rlim_t kSystemDefaultMaxFds = 256; | 105 static const rlim_t kSystemDefaultMaxFds = 256; |
| 106 static const char fd_dir[] = "/dev/fd"; | 106 static const char fd_dir[] = "/dev/fd"; |
| 107 #elif defined(OS_OPENBSD) |
| 108 static const rlim_t kSystemDefaultMaxFds = 256; |
| 109 static const char fd_dir[] = "/dev/fd"; |
| 107 #endif | 110 #endif |
| 108 std::set<int> saved_fds; | 111 std::set<int> saved_fds; |
| 109 | 112 |
| 110 // Get the maximum number of FDs possible. | 113 // Get the maximum number of FDs possible. |
| 111 struct rlimit nofile; | 114 struct rlimit nofile; |
| 112 rlim_t max_fds; | 115 rlim_t max_fds; |
| 113 if (getrlimit(RLIMIT_NOFILE, &nofile)) { | 116 if (getrlimit(RLIMIT_NOFILE, &nofile)) { |
| 114 // getrlimit failed. Take a best guess. | 117 // getrlimit failed. Take a best guess. |
| 115 max_fds = kSystemDefaultMaxFds; | 118 max_fds = kSystemDefaultMaxFds; |
| 116 DLOG(ERROR) << "getrlimit(RLIMIT_NOFILE) failed: " << errno; | 119 DLOG(ERROR) << "getrlimit(RLIMIT_NOFILE) failed: " << errno; |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 173 } | 176 } |
| 174 } | 177 } |
| 175 | 178 |
| 176 // Sets all file descriptors to close on exec except for stdin, stdout | 179 // Sets all file descriptors to close on exec except for stdin, stdout |
| 177 // and stderr. | 180 // and stderr. |
| 178 // TODO(agl): Remove this function. It's fundamentally broken for multithreaded | 181 // TODO(agl): Remove this function. It's fundamentally broken for multithreaded |
| 179 // apps. | 182 // apps. |
| 180 void SetAllFDsToCloseOnExec() { | 183 void SetAllFDsToCloseOnExec() { |
| 181 #if defined(OS_LINUX) | 184 #if defined(OS_LINUX) |
| 182 const char fd_dir[] = "/proc/self/fd"; | 185 const char fd_dir[] = "/proc/self/fd"; |
| 183 #elif defined(OS_MACOSX) | 186 #elif defined(OS_MACOSX) || defined(OS_OPENBSD) |
| 184 const char fd_dir[] = "/dev/fd"; | 187 const char fd_dir[] = "/dev/fd"; |
| 185 #endif | 188 #endif |
| 186 ScopedDIR dir_closer(opendir(fd_dir)); | 189 ScopedDIR dir_closer(opendir(fd_dir)); |
| 187 DIR *dir = dir_closer.get(); | 190 DIR *dir = dir_closer.get(); |
| 188 if (NULL == dir) { | 191 if (NULL == dir) { |
| 189 DLOG(ERROR) << "Unable to open " << fd_dir; | 192 DLOG(ERROR) << "Unable to open " << fd_dir; |
| 190 return; | 193 return; |
| 191 } | 194 } |
| 192 | 195 |
| 193 struct dirent *ent; | 196 struct dirent *ent; |
| (...skipping 337 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 531 const ProcessFilter* filter) { | 534 const ProcessFilter* filter) { |
| 532 bool exited_cleanly = | 535 bool exited_cleanly = |
| 533 WaitForProcessesToExit(executable_name, wait_milliseconds, | 536 WaitForProcessesToExit(executable_name, wait_milliseconds, |
| 534 filter); | 537 filter); |
| 535 if (!exited_cleanly) | 538 if (!exited_cleanly) |
| 536 KillProcesses(executable_name, exit_code, filter); | 539 KillProcesses(executable_name, exit_code, filter); |
| 537 return exited_cleanly; | 540 return exited_cleanly; |
| 538 } | 541 } |
| 539 | 542 |
| 540 } // namespace base | 543 } // namespace base |
| OLD | NEW |