Ver Fonte

feat(syscall): add sys_pipe2

greatbridf há 3 meses atrás
pai
commit
555b383d90
2 ficheiros alterados com 13 adições e 5 exclusões
  1. 8 2
      src/kernel/syscall/file_rw.rs
  2. 5 3
      src/kernel/vfs/filearray.rs

+ 8 - 2
src/kernel/syscall/file_rw.rs

@@ -66,14 +66,18 @@ fn do_dup2(old_fd: u32, new_fd: u32) -> KResult<u32> {
     files.dup_to(old_fd, new_fd, 0)
 }
 
-fn do_pipe(pipe_fd: *mut [u32; 2]) -> KResult<()> {
+fn do_pipe2(pipe_fd: *mut [u32; 2], flags: u32) -> KResult<()> {
     let mut buffer = UserBuffer::new(pipe_fd as *mut u8, core::mem::size_of::<[u32; 2]>())?;
     let files = FileArray::get_current();
-    let (read_fd, write_fd) = files.pipe()?;
+    let (read_fd, write_fd) = files.pipe(flags)?;
 
     buffer.copy(&[read_fd, write_fd])?.ok_or(EFAULT)
 }
 
+fn do_pipe(pipe_fd: *mut [u32; 2]) -> KResult<()> {
+    do_pipe2(pipe_fd, 0)
+}
+
 fn do_getdents(fd: u32, buffer: *mut u8, bufsize: usize) -> KResult<usize> {
     let mut buffer = UserBuffer::new(buffer, bufsize)?;
     let files = FileArray::get_current();
@@ -356,6 +360,7 @@ define_syscall32!(sys_close, do_close, fd: u32);
 define_syscall32!(sys_dup, do_dup, fd: u32);
 define_syscall32!(sys_dup2, do_dup2, old_fd: u32, new_fd: u32);
 define_syscall32!(sys_pipe, do_pipe, pipe_fd: *mut [u32; 2]);
+define_syscall32!(sys_pipe2, do_pipe2, pipe_fd: *mut [u32; 2], flags: u32);
 define_syscall32!(sys_getdents, do_getdents, fd: u32, buffer: *mut u8, bufsize: usize);
 define_syscall32!(sys_getdents64, do_getdents64, fd: u32, buffer: *mut u8, bufsize: usize);
 define_syscall32!(sys_statx, do_statx, fd: u32, path: *const u8, flags: u32, mask: u32, buffer: *mut u8);
@@ -398,5 +403,6 @@ pub(super) fn register() {
     register_syscall!(0xdc, getdents64);
     register_syscall!(0xdd, fcntl64);
     register_syscall!(0xef, sendfile64);
+    register_syscall!(0x14b, pipe2);
     register_syscall!(0x17f, statx);
 }

+ 5 - 3
src/kernel/vfs/filearray.rs

@@ -154,16 +154,18 @@ impl FileArray {
 
     /// # Return
     /// `(read_fd, write_fd)`
-    pub fn pipe(&self) -> KResult<(FD, FD)> {
+    pub fn pipe(&self, flags: u32) -> KResult<(FD, FD)> {
         let mut inner = self.inner.lock();
 
         let read_fd = inner.next_fd();
         let write_fd = inner.next_fd();
 
+        let fdflag = if flags & O_CLOEXEC != 0 { FD_CLOEXEC } else { 0 };
+
         let pipe = Pipe::new();
         let (read_end, write_end) = pipe.split();
-        inner.do_insert(read_fd, 0, read_end);
-        inner.do_insert(write_fd, 0, write_end);
+        inner.do_insert(read_fd, fdflag as u64, read_end);
+        inner.do_insert(write_fd, fdflag as u64, write_end);
 
         Ok((read_fd, write_fd))
     }