mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-18 12:16:31 +00:00
@ -1020,6 +1020,21 @@ impl Syscall {
|
||||
return Self::do_dup2(oldfd, newfd, &mut fd_table_guard);
|
||||
}
|
||||
|
||||
pub fn dup3(oldfd: i32, newfd: i32, flags: u32) -> Result<usize, SystemError> {
|
||||
let flags = FileMode::from_bits_truncate(flags);
|
||||
if (flags.bits() & !FileMode::O_CLOEXEC.bits()) != 0 {
|
||||
return Err(SystemError::EINVAL);
|
||||
}
|
||||
|
||||
if oldfd == newfd {
|
||||
return Err(SystemError::EINVAL);
|
||||
}
|
||||
|
||||
let binding = ProcessManager::current_pcb().fd_table();
|
||||
let mut fd_table_guard = binding.write();
|
||||
return Self::do_dup3(oldfd, newfd, flags, &mut fd_table_guard);
|
||||
}
|
||||
|
||||
fn do_dup2(
|
||||
oldfd: i32,
|
||||
newfd: i32,
|
||||
|
@ -399,6 +399,13 @@ impl Syscall {
|
||||
Self::dup2(oldfd, newfd)
|
||||
}
|
||||
|
||||
SYS_DUP3 => {
|
||||
let oldfd: i32 = args[0] as c_int;
|
||||
let newfd: i32 = args[1] as c_int;
|
||||
let flags: u32 = args[2] as u32;
|
||||
Self::dup3(oldfd, newfd, flags)
|
||||
}
|
||||
|
||||
SYS_SOCKET => Self::socket(args[0], args[1], args[2]),
|
||||
SYS_SETSOCKOPT => {
|
||||
let optval = args[3] as *const u8;
|
||||
|
Reference in New Issue
Block a user