Skip to content
Snippets Groups Projects

Replace syscall::pipe2 with pipe scheme.

Merged Jacob Lorentzon requested to merge 4lDO2/relibc:pipe_scheme into master
3 files
+ 24
6
Compare changes
  • Side-by-side
  • Inline
Files
3
@@ -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};
Loading