diff options
Diffstat (limited to 'kernel/kernel/vfs/driver_registry.hpp')
| -rw-r--r-- | kernel/kernel/vfs/driver_registry.hpp | 73 |
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 |
