relibc/header/bits_iovec/
mod.rs1use alloc::vec::Vec;
2use core::slice;
3
4use crate::platform::types::{c_void, size_t};
5
6#[allow(non_camel_case_types)]
8#[repr(C)]
9#[derive(Debug, CheckVsLibcCrate)]
10pub struct iovec {
11 pub iov_base: *mut c_void,
13 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}