aboutsummaryrefslogtreecommitdiff
path: root/kernel/src
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/src')
-rw-r--r--kernel/src/filesystem/dentry.cpp34
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