io_at/os/
unix.rs

1extern crate libc;
2use super::super::*;
3use std::io;
4pub use std::os::unix::io::AsRawFd as AsRaw;
5
6/* ideally this would generalize over any return value we can ask "is non-negative", but
7 * there isn't a built in trait for that and defining it ourselves would be work
8 */
9fn into_io_result(r: libc::ssize_t) -> Result<usize>
10{
11    if r >= 0 {
12        Ok(r as usize)
13    } else {
14        Err(io::Error::last_os_error())
15    }
16}
17
18pub fn pread<F: AsRaw>(fd: &F, buf: &mut [u8], offs: u64) -> Result<usize>
19{
20    into_io_result(unsafe { libc::pread(fd.as_raw_fd(), buf.as_mut_ptr() as *mut _, buf.len(), offs as libc::off_t) })
21}
22
23pub fn pwrite<F: AsRaw>(fd: &F, buf: &[u8], offs: u64) -> Result<usize>
24{
25    into_io_result(unsafe { libc::pwrite(fd.as_raw_fd(), buf.as_ptr() as *const _, buf.len(), offs as libc::off_t) })
26}