Implement ioctl() FIOCLEX command

This commit is contained in:
Wang Taojie
2024-10-10 23:24:52 +08:00
committed by Tate, Hongliang Tian
parent 4823b82e41
commit 89d04ecf7d
3 changed files with 26 additions and 1 deletions

View File

@ -311,6 +311,10 @@ impl FileTableEntry {
self.flags.store(flags.bits(), Ordering::Relaxed); 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<dyn Observer<FdEvents>>) { pub fn register_observer(&self, epoll: Weak<dyn Observer<FdEvents>>) {
self.subject.register_observer(epoll, ()); self.subject.register_observer(epoll, ());
} }

View File

@ -27,6 +27,10 @@ pub enum IoctlCmd {
FIONBIO = 0x5421, FIONBIO = 0x5421,
/// the calling process gives up this controlling terminal /// the calling process gives up this controlling terminal
TIOCNOTTY = 0x5422, 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. /// Enable or disable asynchronous I/O mode.
FIOASYNC = 0x5452, FIOASYNC = 0x5452,
/// Get Pty Number /// Get Pty Number

View File

@ -3,7 +3,7 @@
use super::SyscallReturn; use super::SyscallReturn;
use crate::{ use crate::{
fs::{ fs::{
file_table::FileDesc, file_table::{FdFlags, FileDesc},
utils::{IoctlCmd, StatusFlags}, utils::{IoctlCmd, StatusFlags},
}, },
prelude::*, prelude::*,
@ -39,6 +39,23 @@ pub fn sys_ioctl(fd: FileDesc, cmd: u32, arg: Vaddr, ctx: &Context) -> Result<Sy
file.set_status_flags(flags)?; file.set_status_flags(flags)?;
0 0
} }
IoctlCmd::FIOCLEX => {
// 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)?, _ => file.ioctl(ioctl_cmd, arg)?,
}; };
Ok(SyscallReturn::Return(res as _)) Ok(SyscallReturn::Return(res as _))