Serenity Operating System
1/*
2 * Copyright (c) 2020, Sergey Bugaev <bugaevc@serenityos.org>
3 *
4 * SPDX-License-Identifier: BSD-2-Clause
5 */
6
7#pragma once
8
9#include <AK/Atomic.h>
10#include <Kernel/FileSystem/Inode.h>
11#include <Kernel/FileSystem/Plan9FS/FileSystem.h>
12#include <Kernel/FileSystem/Plan9FS/Message.h>
13#include <Kernel/KBufferBuilder.h>
14
15namespace Kernel {
16
17class Plan9FSInode final : public Inode {
18 friend class Plan9FS;
19
20public:
21 virtual ~Plan9FSInode() override;
22
23 u32 fid() const { return index().value(); }
24
25 // ^Inode
26 virtual InodeMetadata metadata() const override;
27 virtual ErrorOr<void> flush_metadata() override;
28 virtual ErrorOr<void> traverse_as_directory(Function<ErrorOr<void>(FileSystem::DirectoryEntryView const&)>) const override;
29 virtual ErrorOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
30 virtual ErrorOr<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override;
31 virtual ErrorOr<void> add_child(Inode&, StringView name, mode_t) override;
32 virtual ErrorOr<void> remove_child(StringView name) override;
33 virtual ErrorOr<void> replace_child(StringView name, Inode& child) override;
34 virtual ErrorOr<void> chmod(mode_t) override;
35 virtual ErrorOr<void> chown(UserID, GroupID) override;
36 virtual ErrorOr<void> truncate(u64) override;
37
38private:
39 // ^Inode
40 virtual ErrorOr<size_t> read_bytes_locked(off_t, size_t, UserOrKernelBuffer& buffer, OpenFileDescription*) const override;
41 virtual ErrorOr<size_t> write_bytes_locked(off_t, size_t, UserOrKernelBuffer const& data, OpenFileDescription*) override;
42
43 Plan9FSInode(Plan9FS&, u32 fid);
44 static ErrorOr<NonnullRefPtr<Plan9FSInode>> try_create(Plan9FS&, u32 fid);
45
46 enum class GetAttrMask : u64 {
47 Mode = 0x1,
48 NLink = 0x2,
49 UID = 0x4,
50 GID = 0x8,
51 RDev = 0x10,
52 ATime = 0x20,
53 MTime = 0x40,
54 CTime = 0x80,
55 Ino = 0x100,
56 Size = 0x200,
57 Blocks = 0x400,
58
59 BTime = 0x800,
60 Gen = 0x1000,
61 DataVersion = 0x2000,
62
63 Basic = 0x7ff,
64 All = 0x3fff
65 };
66
67 enum class SetAttrMask : u64 {
68 Mode = 0x1,
69 UID = 0x2,
70 GID = 0x4,
71 Size = 0x8,
72 ATime = 0x10,
73 MTime = 0x20,
74 CTime = 0x40,
75 ATimeSet = 0x80,
76 MTimeSet = 0x100
77 };
78
79 // Mode in which the file is already open, using SerenityOS constants.
80 int m_open_mode { 0 };
81 ErrorOr<void> ensure_open_for_mode(int mode);
82
83 Plan9FS& fs() { return reinterpret_cast<Plan9FS&>(Inode::fs()); }
84 Plan9FS& fs() const
85 {
86 return const_cast<Plan9FS&>(reinterpret_cast<Plan9FS const&>(Inode::fs()));
87 }
88};
89
90}