1 use crate::std::marker::PhantomData; 2 use crate::std::os::fd::{AsFd, AsRawFd}; 3 use crate::std::slice; 4 5 use dlibc; 6 use dlibc::{c_void, iovec}; 7 8 #[derive(Copy, Clone)] 9 #[repr(transparent)] 10 pub struct IoSlice<'a> { 11 vec: iovec, 12 _p: PhantomData<&'a [u8]>, 13 } 14 15 impl<'a> IoSlice<'a> { 16 #[inline] 17 pub fn new(buf: &'a [u8]) -> IoSlice<'a> { 18 IoSlice { 19 vec: iovec { 20 iov_base: buf.as_ptr() as *mut u8 as *mut c_void, 21 iov_len: buf.len(), 22 }, 23 _p: PhantomData, 24 } 25 } 26 27 #[inline] 28 pub fn advance(&mut self, n: usize) { 29 if self.vec.iov_len < n { 30 panic!("advancing IoSlice beyond its length"); 31 } 32 33 unsafe { 34 self.vec.iov_len -= n; 35 self.vec.iov_base = self.vec.iov_base.add(n); 36 } 37 } 38 39 #[inline] 40 pub fn as_slice(&self) -> &[u8] { 41 unsafe { slice::from_raw_parts(self.vec.iov_base as *mut u8, self.vec.iov_len) } 42 } 43 } 44 45 #[repr(transparent)] 46 pub struct IoSliceMut<'a> { 47 vec: iovec, 48 _p: PhantomData<&'a mut [u8]>, 49 } 50 51 impl<'a> IoSliceMut<'a> { 52 #[inline] 53 pub fn new(buf: &'a mut [u8]) -> IoSliceMut<'a> { 54 IoSliceMut { 55 vec: iovec { 56 iov_base: buf.as_mut_ptr() as *mut c_void, 57 iov_len: buf.len(), 58 }, 59 _p: PhantomData, 60 } 61 } 62 63 #[inline] 64 pub fn advance(&mut self, n: usize) { 65 if self.vec.iov_len < n { 66 panic!("advancing IoSliceMut beyond its length"); 67 } 68 69 unsafe { 70 self.vec.iov_len -= n; 71 self.vec.iov_base = self.vec.iov_base.add(n); 72 } 73 } 74 75 #[inline] 76 pub fn as_slice(&self) -> &[u8] { 77 unsafe { slice::from_raw_parts(self.vec.iov_base as *mut u8, self.vec.iov_len) } 78 } 79 80 #[inline] 81 pub fn as_mut_slice(&mut self) -> &mut [u8] { 82 unsafe { slice::from_raw_parts_mut(self.vec.iov_base as *mut u8, self.vec.iov_len) } 83 } 84 } 85 86 pub fn is_terminal(fd: &impl AsFd) -> bool { 87 let fd = fd.as_fd(); 88 unsafe { dlibc::isatty(fd.as_raw_fd()) != 0 } 89 } 90