Kernel: Add /proc/self
This commit is contained in:
parent
b904503691
commit
e4abe75043
|
@ -82,4 +82,30 @@ namespace Kernel
|
|||
size_t (*m_callback)(off_t, BAN::ByteSpan);
|
||||
};
|
||||
|
||||
class ProcSymlinkInode final : public TmpInode
|
||||
{
|
||||
public:
|
||||
static BAN::ErrorOr<BAN::RefPtr<ProcSymlinkInode>> create_new(BAN::ErrorOr<BAN::String> (*)(void*), void* data, TmpFileSystem&, mode_t, uid_t, gid_t);
|
||||
~ProcSymlinkInode() = default;
|
||||
|
||||
protected:
|
||||
virtual BAN::ErrorOr<BAN::String> link_target_impl() override;
|
||||
|
||||
// You may not write here and this is always non blocking
|
||||
virtual BAN::ErrorOr<size_t> write_impl(off_t, BAN::ConstByteSpan) override { return BAN::Error::from_errno(EINVAL); }
|
||||
virtual BAN::ErrorOr<void> truncate_impl(size_t) override { return BAN::Error::from_errno(EINVAL); }
|
||||
|
||||
virtual bool can_read_impl() const override { return false; }
|
||||
virtual bool can_write_impl() const override { return false; }
|
||||
virtual bool has_error_impl() const override { return false; }
|
||||
virtual bool has_hungup_impl() const override { return false; }
|
||||
|
||||
private:
|
||||
ProcSymlinkInode(BAN::ErrorOr<BAN::String> (*callback)(void*), void* data, TmpFileSystem&, const TmpInodeInfo&);
|
||||
|
||||
private:
|
||||
BAN::ErrorOr<BAN::String> (*m_callback)(void*);
|
||||
void* m_data;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -38,6 +38,14 @@ namespace Kernel
|
|||
auto cmdline_inode = MUST(TmpFileInode::create_new(*s_instance, 0444, 0, 0));
|
||||
MUST(cmdline_inode->write(0, { reinterpret_cast<const uint8_t*>(g_boot_info.command_line.data()), g_boot_info.command_line.size() }));
|
||||
MUST(static_cast<TmpDirectoryInode*>(s_instance->root_inode().ptr())->link_inode(*cmdline_inode, "cmdline"_sv));
|
||||
|
||||
auto self_inode = MUST(ProcSymlinkInode::create_new(
|
||||
[](void*) -> BAN::ErrorOr<BAN::String> {
|
||||
return BAN::String::formatted("{}", Process::current().pid());
|
||||
},
|
||||
nullptr, *s_instance, 0444, 0, 0)
|
||||
);
|
||||
MUST(static_cast<TmpDirectoryInode*>(s_instance->root_inode().ptr())->link_inode(*self_inode, "self"_sv));
|
||||
}
|
||||
|
||||
ProcFileSystem& ProcFileSystem::get()
|
||||
|
|
|
@ -83,4 +83,27 @@ namespace Kernel
|
|||
return m_callback(offset, buffer);
|
||||
}
|
||||
|
||||
BAN::ErrorOr<BAN::RefPtr<ProcSymlinkInode>> ProcSymlinkInode::create_new(BAN::ErrorOr<BAN::String> (*callback)(void*), void* data, TmpFileSystem& fs, mode_t mode, uid_t uid, gid_t gid)
|
||||
{
|
||||
auto inode_info = create_inode_info(Mode::IFLNK | mode, uid, gid);
|
||||
|
||||
auto* inode_ptr = new ProcSymlinkInode(callback, data, fs, inode_info);
|
||||
if (inode_ptr == nullptr)
|
||||
return BAN::Error::from_errno(ENOMEM);
|
||||
return BAN::RefPtr<ProcSymlinkInode>::adopt(inode_ptr);
|
||||
}
|
||||
|
||||
ProcSymlinkInode::ProcSymlinkInode(BAN::ErrorOr<BAN::String> (*callback)(void*), void* data, TmpFileSystem& fs, const TmpInodeInfo& inode_info)
|
||||
: TmpInode(fs, MUST(fs.allocate_inode(inode_info)), inode_info)
|
||||
, m_callback(callback)
|
||||
, m_data(data)
|
||||
{
|
||||
m_inode_info.mode |= Inode::Mode::IFLNK;
|
||||
}
|
||||
|
||||
BAN::ErrorOr<BAN::String> ProcSymlinkInode::link_target_impl()
|
||||
{
|
||||
return m_callback(m_data);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue