use alloc::vec::Vec; use core::slice; use crate::platform::types::{c_void, size_t}; /// See . #[allow(non_camel_case_types)] #[repr(C)] #[derive(Debug, CheckVsLibcCrate)] pub struct iovec { /// Base address of a memory region for input or output. pub iov_base: *mut c_void, /// The size of the memory pointed to by `iov_base`. pub iov_len: size_t, } impl iovec { #[expect(clippy::mut_from_ref)] unsafe fn to_slice(&self) -> &mut [u8] { unsafe { slice::from_raw_parts_mut(self.iov_base.cast::(), self.iov_len) } } } pub unsafe fn gather(iovs: &[iovec]) -> Vec { let mut vec = Vec::new(); for iov in iovs.iter() { // SAFETY: only a single mutable reference created vec.extend_from_slice(unsafe { iov.to_slice() }); } vec } pub unsafe fn scatter(iovs: &[iovec], vec: Vec) { let mut i = 0; for iov in iovs.iter() { // SAFETY: only a single mutable reference created let slice = unsafe { iov.to_slice() }; slice.copy_from_slice(&vec[i..][..slice.len()]); i += slice.len(); } }