1 use std::cmp; 2 use std::io; 3 use std::os::unix::io::AsRawFd; 4 use libc; 5 use iovec::IoVec; 6 use iovec::unix as iovec; 7 8 pub trait VecIo { readv(&self, bufs: &mut [&mut IoVec]) -> io::Result<usize>9 fn readv(&self, bufs: &mut [&mut IoVec]) -> io::Result<usize>; 10 writev(&self, bufs: &[&IoVec]) -> io::Result<usize>11 fn writev(&self, bufs: &[&IoVec]) -> io::Result<usize>; 12 } 13 14 impl<T: AsRawFd> VecIo for T { readv(&self, bufs: &mut [&mut IoVec]) -> io::Result<usize>15 fn readv(&self, bufs: &mut [&mut IoVec]) -> io::Result<usize> { 16 unsafe { 17 let slice = iovec::as_os_slice_mut(bufs); 18 let len = cmp::min(<libc::c_int>::max_value() as usize, slice.len()); 19 let rc = libc::readv(self.as_raw_fd(), 20 slice.as_ptr(), 21 len as libc::c_int); 22 if rc < 0 { 23 Err(io::Error::last_os_error()) 24 } else { 25 Ok(rc as usize) 26 } 27 } 28 } 29 writev(&self, bufs: &[&IoVec]) -> io::Result<usize>30 fn writev(&self, bufs: &[&IoVec]) -> io::Result<usize> { 31 unsafe { 32 let slice = iovec::as_os_slice(bufs); 33 let len = cmp::min(<libc::c_int>::max_value() as usize, slice.len()); 34 let rc = libc::writev(self.as_raw_fd(), 35 slice.as_ptr(), 36 len as libc::c_int); 37 if rc < 0 { 38 Err(io::Error::last_os_error()) 39 } else { 40 Ok(rc as usize) 41 } 42 } 43 } 44 }