aboutsummaryrefslogtreecommitdiff
path: root/kernel/kernel/vfs/driver_registry.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/kernel/vfs/driver_registry.hpp')
-rw-r--r--kernel/kernel/vfs/driver_registry.hpp73
1 files changed, 73 insertions, 0 deletions
diff --git a/kernel/kernel/vfs/driver_registry.hpp b/kernel/kernel/vfs/driver_registry.hpp
new file mode 100644
index 00000000..b463e086
--- /dev/null
+++ b/kernel/kernel/vfs/driver_registry.hpp
@@ -0,0 +1,73 @@
+#ifndef TEACHOS_KERNEL_VFS_DRIVER_REGISTRY_HPP
+#define TEACHOS_KERNEL_VFS_DRIVER_REGISTRY_HPP
+
+#include <kernel/vfs/filesystem.hpp>
+#include <kernel/vfs/inode.hpp>
+
+#include <kstd/flat_map.hpp>
+#include <kstd/memory.hpp>
+#include <kstd/result.hpp>
+#include <kstd/string.hpp>
+#include <kstd/vector.hpp>
+
+#include <concepts>
+#include <optional>
+#include <string_view>
+
+namespace kernel::vfs
+{
+
+ struct driver_descriptor
+ {
+ virtual ~driver_descriptor() = default;
+
+ //! Get the name of the driver.
+ [[nodiscard]] virtual auto name() const noexcept -> std::string_view = 0;
+
+ //! Create a new instance of the driver represented by this descriptor.
+ [[nodiscard]] virtual auto make_instance() const -> kstd::shared_ptr<filesystem> = 0;
+ };
+
+ template<std::derived_from<driver_descriptor> Type>
+ struct driver_module
+ {
+ constexpr auto static instance = Type{};
+ [[using gnu: section("filesystem_drivers"), used, visibility("hidden")]] constexpr auto static pointer{
+ kstd::make_observer<driver_descriptor const>(&instance),
+ };
+ };
+
+ struct driver_registry
+ {
+ constexpr driver_registry() noexcept = default;
+
+ auto static init() -> void;
+
+ auto static get() -> driver_registry &;
+
+ //! Register a new filesystem.
+ //!
+ //! @param name The name of the filesystem.
+ //! @param driver The filesystem driver to register.
+ //! @return @c true iff. the driver was successfully added, @c false if not.
+ auto add(std::string_view name, kstd::shared_ptr<filesystem> driver) -> bool;
+
+ //! Find a registered filesystem driver
+ //!
+ //! @param name The name of the filesystem
+ [[nodiscard]] auto find(std::string_view name) const -> std::optional<kstd::shared_ptr<filesystem>>;
+
+ //! Match all currently registered filesystem drivers against a given inode.
+ //!
+ //! @param inode The inode to match on, if any.
+ //! @return a match priority if th
+ [[nodiscard]] auto match(kstd::shared_ptr<inode> const & inode) const -> kstd::result<kstd::shared_ptr<filesystem>>;
+
+ private:
+ //! A map from filesystem names to filesystem drivers.
+ kstd::flat_map<std::string_view, kstd::shared_ptr<filesystem>> m_drivers{};
+ };
+
+} // namespace kernel::vfs
+
+#endif