feat: call with multiple fds
Signed-off-by: Anhad Singh <andypython@protonmail.com>
This commit is contained in:
+92
-28
@@ -311,6 +311,16 @@ extern "C" {
|
|||||||
metadata: *const u64,
|
metadata: *const u64,
|
||||||
metadata_len: usize,
|
metadata_len: usize,
|
||||||
) -> RawResult;
|
) -> RawResult;
|
||||||
|
fn redox_sys_call_multiple_v0(
|
||||||
|
fds: *const usize,
|
||||||
|
fds_len: usize,
|
||||||
|
payload: *mut u8,
|
||||||
|
payload_len: usize,
|
||||||
|
flags: usize,
|
||||||
|
metadata: *const u64,
|
||||||
|
metadata_len: usize,
|
||||||
|
) -> RawResult;
|
||||||
|
|
||||||
fn redox_get_socket_token_v0(fd: usize, payload: *mut u8, payload_len: usize) -> RawResult;
|
fn redox_get_socket_token_v0(fd: usize, payload: *mut u8, payload_len: usize) -> RawResult;
|
||||||
|
|
||||||
fn redox_setns_v0(fd: usize) -> RawResult;
|
fn redox_setns_v0(fd: usize) -> RawResult;
|
||||||
@@ -472,6 +482,65 @@ pub mod call {
|
|||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
|
#[cfg(feature = "redox_syscall")]
|
||||||
|
pub trait Call {
|
||||||
|
unsafe fn raw_call(
|
||||||
|
&self,
|
||||||
|
payload: *mut u8,
|
||||||
|
payload_len: usize,
|
||||||
|
flags: syscall::CallFlags,
|
||||||
|
metadata: &[u64],
|
||||||
|
) -> Result<usize>;
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "redox_syscall")]
|
||||||
|
impl Call for usize {
|
||||||
|
unsafe fn raw_call(
|
||||||
|
&self,
|
||||||
|
payload: *mut u8,
|
||||||
|
payload_len: usize,
|
||||||
|
flags: syscall::CallFlags,
|
||||||
|
metadata: &[u64],
|
||||||
|
) -> Result<usize> {
|
||||||
|
Ok(Error::demux(unsafe {
|
||||||
|
redox_sys_call_v0(
|
||||||
|
*self,
|
||||||
|
payload,
|
||||||
|
payload_len,
|
||||||
|
flags.bits(),
|
||||||
|
metadata.as_ptr(),
|
||||||
|
metadata.len(),
|
||||||
|
)
|
||||||
|
})?)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "redox_syscall")]
|
||||||
|
impl Call for &[usize] {
|
||||||
|
/// # Errors
|
||||||
|
///
|
||||||
|
/// * `EXDEV` - The file descriptors belong to different schemes.
|
||||||
|
unsafe fn raw_call(
|
||||||
|
&self,
|
||||||
|
payload: *mut u8,
|
||||||
|
payload_len: usize,
|
||||||
|
flags: syscall::CallFlags,
|
||||||
|
metadata: &[u64],
|
||||||
|
) -> Result<usize> {
|
||||||
|
Error::demux(unsafe {
|
||||||
|
redox_sys_call_multiple_v0(
|
||||||
|
self.as_ptr(),
|
||||||
|
self.len(),
|
||||||
|
payload,
|
||||||
|
payload_len,
|
||||||
|
flags.bits(),
|
||||||
|
metadata.as_ptr(),
|
||||||
|
metadata.len(),
|
||||||
|
)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// flags and mode are binary compatible with libc
|
/// flags and mode are binary compatible with libc
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn open(path: impl AsRef<str>, flags: i32, mode: u16) -> Result<usize> {
|
pub fn open(path: impl AsRef<str>, flags: i32, mode: u16) -> Result<usize> {
|
||||||
@@ -584,62 +653,57 @@ pub mod call {
|
|||||||
Error::demux(unsafe { redox_close_v1(raw_fd) })?;
|
Error::demux(unsafe { redox_close_v1(raw_fd) })?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "redox_syscall")]
|
#[cfg(feature = "redox_syscall")]
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn call_ro(
|
pub fn call_ro<T: Call>(
|
||||||
fd: usize,
|
fd: T,
|
||||||
payload: &mut [u8],
|
payload: &mut [u8],
|
||||||
flags: syscall::CallFlags,
|
flags: syscall::CallFlags,
|
||||||
metadata: &[u64],
|
metadata: &[u64],
|
||||||
) -> Result<usize> {
|
) -> Result<usize> {
|
||||||
Ok(Error::demux(unsafe {
|
unsafe {
|
||||||
redox_sys_call_v0(
|
fd.raw_call(
|
||||||
fd,
|
|
||||||
payload.as_mut_ptr(),
|
payload.as_mut_ptr(),
|
||||||
payload.len(),
|
payload.len(),
|
||||||
(flags | syscall::CallFlags::READ).bits(),
|
flags | syscall::CallFlags::READ,
|
||||||
metadata.as_ptr(),
|
metadata,
|
||||||
metadata.len(),
|
|
||||||
)
|
)
|
||||||
})?)
|
}
|
||||||
}
|
}
|
||||||
#[cfg(feature = "redox_syscall")]
|
#[cfg(feature = "redox_syscall")]
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn call_wo(
|
pub fn call_wo<T: Call>(
|
||||||
fd: usize,
|
fd: T,
|
||||||
payload: &[u8],
|
payload: &[u8],
|
||||||
flags: syscall::CallFlags,
|
flags: syscall::CallFlags,
|
||||||
metadata: &[u64],
|
metadata: &[u64],
|
||||||
) -> Result<usize> {
|
) -> Result<usize> {
|
||||||
Ok(Error::demux(unsafe {
|
unsafe {
|
||||||
redox_sys_call_v0(
|
fd.raw_call(
|
||||||
fd,
|
payload.as_ptr().cast_mut(),
|
||||||
payload.as_ptr() as *mut u8,
|
|
||||||
payload.len(),
|
payload.len(),
|
||||||
(flags | syscall::CallFlags::WRITE).bits(),
|
flags | syscall::CallFlags::WRITE,
|
||||||
metadata.as_ptr(),
|
metadata,
|
||||||
metadata.len(),
|
|
||||||
)
|
)
|
||||||
})?)
|
}
|
||||||
}
|
}
|
||||||
#[cfg(feature = "redox_syscall")]
|
#[cfg(feature = "redox_syscall")]
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn call_rw(
|
pub fn call_rw<T: Call>(
|
||||||
fd: usize,
|
fd: T,
|
||||||
payload: &mut [u8],
|
payload: &mut [u8],
|
||||||
flags: syscall::CallFlags,
|
flags: syscall::CallFlags,
|
||||||
metadata: &[u64],
|
metadata: &[u64],
|
||||||
) -> Result<usize> {
|
) -> Result<usize> {
|
||||||
Ok(Error::demux(unsafe {
|
unsafe {
|
||||||
redox_sys_call_v0(
|
fd.raw_call(
|
||||||
fd,
|
|
||||||
payload.as_mut_ptr(),
|
payload.as_mut_ptr(),
|
||||||
payload.len(),
|
payload.len(),
|
||||||
(flags | syscall::CallFlags::READ | syscall::CallFlags::WRITE).bits(),
|
flags | syscall::CallFlags::READ | syscall::CallFlags::WRITE,
|
||||||
metadata.as_ptr(),
|
metadata,
|
||||||
metadata.len(),
|
|
||||||
)
|
)
|
||||||
})?)
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
|
|||||||
Reference in New Issue
Block a user