1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 08:08:12 +00:00

Kernel: Let inodes provide pre-open file descriptions

Some magical inodes, such as /proc/pid/fd/fileno, are going to want to open() to
a custom FileDescription, so add a hook for that.
This commit is contained in:
Sergey Bugaev 2020-01-15 14:03:14 +03:00 committed by Andreas Kling
parent ae64fd1b27
commit 8642a7046c
3 changed files with 13 additions and 2 deletions

View file

@ -61,6 +61,8 @@ public:
bool bind_socket(LocalSocket&); bool bind_socket(LocalSocket&);
bool unbind_socket(); bool unbind_socket();
virtual FileDescription* preopen_fd() { return nullptr; };
bool is_metadata_dirty() const { return m_metadata_dirty; } bool is_metadata_dirty() const { return m_metadata_dirty; }
virtual int set_atime(time_t); virtual int set_atime(time_t);

View file

@ -230,6 +230,9 @@ KResultOr<NonnullRefPtr<FileDescription>> VFS::open(StringView path, int options
return KResult(-EACCES); return KResult(-EACCES);
} }
if (auto preopen_fd = inode.preopen_fd())
return *preopen_fd;
if (metadata.is_device()) { if (metadata.is_device()) {
if (custody.mount_flags() & MS_NODEV) if (custody.mount_flags() & MS_NODEV)
return KResult(-EACCES); return KResult(-EACCES);

View file

@ -1908,8 +1908,14 @@ int Process::sys$open(const Syscall::SC_open_params* user_params)
if (result.is_error()) if (result.is_error())
return result.error(); return result.error();
auto description = result.value(); auto description = result.value();
description->set_rw_mode(options); if (description->file_flags()) {
description->set_file_flags(options); // We already have file flags set on this description, so
// it must be a preopen description (probably, /proc/pid/fd).
// So don't reset its flags and r/w mode.
} else {
description->set_rw_mode(options);
description->set_file_flags(options);
}
u32 fd_flags = (options & O_CLOEXEC) ? FD_CLOEXEC : 0; u32 fd_flags = (options & O_CLOEXEC) ? FD_CLOEXEC : 0;
m_fds[fd].set(move(description), fd_flags); m_fds[fd].set(move(description), fd_flags);
return fd; return fd;