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