Skip to main content

relibc/header/bits_iovec/
mod.rs

1use alloc::vec::Vec;
2use core::slice;
3
4use crate::platform::types::{c_void, size_t};
5
6/// See <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/sys_uio.h.html>.
7#[allow(non_camel_case_types)]
8#[repr(C)]
9#[derive(Debug, CheckVsLibcCrate)]
10pub struct iovec {
11    /// Base address of a memory region for input or output.
12    pub iov_base: *mut c_void,
13    /// The size of the memory pointed to by `iov_base`.
14    pub iov_len: size_t,
15}
16
17impl iovec {
18    unsafe fn to_slice(&self) -> &mut [u8] {
19        unsafe { slice::from_raw_parts_mut(self.iov_base.cast::<u8>(), self.iov_len) }
20    }
21}
22
23pub unsafe fn gather(iovs: &[iovec]) -> Vec<u8> {
24    let mut vec = Vec::new();
25    for iov in iovs.iter() {
26        vec.extend_from_slice(unsafe { iov.to_slice() });
27    }
28    vec
29}
30
31pub unsafe fn scatter(iovs: &[iovec], vec: Vec<u8>) {
32    let mut i = 0;
33    for iov in iovs.iter() {
34        let slice = unsafe { iov.to_slice() };
35        slice.copy_from_slice(&vec[i..][..slice.len()]);
36        i += slice.len();
37    }
38}