use libc::{c_int, c_void, sighandler_t, size_t, ssize_t};
use libc::{ftruncate, pread, pwrite};
+use convert::TryInto;
use io;
use super::{cvt, cvt_r};
weak!(fn pread64(c_int, *mut c_void, size_t, i64) -> ssize_t);
unsafe {
pread64.get().map(|f| cvt(f(fd, buf, count, offset))).unwrap_or_else(|| {
- if offset as u64 > i32::max_value() as u64 {
+ if let Ok(o) = offset.try_into() {
+ cvt(pread(fd, buf, count, o))
+ } else {
Err(io::Error::new(io::Error::InvalidInput,
"cannot pread >2GB"))
- } else {
- cvt(pread(fd, buf, count, offset as i32))
}
})
}
weak!(fn pwrite64(c_int, *const c_void, size_t, i64) -> ssize_t);
unsafe {
pwrite64.get().map(|f| cvt(f(fd, buf, count, offset))).unwrap_or_else(|| {
- if offset as u64 > i32::max_value() as u64 {
+ if let Ok(o) = offset.try_into() {
+ cvt(pwrite(fd, buf, count, o))
+ } else {
Err(io::Error::new(io::Error::InvalidInput,
"cannot pwrite >2GB"))
- } else {
- cvt(pwrite(fd, buf, count, offset as i32))
}
})
}
use sys_common::AsInner;
use sys_common::io::read_to_end_uninitialized;
-#[cfg(target_os = "android")]
-use super::android::{cvt_pread64, cvt_pwrite64};
-#[cfg(any(target_os = "linux", target_os = "emscripten"))]
-use libc::{pread64, pwrite64, off64_t, ssize_t};
-#[cfg(not(any(target_os = "linux", target_os = "emscripten", target_os = "android")))]
-use libc::{pread as pread64, pwrite as pwrite64, off_t as off64_t, ssize_t};
-
-#[cfg(not(target_os = "android"))]
-unsafe fn cvt_pread64(fd: c_int, buf: *mut c_void, count: size_t, offset: off64_t)
- -> io::Result<ssize_t>
-{
- cvt(pread64(fd, buf, count, offset))
-}
-
-#[cfg(not(target_os = "android"))]
-unsafe fn cvt_pwrite64(fd: c_int, buf: *const c_void, count: size_t, offset: off64_t)
- -> io::Result<ssize_t>
-{
- cvt(pwrite64(fd, buf, count, offset))
-}
-
pub struct FileDesc {
fd: c_int,
}
}
pub fn read_at(&self, buf: &mut [u8], offset: u64) -> io::Result<usize> {
+ #[cfg(target_os = "android")]
+ use super::android::cvt_pread64;
+
+ #[cfg(not(target_os = "android"))]
+ unsafe fn cvt_pread64(fd: c_int, buf: *mut c_void, count: usize, offset: i64)
+ -> io::Result<isize>
+ {
+ #[cfg(any(target_os = "linux", target_os = "emscripten"))]
+ use libc::pread64;
+ #[cfg(not(any(target_os = "linux", target_os = "emscripten")))]
+ use libc::pread as pread64;
+ cvt(pread64(fd, buf, count, offset))
+ }
+
unsafe {
cvt_pread64(self.fd,
buf.as_mut_ptr() as *mut c_void,
buf.len(),
- offset as off64_t)
+ offset as i64)
.map(|n| n as usize)
}
}
}
pub fn write_at(&self, buf: &[u8], offset: u64) -> io::Result<usize> {
+ #[cfg(target_os = "android")]
+ use super::android::cvt_pwrite64;
+
+ #[cfg(not(target_os = "android"))]
+ unsafe fn cvt_pwrite64(fd: c_int, buf: *const c_void, count: usize, offset: i64)
+ -> io::Result<isize>
+ {
+ #[cfg(any(target_os = "linux", target_os = "emscripten"))]
+ use libc::pwrite64;
+ #[cfg(not(any(target_os = "linux", target_os = "emscripten")))]
+ use libc::pwrite as pwrite64;
+ cvt(pwrite64(fd, buf, count, offset))
+ }
+
unsafe {
cvt_pwrite64(self.fd,
buf.as_ptr() as *const c_void,
buf.len(),
- offset as off64_t)
+ offset as i64)
.map(|n| n as usize)
}
}