/* * Copyright (c) 2018-2020, Andreas Kling * Copyright (c) 2022-2023, Liav A. * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include namespace Kernel { struct ProcFSInodeData : public OpenFileDescriptionData { OwnPtr buffer; }; class ProcFSInode final : public Inode { friend class ProcFS; public: enum class Type { RootDirectory, SelfProcessLink, ProcessProperty, ProcessDirectory, ProcessSubdirectory, }; static InodeIndex create_index_from_global_directory_entry(segmented_global_inode_index entry); static InodeIndex create_index_from_process_directory_entry(ProcessID pid, segmented_process_directory_entry entry); virtual ~ProcFSInode() override; private: ProcFSInode(ProcFS const&, InodeIndex); ProcFS& procfs() { return static_cast(Inode::fs()); } ProcFS const& procfs() const { return static_cast(Inode::fs()); } // ^Inode (EROFS handling) virtual ErrorOr> create_child(StringView, mode_t, dev_t, UserID, GroupID) override { return EROFS; } virtual ErrorOr add_child(Inode&, StringView, mode_t) override { return EROFS; } virtual ErrorOr remove_child(StringView) override { return EROFS; } virtual ErrorOr replace_child(StringView, Inode&) override { return EROFS; } virtual ErrorOr chmod(mode_t) override { return EROFS; } virtual ErrorOr chown(UserID, GroupID) override { return EROFS; } virtual ErrorOr write_bytes_locked(off_t, size_t, UserOrKernelBuffer const&, OpenFileDescription*) override { return EROFS; } virtual ErrorOr truncate_locked(u64) override { return EROFS; } // ^Inode (Silent ignore handling) virtual ErrorOr flush_metadata() override { return {}; } virtual ErrorOr update_timestamps(Optional, Optional, Optional) override { return {}; } // ^Inode virtual ErrorOr attach(OpenFileDescription& description) override; virtual void did_seek(OpenFileDescription&, off_t) override; ErrorOr traverse_as_root_directory(Function(FileSystem::DirectoryEntryView const&)>) const; virtual ErrorOr traverse_as_directory(Function(FileSystem::DirectoryEntryView const&)>) const override; virtual InodeMetadata metadata() const override; virtual ErrorOr read_bytes_locked(off_t, size_t, UserOrKernelBuffer& buffer, OpenFileDescription*) const override; ErrorOr> lookup_as_root_directory(StringView name); virtual ErrorOr> lookup(StringView name) override final; ErrorOr refresh_process_property_data(OpenFileDescription& description); ErrorOr try_fetch_process_property_data(NonnullRefPtr, KBufferBuilder& builder) const; Type m_type; Optional const m_associated_pid {}; u16 const m_subdirectory { 0 }; u32 const m_property { 0 }; mutable Mutex m_refresh_lock; }; }