From 46f403377367ee588fdaccc2291d4bfd555cfdbb Mon Sep 17 00:00:00 2001 From: Joshua Peraza Date: Wed, 5 Apr 2017 09:42:54 -0700 Subject: [PATCH] posix: Add ScopedDIR for managing open directories Change-Id: I9f1453db5e33e714c12ebeaaab25813a2b099de8 Reviewed-on: https://chromium-review.googlesource.com/468271 Commit-Queue: Joshua Peraza Reviewed-by: Mark Mentovai --- util/posix/close_multiple.cc | 14 +------------ util/posix/scoped_dir.cc | 30 ++++++++++++++++++++++++++++ util/posix/scoped_dir.h | 38 ++++++++++++++++++++++++++++++++++++ util/util.gyp | 2 ++ 4 files changed, 71 insertions(+), 13 deletions(-) create mode 100644 util/posix/scoped_dir.cc create mode 100644 util/posix/scoped_dir.h diff --git a/util/posix/close_multiple.cc b/util/posix/close_multiple.cc index 3749191b..908febf3 100644 --- a/util/posix/close_multiple.cc +++ b/util/posix/close_multiple.cc @@ -24,7 +24,6 @@ #include #include -#include #include "base/files/scoped_file.h" #include "base/logging.h" @@ -32,6 +31,7 @@ #include "build/build_config.h" #include "util/misc/implicit_cast.h" #include "util/numeric/safe_assignment.h" +#include "util/posix/scoped_dir.h" #if defined(OS_MACOSX) #include @@ -69,18 +69,6 @@ void CloseNowOrOnExec(int fd, bool ebadf_ok) { } } -struct ScopedDIRCloser { - void operator()(DIR* dir) const { - if (dir) { - if (closedir(dir) < 0) { - PLOG(ERROR) << "closedir"; - } - } - } -}; - -using ScopedDIR = std::unique_ptr; - // 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 diff --git a/util/posix/scoped_dir.cc b/util/posix/scoped_dir.cc new file mode 100644 index 00000000..555900a3 --- /dev/null +++ b/util/posix/scoped_dir.cc @@ -0,0 +1,30 @@ +// Copyright 2017 The Crashpad Authors. All rights reserved. +// +// 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/scoped_dir.h" + +#include "base/logging.h" +#include "base/posix/eintr_wrapper.h" + +namespace crashpad { +namespace internal { + +void ScopedDIRCloser::operator()(DIR* dir) const { + if (dir && IGNORE_EINTR(closedir(dir)) != 0) { + PLOG(ERROR) << "closedir"; + } +} + +} // namespace internal +} // namespace crashpad diff --git a/util/posix/scoped_dir.h b/util/posix/scoped_dir.h new file mode 100644 index 00000000..2eade40e --- /dev/null +++ b/util/posix/scoped_dir.h @@ -0,0 +1,38 @@ +// Copyright 2017 The Crashpad Authors. All rights reserved. +// +// 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. + +#ifndef CRASHPAD_UTIL_POSIX_SCOPED_DIR_H_ +#define CRASHPAD_UTIL_POSIX_SCOPED_DIR_H_ + +#include + +#include + +namespace crashpad { +namespace internal { + +struct ScopedDIRCloser { + void operator()(DIR* dir) const; +}; + +} // namespace internal + +//! \brief Maintains a directory opened by `opendir`. +//! +//! On destruction, the directory will be closed by calling `closedir`. +using ScopedDIR = std::unique_ptr; + +} // namespace crashpad + +#endif // CRASHPAD_UTIL_POSIX_SCOPED_DIR_H_ diff --git a/util/util.gyp b/util/util.gyp index aeb26e53..843f7c88 100644 --- a/util/util.gyp +++ b/util/util.gyp @@ -146,6 +146,8 @@ 'posix/process_info.h', 'posix/process_info_linux.cc', 'posix/process_info_mac.cc', + 'posix/scoped_dir.cc', + 'posix/scoped_dir.h', 'posix/scoped_mmap.cc', 'posix/scoped_mmap.h', 'posix/signals.cc',