Serenity Operating System
at master 58 lines 1.7 kB view raw
1/* 2 * Copyright (c) 2021, Xavier Defrang <xavier.defrang@gmail.com> 3 * 4 * SPDX-License-Identifier: BSD-2-Clause 5 */ 6 7#pragma once 8 9#include <AK/DeprecatedString.h> 10#include <AK/Error.h> 11#include <AK/OwnPtr.h> 12#include <sys/stat.h> 13 14namespace Core { 15 16class FilePermissionsMask { 17public: 18 static ErrorOr<FilePermissionsMask> parse(StringView string); 19 static ErrorOr<FilePermissionsMask> from_numeric_notation(StringView string); 20 static ErrorOr<FilePermissionsMask> from_symbolic_notation(StringView string); 21 22 FilePermissionsMask() 23 : m_clear_mask(0) 24 , m_write_mask(0) 25 { 26 } 27 28 FilePermissionsMask& assign_permissions(mode_t mode); 29 FilePermissionsMask& add_permissions(mode_t mode); 30 FilePermissionsMask& remove_permissions(mode_t mode); 31 32 mode_t apply(mode_t mode) const 33 { 34 if (m_directory_or_executable_mask && (S_ISDIR(mode) || (mode & 0111) != 0)) 35 mode = m_directory_or_executable_mask->apply(mode); 36 37 return m_write_mask | (mode & ~m_clear_mask); 38 } 39 mode_t clear_mask() const { return m_clear_mask; } 40 mode_t write_mask() const { return m_write_mask; } 41 42 FilePermissionsMask& directory_or_executable_mask() 43 { 44 if (!m_directory_or_executable_mask) 45 m_directory_or_executable_mask = make<FilePermissionsMask>(); 46 47 return *m_directory_or_executable_mask; 48 } 49 50private: 51 mode_t m_clear_mask; // the bits that will be cleared 52 mode_t m_write_mask; // the bits that will be set 53 54 // A separate mask, only for files that already have some executable bit set or directories. 55 OwnPtr<FilePermissionsMask> m_directory_or_executable_mask; 56}; 57 58}