blob: d1652409750b75518220e6920ce5f6c806372b57 [file] [log] [blame] [edit]
// 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_