Serenity Operating System
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}