xref: /llvm-project/libcxx/include/__filesystem/perms.h (revision beeb15b71650b46f39cb6b1917e8d05568978656)
17056250fSNikolas Klauser // -*- C++ -*-
27056250fSNikolas Klauser //===----------------------------------------------------------------------===//
37056250fSNikolas Klauser //
47056250fSNikolas Klauser // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
57056250fSNikolas Klauser // See https://llvm.org/LICENSE.txt for license information.
67056250fSNikolas Klauser // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
77056250fSNikolas Klauser //
87056250fSNikolas Klauser //===----------------------------------------------------------------------===//
97056250fSNikolas Klauser 
107056250fSNikolas Klauser #ifndef _LIBCPP___FILESYSTEM_PERMS_H
117056250fSNikolas Klauser #define _LIBCPP___FILESYSTEM_PERMS_H
127056250fSNikolas Klauser 
137056250fSNikolas Klauser #include <__config>
147056250fSNikolas Klauser 
15fa6b9e40SArthur O'Dwyer #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
16fa6b9e40SArthur O'Dwyer #  pragma GCC system_header
17fa6b9e40SArthur O'Dwyer #endif
18fa6b9e40SArthur O'Dwyer 
19ac8c9f1eSLouis Dionne #if _LIBCPP_STD_VER >= 17
207056250fSNikolas Klauser 
217056250fSNikolas Klauser _LIBCPP_BEGIN_NAMESPACE_FILESYSTEM
227056250fSNikolas Klauser 
237056250fSNikolas Klauser // On Windows, these permission bits map to one single readonly flag per
247056250fSNikolas Klauser // file, and the executable bit is always returned as set. When setting
257056250fSNikolas Klauser // permissions, as long as the write bit is set for either owner, group or
267056250fSNikolas Klauser // others, the readonly flag is cleared.
273583bf3aSNikolas Klauser enum class perms : unsigned {
287056250fSNikolas Klauser   none = 0,
297056250fSNikolas Klauser 
307056250fSNikolas Klauser   owner_read  = 0400,
317056250fSNikolas Klauser   owner_write = 0200,
327056250fSNikolas Klauser   owner_exec  = 0100,
337056250fSNikolas Klauser   owner_all   = 0700,
347056250fSNikolas Klauser 
357056250fSNikolas Klauser   group_read  = 040,
367056250fSNikolas Klauser   group_write = 020,
377056250fSNikolas Klauser   group_exec  = 010,
387056250fSNikolas Klauser   group_all   = 070,
397056250fSNikolas Klauser 
407056250fSNikolas Klauser   others_read  = 04,
417056250fSNikolas Klauser   others_write = 02,
427056250fSNikolas Klauser   others_exec  = 01,
437056250fSNikolas Klauser   others_all   = 07,
447056250fSNikolas Klauser 
457056250fSNikolas Klauser   all = 0777,
467056250fSNikolas Klauser 
477056250fSNikolas Klauser   set_uid    = 04000,
487056250fSNikolas Klauser   set_gid    = 02000,
497056250fSNikolas Klauser   sticky_bit = 01000,
507056250fSNikolas Klauser   mask       = 07777,
517056250fSNikolas Klauser   unknown    = 0xFFFF,
527056250fSNikolas Klauser };
537056250fSNikolas Klauser 
54*9783f28cSLouis Dionne _LIBCPP_HIDE_FROM_ABI inline constexpr perms operator&(perms __lhs, perms __rhs) {
55*9783f28cSLouis Dionne   return static_cast<perms>(static_cast<unsigned>(__lhs) & static_cast<unsigned>(__rhs));
567056250fSNikolas Klauser }
577056250fSNikolas Klauser 
58*9783f28cSLouis Dionne _LIBCPP_HIDE_FROM_ABI inline constexpr perms operator|(perms __lhs, perms __rhs) {
59*9783f28cSLouis Dionne   return static_cast<perms>(static_cast<unsigned>(__lhs) | static_cast<unsigned>(__rhs));
607056250fSNikolas Klauser }
617056250fSNikolas Klauser 
62*9783f28cSLouis Dionne _LIBCPP_HIDE_FROM_ABI inline constexpr perms operator^(perms __lhs, perms __rhs) {
63*9783f28cSLouis Dionne   return static_cast<perms>(static_cast<unsigned>(__lhs) ^ static_cast<unsigned>(__rhs));
647056250fSNikolas Klauser }
657056250fSNikolas Klauser 
66*9783f28cSLouis Dionne _LIBCPP_HIDE_FROM_ABI inline constexpr perms operator~(perms __lhs) {
67b48c5010SNikolas Klauser   return static_cast<perms>(~static_cast<unsigned>(__lhs));
687056250fSNikolas Klauser }
697056250fSNikolas Klauser 
70*9783f28cSLouis Dionne _LIBCPP_HIDE_FROM_ABI inline perms& operator&=(perms& __lhs, perms __rhs) { return __lhs = __lhs & __rhs; }
717056250fSNikolas Klauser 
72*9783f28cSLouis Dionne _LIBCPP_HIDE_FROM_ABI inline perms& operator|=(perms& __lhs, perms __rhs) { return __lhs = __lhs | __rhs; }
737056250fSNikolas Klauser 
74*9783f28cSLouis Dionne _LIBCPP_HIDE_FROM_ABI inline perms& operator^=(perms& __lhs, perms __rhs) { return __lhs = __lhs ^ __rhs; }
757056250fSNikolas Klauser 
767056250fSNikolas Klauser _LIBCPP_END_NAMESPACE_FILESYSTEM
777056250fSNikolas Klauser 
78ac8c9f1eSLouis Dionne #endif // _LIBCPP_STD_VER >= 17
797056250fSNikolas Klauser 
807056250fSNikolas Klauser #endif // _LIBCPP___FILESYSTEM_PERMS_H
81