feat(kernel): implement handling symbolic links in paths

Signed-off-by: EnderIce2 <enderice2@protonmail.com>
This commit is contained in:
2025-03-27 14:33:29 +00:00
parent 13d52897b8
commit 7491f19f9a
6 changed files with 58 additions and 3 deletions

View File

@ -161,6 +161,7 @@ namespace vfs
}
Inode *Node = NULL;
bool readSymlinks = true; /* FIXME: implement */
do
{
auto it = DeviceMap.find(__Parent->Node->Device);
@ -170,6 +171,22 @@ namespace vfs
if (it->second.fsi->Ops.Lookup == NULL)
ReturnLogError(nullptr, "Lookup not supported for %d", it->first);
if (readSymlinks && __Parent->IsSymbolicLink())
{
if (it->second.fsi->Ops.ReadLink == NULL)
ReturnLogError(nullptr, "Readlink not supported for %d", it->first);
char buffer[256];
int ret = it->second.fsi->Ops.ReadLink(__Parent->Node, buffer, sizeof(buffer));
if (ret < 0)
ReturnLogError(nullptr, "Readlink for \"%s\"(%d) failed with %d", __Parent->Path.c_str(), it->first, ret);
FileNode *target = this->GetByPath(buffer, __Parent->Parent ? __Parent->Parent : __Parent);
if (target == nullptr)
ReturnLogError(nullptr, "Failed to find target for \"%s\"", __Parent->Path.c_str());
__Parent = target;
}
std::string segmentName(segment.begin, segment.size);
int ret = it->second.fsi->Ops.Lookup(__Parent->Node, segmentName.c_str(), &Node);
if (ret < 0)

View File

@ -389,7 +389,7 @@ namespace vfs
Size = strlen(node->Header->link);
strncpy(Buffer, node->Header->link, Size);
debug("Read %d bytes from %d", Size, Node->Index);
debug("Read %d bytes from %d: \"%s\"", Size, Node->Index, Buffer);
return Size;
}