From 89d04ecf7de4baddda8244db26c365678381ae26 Mon Sep 17 00:00:00 2001 From: Wang Taojie <12210519@mail.sustech.edu.cn> Date: Thu, 10 Oct 2024 23:24:52 +0800 Subject: [PATCH] Implement ioctl() FIOCLEX command --- kernel/src/fs/file_table.rs | 4 ++++ kernel/src/fs/utils/ioctl.rs | 4 ++++ kernel/src/syscall/ioctl.rs | 19 ++++++++++++++++++- 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/kernel/src/fs/file_table.rs b/kernel/src/fs/file_table.rs index 45f316673..dbdda393c 100644 --- a/kernel/src/fs/file_table.rs +++ b/kernel/src/fs/file_table.rs @@ -311,6 +311,10 @@ impl FileTableEntry { self.flags.store(flags.bits(), Ordering::Relaxed); } + pub fn clear_flags(&self) { + self.flags.store(0, Ordering::Relaxed); + } + pub fn register_observer(&self, epoll: Weak>) { self.subject.register_observer(epoll, ()); } diff --git a/kernel/src/fs/utils/ioctl.rs b/kernel/src/fs/utils/ioctl.rs index d0dc222b8..7e82fb02e 100644 --- a/kernel/src/fs/utils/ioctl.rs +++ b/kernel/src/fs/utils/ioctl.rs @@ -27,6 +27,10 @@ pub enum IoctlCmd { FIONBIO = 0x5421, /// the calling process gives up this controlling terminal TIOCNOTTY = 0x5422, + /// Clear the close on exec flag on a file descriptor + FIONCLEX = 0x5450, + /// Set the close on exec flag on a file descriptor + FIOCLEX = 0x5451, /// Enable or disable asynchronous I/O mode. FIOASYNC = 0x5452, /// Get Pty Number diff --git a/kernel/src/syscall/ioctl.rs b/kernel/src/syscall/ioctl.rs index 50a0139b5..26b69b9bb 100644 --- a/kernel/src/syscall/ioctl.rs +++ b/kernel/src/syscall/ioctl.rs @@ -3,7 +3,7 @@ use super::SyscallReturn; use crate::{ fs::{ - file_table::FileDesc, + file_table::{FdFlags, FileDesc}, utils::{IoctlCmd, StatusFlags}, }, prelude::*, @@ -39,6 +39,23 @@ pub fn sys_ioctl(fd: FileDesc, cmd: u32, arg: Vaddr, ctx: &Context) -> Result { + // Sets the close-on-exec flag of the file. + // Follow the implementation of fcntl() + + let flags = FdFlags::CLOEXEC; + let file_table = ctx.process.file_table().lock(); + let entry = file_table.get_entry(fd)?; + entry.set_flags(flags); + 0 + } + IoctlCmd::FIONCLEX => { + // Clears the close-on-exec flag of the file. + let file_table = ctx.process.file_table().lock(); + let entry = file_table.get_entry(fd)?; + entry.clear_flags(); + 0 + } _ => file.ioctl(ioctl_cmd, arg)?, }; Ok(SyscallReturn::Return(res as _))