diff --git a/Cargo.toml b/Cargo.toml index 50252757a03327f9aa202c946705a2475dd2a79d..982fb40c3107660cab96274783a9f85307468fa0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,7 +2,7 @@ name = "relibc" version = "0.2.5" authors = ["Jeremy Soller <jackpot51@gmail.com>"] -edition = "2018" +edition = "2021" [lib] name = "relibc" diff --git a/src/platform/redox/extra.rs b/src/platform/redox/extra.rs index 9ed051cfeb603b71b7e4943e993fad3b97a72fff..476cb297f1230d984c0c6421ffa82dd0e48e74a5 100644 --- a/src/platform/redox/extra.rs +++ b/src/platform/redox/extra.rs @@ -2,6 +2,8 @@ use core::{ptr, slice}; use crate::platform::{sys::e, types::*}; +use syscall::{error::*, F_SETFD, F_SETFL}; + #[no_mangle] pub unsafe extern "C" fn redox_fpath(fd: c_int, buf: *mut c_void, count: size_t) -> ssize_t { e(syscall::fpath( @@ -48,4 +50,24 @@ pub unsafe extern "C" fn redox_physunmap(virtual_address: *mut c_void) -> c_int e(syscall::physunmap(virtual_address as usize)) as c_int } +pub fn pipe2(fds: &mut [c_int], flags: usize) -> syscall::error::Result<()> { + let fds = + <&mut [c_int; 2]>::try_from(fds).expect("expected Pal pipe2 to have validated pipe2 array"); + + let mut read_fd = FdGuard::new(syscall::open("pipe:", flags)?); + let mut write_fd = FdGuard::new(syscall::dup(*read_fd, b"write")?); + syscall::fcntl(*write_fd, F_SETFL, flags)?; + syscall::fcntl(*write_fd, F_SETFD, flags)?; + + *fds = [ + c_int::try_from(*read_fd).map_err(|_| Error::new(EMFILE))?, + c_int::try_from(*write_fd).map_err(|_| Error::new(EMFILE))?, + ]; + + read_fd.take(); + write_fd.take(); + + Ok(()) +} + pub use redox_exec::{create_set_addr_space_buf, FdGuard}; diff --git a/src/platform/redox/mod.rs b/src/platform/redox/mod.rs index 231daf03c94cf0c17cb19fdaa9411abfe053dd92..254f5910bfce879a3d27ce7cb24847998b6759a5 100644 --- a/src/platform/redox/mod.rs +++ b/src/platform/redox/mod.rs @@ -767,11 +767,7 @@ impl Pal for Sys { } fn pipe2(fds: &mut [c_int], flags: c_int) -> c_int { - let mut usize_fds: [usize; 2] = [0; 2]; - let res = e(syscall::pipe2(&mut usize_fds, flags as usize)); - fds[0] = usize_fds[0] as c_int; - fds[1] = usize_fds[1] as c_int; - res as c_int + e(extra::pipe2(fds, flags as usize).map(|()| 0)) as c_int } unsafe fn rlct_clone(