Serenity Operating System
1/*
2 * Copyright (c) 2020, the SerenityOS developers.
3 *
4 * SPDX-License-Identifier: BSD-2-Clause
5 */
6
7#pragma once
8
9#include <AK/Trie.h>
10#include <Kernel/KString.h>
11
12namespace Kernel {
13
14enum UnveilAccess {
15 Read = 1,
16 Write = 2,
17 Execute = 4,
18 CreateOrRemove = 8,
19 Browse = 16,
20
21 None = 0,
22};
23
24struct UnveilNode;
25
26struct UnveilMetadata {
27 NonnullOwnPtr<KString> full_path;
28 UnveilAccess permissions { None };
29 bool explicitly_unveiled { false };
30
31 UnveilMetadata(UnveilMetadata const&) = delete;
32 UnveilMetadata(UnveilMetadata&&) = default;
33
34 // Note: Intentionally not explicit.
35 UnveilMetadata(NonnullOwnPtr<KString>&& full_path, UnveilAccess permissions = None, bool explicitly_unveiled = false)
36 : full_path(move(full_path))
37 , permissions(permissions)
38 , explicitly_unveiled(explicitly_unveiled)
39 {
40 }
41
42 ErrorOr<UnveilMetadata> copy() const
43 {
44 return UnveilMetadata {
45 TRY(full_path->try_clone()),
46 permissions,
47 explicitly_unveiled,
48 };
49 }
50};
51
52struct UnveilNode final : public Trie<NonnullOwnPtr<KString>, UnveilMetadata, Traits<NonnullOwnPtr<KString>>, UnveilNode> {
53 using Trie<NonnullOwnPtr<KString>, UnveilMetadata, Traits<NonnullOwnPtr<KString>>, UnveilNode>::Trie;
54
55 bool was_explicitly_unveiled() const { return this->metadata_value().explicitly_unveiled; }
56 UnveilAccess permissions() const { return this->metadata_value().permissions; }
57 StringView path() const { return this->metadata_value().full_path->view(); }
58};
59
60}