1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
use std::fs::File; use std::io::{Result, Write, Error}; use std::os::unix::io::AsRawFd; use super::{ReadAt, WriteAt}; extern crate libc; use self::libc::{pread, pwrite, c_void, off_t, size_t, ssize_t}; fn err(e: ssize_t) -> Result<usize> { if e == -1 as ssize_t { Err(Error::last_os_error()) } else { Ok(e as usize) } } impl ReadAt for File { fn read_at(&self, pos: u64, buf: &mut [u8]) -> Result<usize> { let fd = self.as_raw_fd(); err(unsafe { pread(fd, buf.as_mut_ptr() as *mut c_void, buf.len() as size_t, pos as off_t) }) } } impl WriteAt for File { fn write_at(&mut self, pos: u64, buf: &[u8]) -> Result<usize> { let fd = self.as_raw_fd(); err(unsafe { pwrite(fd, buf.as_ptr() as *const c_void, buf.len() as size_t, pos as off_t) }) } fn flush(&mut self) -> Result<()> { Write::flush(self) } }