/* * Copyright (c) 2018-2020, Andreas Kling * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include namespace Kernel { class ProcFSExposedDirectory; class ProcFSExposedLink; class ProcFSInode final : public Inode { friend class ProcFS; public: enum class Type { GlobalLink, GlobalDirectory, FileDescriptionLink, ThreadStack, ProcessProperty, ChildProcessLink, ProcessDirectory, ProcessSubdirectory, }; static ErrorOr> try_create_as_file_description_link_inode(ProcFS const&, unsigned, ProcessID); static ErrorOr> try_create_as_thread_stack_inode(ProcFS const&, ThreadID, ProcessID); static ErrorOr> try_create_as_pid_property_inode(ProcFS const&, SegmentedProcFSIndex::MainProcessProperty, ProcessID); static ErrorOr> try_create_as_child_process_link_inode(ProcFS const&, ProcessID, ProcessID); static ErrorOr> try_create_as_process_directory_inode(ProcFS const&, ProcessID); static ErrorOr> try_create_as_process_subdirectory_inode(ProcFS const&, SegmentedProcFSIndex::ProcessSubDirectory, ProcessID); static ErrorOr> try_create_as_directory_inode(ProcFS const&, ProcFSExposedDirectory const&); static ErrorOr> try_create_as_global_link_inode(ProcFS const&, ProcFSExposedLink const&); virtual ~ProcFSInode() override; private: // ProcFS PID property inode (/proc/PID/PROPERTY) ProcFSInode(ProcFS const&, SegmentedProcFSIndex::MainProcessProperty, ProcessID); // ProcFS Thread stack inode (/proc/PID/stacks/TID) ProcFSInode(ProcFS const&, ThreadID, ProcessID); // ProcFS File description link inode (/proc/PID/fd/FD) ProcFSInode(ProcFS const&, unsigned, ProcessID); // ProcFS Child process link inode (/proc/PID/children/CHILD_PID) ProcFSInode(ProcFS const&, ProcessID, ProcessID); // ProcFS Process directory inode (/proc/PID/) ProcFSInode(ProcFS const&, ProcessID); // ProcFS Process sub directory inode (/proc/PID/SUBDIRECTORY) ProcFSInode(ProcFS const&, SegmentedProcFSIndex::ProcessSubDirectory, ProcessID); ProcFSInode(ProcFS const&, ProcFSExposedLink const&); ProcFSInode(ProcFS const&, ProcFSExposedDirectory const&); ProcFS& procfs() { return static_cast(Inode::fs()); } ProcFS const& procfs() const { return static_cast(Inode::fs()); } // ^Inode virtual ErrorOr attach(OpenFileDescription& description) override; virtual void did_seek(OpenFileDescription&, off_t) override; virtual ErrorOr flush_metadata() override final; virtual ErrorOr> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override; virtual ErrorOr add_child(Inode&, StringView name, mode_t) override final; virtual ErrorOr remove_child(StringView name) override final; virtual ErrorOr replace_child(StringView name, Inode& child) override final; virtual ErrorOr chmod(mode_t) override final; virtual ErrorOr chown(UserID, GroupID) override final; virtual InodeMetadata metadata() const override; virtual ErrorOr traverse_as_directory(Function(FileSystem::DirectoryEntryView const&)>) const override; virtual ErrorOr read_bytes_locked(off_t, size_t, UserOrKernelBuffer& buffer, OpenFileDescription*) const override; virtual ErrorOr write_bytes_locked(off_t, size_t, UserOrKernelBuffer const& buffer, OpenFileDescription*) override; virtual ErrorOr> lookup(StringView name) override final; virtual ErrorOr truncate(u64) override final; virtual ErrorOr update_timestamps(Optional