| // Copyright 2019 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef LIBBRILLO_BRILLO_SCOPED_UMASK_H_ |
| #define LIBBRILLO_BRILLO_SCOPED_UMASK_H_ |
| |
| #include <sys/types.h> |
| |
| #include <base/macros.h> |
| #include <brillo/brillo_export.h> |
| |
| namespace brillo { |
| |
| // ScopedUmask is a helper class for temporarily setting the umask before a |
| // set of operations. umask(2) is never expected to fail. |
| class BRILLO_EXPORT ScopedUmask { |
| public: |
| explicit ScopedUmask(mode_t new_umask); |
| ScopedUmask(const ScopedUmask&) = delete; |
| ScopedUmask& operator=(const ScopedUmask&) = delete; |
| |
| ~ScopedUmask(); |
| |
| private: |
| mode_t saved_umask_; |
| |
| // Avoid reusing ScopedUmask for multiple masks. DISALLOW_COPY_AND_ASSIGN |
| // deletes the copy constructor and operator=, but there are other situations |
| // where reassigning a new ScopedUmask to an existing ScopedUmask object |
| // is problematic: |
| // |
| // /* starting umask: default_value |
| // auto a = std::make_unique<ScopedUmask>(first_value); |
| // ... code here ... |
| // a.reset(ScopedUmask(new_value)); |
| // |
| // Here, the order of destruction of the old object and the construction of |
| // the new object is inverted. The recommended usage would be: |
| // |
| // { |
| // ScopedUmask a(old_value); |
| // ... code here ... |
| // } |
| // |
| // { |
| // ScopedUmask a(new_value); |
| // ... code here ... |
| // } |
| }; |
| |
| } // namespace brillo |
| |
| #endif // LIBBRILLO_BRILLO_SCOPED_UMASK_H_ |