diff options
Diffstat (limited to 'kernel/src/filesystem/dentry.cpp')
| -rw-r--r-- | kernel/src/filesystem/dentry.cpp | 34 |
1 files changed, 25 insertions, 9 deletions
diff --git a/kernel/src/filesystem/dentry.cpp b/kernel/src/filesystem/dentry.cpp index 1cf8730..a3bd7f4 100644 --- a/kernel/src/filesystem/dentry.cpp +++ b/kernel/src/filesystem/dentry.cpp @@ -6,6 +6,7 @@ #include <kstd/memory> #include <kstd/string> +#include <kstd/vector> #include <algorithm> #include <cstdint> @@ -39,20 +40,35 @@ namespace kernel::filesystem return m_name.view(); } - // NOLINTNEXTLINE(misc-no-recursion) auto dentry::get_full_path() const -> kstd::string { - if (m_parent) + if (m_name == "/") { - auto parent_path = m_parent->get_full_path(); - if (parent_path != "/") - { - parent_path += '/'; - } - return parent_path + m_name.view(); + return "/"; } - return m_name.view(); + kstd::vector<std::string_view> components; + components.push_back(m_name.view()); + components.push_back("/"); + + auto parent = m_parent; + + while (parent && parent->m_name != "/") + { + components.push_back(parent->m_name.view()); + components.push_back("/"); + parent = parent->get_parent(); + } + + std::ranges::reverse(components); + + kstd::string full_path = ""; + for (auto const & view : components) + { + full_path += view; + } + + return full_path; } auto dentry::add_child(kstd::shared_ptr<dentry> const & child) -> void |
