Support the close-on-exec file descriptor flag

This commit is contained in:
LI Qing
2023-12-13 11:29:03 +08:00
committed by Tate, Hongliang Tian
parent a6bb7c7bf5
commit 3de5c42afd
11 changed files with 153 additions and 48 deletions

View File

@ -3,9 +3,9 @@
use super::{SyscallReturn, SYS_PIPE2};
use crate::{
fs::{
file_table::FileDescripter,
file_table::{FdFlags, FileDescripter},
pipe::{PipeReader, PipeWriter},
utils::{Channel, StatusFlags},
utils::{Channel, CreationFlags, StatusFlags},
},
log_syscall_entry,
prelude::*,
@ -27,11 +27,16 @@ pub fn sys_pipe2(fds: Vaddr, flags: u32) -> Result<SyscallReturn> {
};
let pipe_reader = Arc::new(reader);
let pipe_writer = Arc::new(writer);
let fd_flags = if CreationFlags::from_bits_truncate(flags).contains(CreationFlags::O_CLOEXEC) {
FdFlags::CLOEXEC
} else {
FdFlags::empty()
};
let current = current!();
let mut file_table = current.file_table().lock();
pipe_fds.reader_fd = file_table.insert(pipe_reader);
pipe_fds.writer_fd = file_table.insert(pipe_writer);
pipe_fds.reader_fd = file_table.insert(pipe_reader, fd_flags);
pipe_fds.writer_fd = file_table.insert(pipe_writer, fd_flags);
debug!("pipe_fds: {:?}", pipe_fds);
write_val_to_user(fds, &pipe_fds)?;