#include "kernel/filesystem/mount_table.hpp" #include "kernel/filesystem/mount.hpp" #include #include #include namespace kernel::filesystem { void mount_table::add_mount(kstd::shared_ptr mount) { m_mounts.push_back(mount); } auto mount_table::find_longest_prefix_mount(std::string_view path) const -> kstd::shared_ptr { kstd::shared_ptr mount_with_longest_prefix = nullptr; std::size_t best_len = 0; for (auto const & mount : m_mounts) { auto mp = mount->get_mount_path(); // /a/b/c should match /a/b but not /a/bb or /a/b/c/d, / should match everything bool is_prefix = path.starts_with(mp) && (mp == "/" || path.size() == mp.size() || path[mp.size()] == '/'); if (is_prefix && mp.size() >= best_len) { mount_with_longest_prefix = mount; best_len = mp.size(); } } return mount_with_longest_prefix; } } // namespace kernel::filesystem