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 }