From 51b9dcebbc89ccc6d1a59f63e7deaab5d16f7d36 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Fri, 10 Jul 2026 23:50:59 +0300 Subject: [PATCH] Kernel: Support FIONBIO ioctl --- kernel/include/kernel/OpenFileDescriptorSet.h | 1 + kernel/kernel/OpenFileDescriptorSet.cpp | 29 +++++++++++++++++++ kernel/kernel/Process.cpp | 3 +- 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/kernel/include/kernel/OpenFileDescriptorSet.h b/kernel/include/kernel/OpenFileDescriptorSet.h index 41c06041..56a56a79 100644 --- a/kernel/include/kernel/OpenFileDescriptorSet.h +++ b/kernel/include/kernel/OpenFileDescriptorSet.h @@ -34,6 +34,7 @@ namespace Kernel BAN::ErrorOr dup2(int, int); BAN::ErrorOr fcntl(int fd, int cmd, uintptr_t extra); + BAN::ErrorOr ioctl(int fd, unsigned long request, void* arg); BAN::ErrorOr seek(int fd, off_t offset, int whence); BAN::ErrorOr tell(int) const; diff --git a/kernel/kernel/OpenFileDescriptorSet.cpp b/kernel/kernel/OpenFileDescriptorSet.cpp index 78792bf8..602b61ca 100644 --- a/kernel/kernel/OpenFileDescriptorSet.cpp +++ b/kernel/kernel/OpenFileDescriptorSet.cpp @@ -354,6 +354,35 @@ namespace Kernel return BAN::Error::from_errno(ENOTSUP); } + BAN::ErrorOr OpenFileDescriptorSet::ioctl(int fd, unsigned long request, void* arg) + { + BAN::RefPtr inode; + + { + LockGuard _(m_mutex); + + TRY(validate_fd(fd)); + + switch (request) + { + case FIONBIO: + { + int enabled; + TRY(read_from_user(arg, &enabled, sizeof(int))); + if (enabled) + m_open_files[fd]->status_flags |= O_NONBLOCK; + else + m_open_files[fd]->status_flags &= ~O_NONBLOCK; + return 0; + } + } + + inode = m_open_files[fd]->file.inode; + } + + return inode->ioctl(request, arg); + } + BAN::ErrorOr OpenFileDescriptorSet::seek(int fd, off_t offset, int whence) { LockGuard _(m_mutex); diff --git a/kernel/kernel/Process.cpp b/kernel/kernel/Process.cpp index 647ddb63..941bd196 100644 --- a/kernel/kernel/Process.cpp +++ b/kernel/kernel/Process.cpp @@ -2049,8 +2049,7 @@ namespace Kernel BAN::ErrorOr Process::sys_ioctl(int fildes, unsigned long request, void* arg) { - auto inode = TRY(m_open_file_descriptors.inode_of(fildes)); - return TRY(inode->ioctl(request, arg)); + return m_open_file_descriptors.ioctl(fildes, request, arg); } BAN::ErrorOr Process::sys_pselect(sys_pselect_t* user_arguments)