Serenity Operating System
at master 90 lines 2.7 kB view raw
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}