Kernel: Let symlinks resolve themselves

Symlink resolution is now a virtual method on an inode,
Inode::resolve_as_symlink(). The default implementation just reads the stored
inode contents, treats them as a path and calls through to VFS::resolve_path().

This will let us support other, magical files that appear to be plain old
symlinks but resolve to something else. This is particularly useful for ProcFS.
This commit is contained in:
Sergey Bugaev 2020-01-15 13:59:50 +03:00 committed by Andreas Kling
parent e0013a6b4c
commit ae64fd1b27
Notes: sideshowbarker 2024-07-19 10:01:19 +09:00
3 changed files with 22 additions and 10 deletions

View file

@ -4,6 +4,8 @@
#include <Kernel/FileSystem/InodeWatcher.h>
#include <Kernel/Net/LocalSocket.h>
#include <Kernel/VM/InodeVMObject.h>
#include <Kernel/FileSystem/VirtualFileSystem.h>
#include <Kernel/FileSystem/Custody.h>
InlineLinkedList<Inode>& all_inodes()
{
@ -56,6 +58,23 @@ ByteBuffer Inode::read_entire(FileDescription* descriptor) const
return builder.to_byte_buffer();
}
KResultOr<NonnullRefPtr<Custody>> Inode::resolve_as_link(Custody& base, RefPtr<Custody>* out_parent, int options, int symlink_recursion_level) const
{
// The default implementation simply treats the stored
// contents as a path and resolves that. That is, it
// behaves exactly how you would expect a symlink to work.
auto contents = read_entire();
if (!contents) {
if (out_parent)
*out_parent = nullptr;
return KResult(-ENOENT);
}
auto path = StringView(contents.data(), contents.size());
return VFS::the().resolve_path(path, base, out_parent, options, symlink_recursion_level);
}
unsigned Inode::fsid() const
{
return m_fs.fsid();