/* * Copyright Lingxi Li 2015. * Copyright Andrey Semashev 2015. * Distributed under the Boost Software License, Version 1.0. * (See accompanying file LICENSE_1_0.txt or copy at * http://www.boost.org/LICENSE_1_0.txt) */ /*! * \file permissions.hpp * \author Lingxi Li * \author Andrey Semashev * \date 14.10.2015 * * The header contains an abstraction wrapper for security permissions. */ #ifndef BOOST_LOG_UTILITY_PERMISSIONS_HPP_INCLUDED_ #define BOOST_LOG_UTILITY_PERMISSIONS_HPP_INCLUDED_ #include #include #ifdef BOOST_HAS_PRAGMA_ONCE #pragma once #endif #ifdef BOOST_WINDOWS extern "C" { struct _SECURITY_ATTRIBUTES; } #endif // BOOST_WINDOWS namespace boost { #ifdef BOOST_WINDOWS #if defined(BOOST_GCC) && BOOST_GCC >= 40600 #pragma GCC diagnostic push // type attributes ignored after type is already defined #pragma GCC diagnostic ignored "-Wattributes" #endif namespace winapi { struct BOOST_LOG_MAY_ALIAS _SECURITY_ATTRIBUTES; } #if defined(BOOST_GCC) && BOOST_GCC >= 40600 #pragma GCC diagnostic pop #endif #endif namespace interprocess { class permissions; } // namespace interprocess BOOST_LOG_OPEN_NAMESPACE /*! * \brief Access permissions wrapper. * * On Windows platforms, it represents a pointer to \c SECURITY_ATTRIBUTES. The user is responsible * for allocating and reclaiming resources associated with the pointer, \c permissions instance does * not own them. * * On POSIX platforms, it represents a \c mode_t value. */ class permissions { public: #if defined(BOOST_LOG_DOXYGEN_PASS) //! The type of security permissions, specific to the operating system typedef implementation_defined native_type; #elif defined(BOOST_WINDOWS) typedef ::_SECURITY_ATTRIBUTES* native_type; #else // Equivalent to POSIX mode_t typedef unsigned int native_type; #endif #if !defined(BOOST_LOG_DOXYGEN_PASS) private: native_type m_perms; #endif public: /*! * Default constructor. The method constructs an object that represents * a null \c SECURITY_ATTRIBUTES pointer on Windows platforms, and a * \c mode_t value \c 0644 on POSIX platforms. */ permissions() BOOST_NOEXCEPT { set_default(); } /*! * Copy constructor. */ permissions(permissions const& that) BOOST_NOEXCEPT : m_perms(that.m_perms) { } /*! * Copy assignment. */ permissions& operator=(permissions const& that) BOOST_NOEXCEPT { m_perms = that.m_perms; return *this; } /*! * Initializing constructor. */ permissions(native_type perms) BOOST_NOEXCEPT : m_perms(perms) { } #ifdef BOOST_WINDOWS permissions(boost::winapi::_SECURITY_ATTRIBUTES* perms) BOOST_NOEXCEPT : m_perms(reinterpret_cast< native_type >(perms)) { } #endif /*! * Initializing constructor. */ BOOST_LOG_API permissions(boost::interprocess::permissions const& perms) BOOST_NOEXCEPT; #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) /*! * Move constructor. */ permissions(permissions&& that) BOOST_NOEXCEPT : m_perms(that.m_perms) { that.set_default(); } /*! * Move assignment. */ permissions& operator=(permissions&& that) BOOST_NOEXCEPT { m_perms = that.m_perms; that.set_default(); return *this; } #endif /*! * Sets permissions from the OS-specific permissions. */ void set_native(native_type perms) BOOST_NOEXCEPT { m_perms = perms; } /*! * Returns the underlying OS-specific permissions. */ native_type get_native() const BOOST_NOEXCEPT { return m_perms; } /*! * Sets the default permissions, which are equivalent to \c NULL \c SECURITY_ATTRIBUTES * on Windows and \c 0644 on POSIX platforms. */ void set_default() BOOST_NOEXCEPT { #if defined(BOOST_WINDOWS) m_perms = 0; #else m_perms = 0644; #endif } /*! * Sets unrestricted permissions, which are equivalent to \c SECURITY_ATTRIBUTES with \c NULL DACL * on Windows and \c 0666 on POSIX platforms. */ void set_unrestricted() { #if defined(BOOST_WINDOWS) m_perms = get_unrestricted_security_attributes(); #else m_perms = 0666; #endif } /*! * The method swaps the object with \a that. * * \param that The other object to swap with. */ void swap(permissions& that) BOOST_NOEXCEPT { native_type perms = m_perms; m_perms = that.m_perms; that.m_perms = perms; } //! Swaps the two \c permissions objects. friend void swap(permissions& a, permissions& b) BOOST_NOEXCEPT { a.swap(b); } #if !defined(BOOST_LOG_DOXYGEN_PASS) && defined(BOOST_WINDOWS) private: static BOOST_LOG_API native_type get_unrestricted_security_attributes(); #endif }; BOOST_LOG_CLOSE_NAMESPACE // namespace log } // namespace boost #include #endif // BOOST_LOG_UTILITY_PERMISSIONS_HPP_INCLUDED_