boost/log/utility/permissions.hpp
/*
* 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 <boost/log/detail/config.hpp>
#include <boost/log/detail/header.hpp>
#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 <boost/log/detail/footer.hpp>
#endif // BOOST_LOG_UTILITY_PERMISSIONS_HPP_INCLUDED_