aboutsummaryrefslogtreecommitdiff
path: root/kernel/src
diff options
context:
space:
mode:
authorMarcel Braun <marcel.braun@ost.ch>2026-05-11 14:48:46 +0200
committerMarcel Braun <marcel.braun@ost.ch>2026-05-11 14:48:46 +0200
commit8a11512eb8030de09ed806d8b40b7f54c2f204ab (patch)
tree1ee4aa34bb72ac9d2269dec1d1ff6cf656aee950 /kernel/src
parent0ffee4e5dbc20dd7f1f7991d1f8dab698fc9b7a0 (diff)
downloadkernel-8a11512eb8030de09ed806d8b40b7f54c2f204ab.tar.xz
kernel-8a11512eb8030de09ed806d8b40b7f54c2f204ab.zip
Refactor get_full_path remove recursion
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