diff options
Diffstat (limited to 'Kernel/FileSystem/SysFSComponent.h')
-rw-r--r-- | Kernel/FileSystem/SysFSComponent.h | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/Kernel/FileSystem/SysFSComponent.h b/Kernel/FileSystem/SysFSComponent.h new file mode 100644 index 0000000000..7ed8d4d1bc --- /dev/null +++ b/Kernel/FileSystem/SysFSComponent.h @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2021, Liav A. <liavalb@hotmail.co.il> + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include <AK/Function.h> +#include <AK/RefCounted.h> +#include <AK/RefPtr.h> +#include <AK/StringView.h> +#include <AK/Types.h> +#include <Kernel/FileSystem/File.h> +#include <Kernel/FileSystem/FileSystem.h> +#include <Kernel/FileSystem/Forward.h> +#include <Kernel/KResult.h> + +namespace Kernel { + +class SysFSComponent : public RefCounted<SysFSComponent> { +public: + virtual KResultOr<size_t> entries_count() const { VERIFY_NOT_REACHED(); }; + virtual StringView name() const { return m_name->view(); } + virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer&, FileDescription*) const { VERIFY_NOT_REACHED(); } + virtual KResult traverse_as_directory(unsigned, Function<bool(FileSystem::DirectoryEntryView const&)>) const { VERIFY_NOT_REACHED(); } + virtual RefPtr<SysFSComponent> lookup(StringView) { VERIFY_NOT_REACHED(); }; + virtual KResultOr<size_t> write_bytes(off_t, size_t, UserOrKernelBuffer const&, FileDescription*) { return -EROFS; } + virtual size_t size() const { return 0; } + + virtual NonnullRefPtr<Inode> to_inode(SysFS const&) const; + + InodeIndex component_index() const { return m_component_index; }; + + virtual ~SysFSComponent() = default; + +protected: + explicit SysFSComponent(StringView name); + +private: + NonnullOwnPtr<KString> m_name; + InodeIndex m_component_index {}; +}; + +class SysFSDirectory : public SysFSComponent { +public: + virtual KResultOr<size_t> entries_count() const override { return m_components.size(); }; + virtual KResult traverse_as_directory(unsigned, Function<bool(FileSystem::DirectoryEntryView const&)>) const override; + virtual RefPtr<SysFSComponent> lookup(StringView name) override; + + virtual NonnullRefPtr<Inode> to_inode(SysFS const& sysfs_instance) const override final; + +protected: + explicit SysFSDirectory(StringView name); + SysFSDirectory(StringView name, SysFSDirectory const& parent_folder); + NonnullRefPtrVector<SysFSComponent> m_components; + RefPtr<SysFSDirectory> m_parent_folder; +}; + +} |