1 //! The following is derived from Rust's 2 //! library/std/src/sys/unix/io.rs 3 //! dca3f1b786efd27be3b325ed1e01e247aa589c3b. 4 5 #![allow(unsafe_code)] 6 use super::super::c; 7 use core::marker::PhantomData; 8 use core::slice; 9 use linux_raw_sys::general::__kernel_size_t; 10 11 /// <https://doc.rust-lang.org/nightly/std/io/struct.IoSlice.html> 12 #[derive(Copy, Clone)] 13 #[repr(transparent)] 14 pub struct IoSlice<'a> { 15 vec: c::iovec, 16 _p: PhantomData<&'a [u8]>, 17 } 18 19 impl<'a> IoSlice<'a> { 20 /// <https://doc.rust-lang.org/nightly/std/io/struct.IoSlice.html#method.new> 21 #[inline] new(buf: &'a [u8]) -> IoSlice<'a>22 pub fn new(buf: &'a [u8]) -> IoSlice<'a> { 23 IoSlice { 24 vec: c::iovec { 25 iov_base: buf.as_ptr() as *mut u8 as *mut c::c_void, 26 iov_len: buf.len() as _, 27 }, 28 _p: PhantomData, 29 } 30 } 31 32 /// <https://doc.rust-lang.org/nightly/std/io/struct.IoSlice.html#method.advance> 33 #[inline] advance(&mut self, n: usize)34 pub fn advance(&mut self, n: usize) { 35 if self.vec.iov_len < n as _ { 36 panic!("advancing IoSlice beyond its length"); 37 } 38 39 unsafe { 40 self.vec.iov_len -= n as __kernel_size_t; 41 self.vec.iov_base = self.vec.iov_base.add(n); 42 } 43 } 44 45 /// <https://doc.rust-lang.org/nightly/std/io/struct.IoSlice.html#method.as_slice> 46 #[inline] as_slice(&self) -> &[u8]47 pub fn as_slice(&self) -> &[u8] { 48 unsafe { slice::from_raw_parts(self.vec.iov_base as *mut u8, self.vec.iov_len as usize) } 49 } 50 } 51 52 /// <https://doc.rust-lang.org/nightly/std/io/struct.IoSliceMut.html> 53 #[repr(transparent)] 54 pub struct IoSliceMut<'a> { 55 vec: c::iovec, 56 _p: PhantomData<&'a mut [u8]>, 57 } 58 59 impl<'a> IoSliceMut<'a> { 60 /// <https://doc.rust-lang.org/nightly/std/io/struct.IoSliceMut.html#method.new> 61 #[inline] new(buf: &'a mut [u8]) -> IoSliceMut<'a>62 pub fn new(buf: &'a mut [u8]) -> IoSliceMut<'a> { 63 IoSliceMut { 64 vec: c::iovec { 65 iov_base: buf.as_mut_ptr() as *mut c::c_void, 66 iov_len: buf.len() as _, 67 }, 68 _p: PhantomData, 69 } 70 } 71 72 /// <https://doc.rust-lang.org/nightly/std/io/struct.IoSliceMut.html#method.advance> 73 #[inline] advance(&mut self, n: usize)74 pub fn advance(&mut self, n: usize) { 75 if self.vec.iov_len < n as _ { 76 panic!("advancing IoSliceMut beyond its length"); 77 } 78 79 unsafe { 80 self.vec.iov_len -= n as __kernel_size_t; 81 self.vec.iov_base = self.vec.iov_base.add(n); 82 } 83 } 84 85 /// <https://doc.rust-lang.org/nightly/std/io/struct.IoSliceMut.html#method.as_slice> 86 #[inline] as_slice(&self) -> &[u8]87 pub fn as_slice(&self) -> &[u8] { 88 unsafe { slice::from_raw_parts(self.vec.iov_base as *mut u8, self.vec.iov_len as usize) } 89 } 90 91 /// <https://doc.rust-lang.org/nightly/std/io/struct.IoSliceMut.html#method.as_slice_mut> 92 #[inline] as_mut_slice(&mut self) -> &mut [u8]93 pub fn as_mut_slice(&mut self) -> &mut [u8] { 94 unsafe { 95 slice::from_raw_parts_mut(self.vec.iov_base as *mut u8, self.vec.iov_len as usize) 96 } 97 } 98 } 99