// Copyright 2014 The Crashpad Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "util/posix/close_multiple.h" #include <errno.h> #include <fcntl.h> #include <limits.h> #include <stdio.h> #include <unistd.h> #include <algorithm> #include <iterator> #include "base/check_op.h" #include "base/files/scoped_file.h" #include "base/logging.h" #include "base/posix/eintr_wrapper.h" #include "base/strings/string_number_conversions.h" #include "build/build_config.h" #include "util/file/directory_reader.h" #include "util/misc/implicit_cast.h" #if BUILDFLAG(IS_APPLE) #include <sys/sysctl.h> #endif // Everything in this file is expected to execute between fork() and exec(), // so everything called here must be acceptable in this context. However, // logging code that is not expected to execute under normal circumstances is // currently permitted. namespace crashpad { namespace { // This function attempts to close |fd| or mark it as close-on-exec. On systems // where close-on-exec is attempted, a failure to mark it close-on-exec will be // followed by an attempt to close it. |ebadf_ok| should be set to |true| if // the caller is attempting to close the file descriptor “blind,” that is, // without knowledge that it is or is not a valid file descriptor. void CloseNowOrOnExec(int fd, bool ebadf_ok) { … } // This function implements CloseMultipleNowOrOnExec() using an operating // system-specific FD directory to determine which file descriptors are open. // This is an advantage over looping over all possible file descriptors, because // no attempt needs to be made to close file descriptors that are not open. bool CloseMultipleNowOrOnExecUsingFDDir(int min_fd, int preserve_fd) { … } } // namespace void CloseMultipleNowOrOnExec(int fd, int preserve_fd) { … } } // namespace crashpad