aboutsummaryrefslogtreecommitdiff
path: root/kernel/src/filesystem/vfs.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/src/filesystem/vfs.cpp')
-rw-r--r--kernel/src/filesystem/vfs.cpp40
1 files changed, 37 insertions, 3 deletions
diff --git a/kernel/src/filesystem/vfs.cpp b/kernel/src/filesystem/vfs.cpp
index a3da258..ba4f404 100644
--- a/kernel/src/filesystem/vfs.cpp
+++ b/kernel/src/filesystem/vfs.cpp
@@ -94,7 +94,7 @@ namespace kernel::filesystem
{
return operation_result::invalid_path;
}
-
+ // TODO BA-FS26 check if target is directory?
if (auto mount_point_dentry = resolve_path(target))
{
if (auto source_dentry = resolve_path(source))
@@ -162,9 +162,9 @@ namespace kernel::filesystem
auto path_parts =
std::views::split(remaining, '/') | std::views::filter([](auto const & part) { return !part.empty(); });
- for (auto const & part : path_parts)
+ for (auto it = path_parts.begin(); it != path_parts.end(); ++it)
{
- std::string_view part_view{part};
+ std::string_view part_view{*it};
if (part_view == ".")
{
@@ -205,7 +205,9 @@ namespace kernel::filesystem
auto current_fs = current_mount->get_filesystem();
auto found_inode = current_fs->lookup(current_dentry->get_inode(), part_view);
if (!found_inode)
+ {
return nullptr;
+ }
next_dentry = kstd::make_shared<dentry>(current_dentry, found_inode, part_view);
current_dentry->add_child(next_dentry);
@@ -222,6 +224,38 @@ namespace kernel::filesystem
next_dentry = current_mount->root_dentry();
}
+ if (next_dentry->get_inode()->is_symbolic_link())
+ {
+ // TODO BA-FS26 this for loop is ugly --> fix
+ kstd::string symlink_path = "halo";
+ if (symlink_path.size() > 0 && symlink_path.front() == '/')
+ {
+ for (auto it2 = std::next(it); it2 != path_parts.end(); ++it2)
+ {
+ symlink_path += "/";
+ symlink_path.append(std::string_view{*it2});
+ }
+ return resolve_path(symlink_path.view());
+ }
+ else
+ {
+ kstd::string combined;
+ for (auto it3 = path_parts.begin(); it3 != it; ++it3)
+ {
+ combined += "/";
+ combined.append(std::string_view{*it3});
+ }
+ combined += "/";
+ combined += symlink_path;
+ for (auto it4 = std::next(it); it4 != path_parts.end(); ++it4)
+ {
+ combined += "/";
+ combined.append(std::string_view{*it4});
+ }
+ return resolve_path(combined.view());
+ }
+ }
+
current_dentry = next_dentry;
}