mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-04-26 06:18:59 +00:00
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:
parent
e0013a6b4c
commit
ae64fd1b27
Notes:
sideshowbarker
2024-07-19 10:01:19 +09:00
Author: https://github.com/bugaevc
Commit: ae64fd1b27
Pull-request: https://github.com/SerenityOS/serenity/pull/1079
Reviewed-by: https://github.com/awesomekling
3 changed files with 22 additions and 10 deletions
|
@ -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();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue