diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2019-07-11 17:13:00 +0000 |
---|---|---|
committer | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2019-07-11 17:13:00 +0000 |
commit | 5e463aa51f0e644d54c21f0db2effa4b757f982a (patch) | |
tree | 26a91b122325b8a5396e82ba315de20bb0830c06 /src | |
parent | 074caea7c8b21ea359e9277d54a08b561394acdd (diff) | |
parent | f723b1822de9bd446cc6d038f4e78f7b0f58a48b (diff) | |
download | nix-5e463aa51f0e644d54c21f0db2effa4b757f982a.zip |
Merge #1089
1089: implement posix_fadvise r=asomers a=kevinwern
See:
https://github.com/CraneStation/wasi-common/issues/16
http://man7.org/linux/man-pages/man2/posix_fadvise.2.html
Conditional compilation derived from corresponding libc conditions:
Fuchsia:
https://github.com/rust-lang/libc/blob/0b02c4060a750983cebcccdf1f35a5ec4cdcf516/src/fuchsia/mod.rs#L3807
https://github.com/rust-lang/libc/blob/0e702c1b4e2e56788e8b67d3efd9c242807c3d4b/src/lib.rs#L104-L109
uClibc:
https://github.com/rust-lang/libc/blob/11c762c535cb43dda3d9d87a0845c55201a905fb/src/unix/uclibc/mod.rs#L1676
https://github.com/rust-lang/libc/blob/ce7e3a7e866dd7109a971b694a2bf58bd08f101a/src/unix/mod.rs#L1141-L1143
https://github.com/rust-lang/libc/blob/0e702c1b4e2e56788e8b67d3efd9c242807c3d4b/src/lib.rs#L116-L121
Linux, android, emscripten:
https://github.com/rust-lang/libc/blob/11c762c535cb43dda3d9d87a0845c55201a905fb/src/unix/linux_like/mod.rs#L1303
https://github.com/rust-lang/libc/blob/ce7e3a7e866dd7109a971b694a2bf58bd08f101a/src/unix/mod.rs#L1147-L1151
https://github.com/rust-lang/libc/blob/0e702c1b4e2e56788e8b67d3efd9c242807c3d4b/src/lib.rs#L116-L121
FreeBSD:
https://github.com/rust-lang/libc/blob/e0ff1e68b9e34173e9c4c3217d1b0fc81a7d352d/src/unix/bsd/freebsdlike/freebsd/mod.rs#L1223
https://github.com/rust-lang/libc/blob/ce7e3a7e866dd7109a971b694a2bf58bd08f101a/src/unix/bsd/freebsdlike/mod.rs#L1307-L1309
https://github.com/rust-lang/libc/blob/ce7e3a7e866dd7109a971b694a2bf58bd08f101a/src/unix/bsd/mod.rs#L683-L685
https://github.com/rust-lang/libc/blob/ce7e3a7e866dd7109a971b694a2bf58bd08f101a/src/unix/mod.rs#L1152-L1159
https://github.com/rust-lang/libc/blob/0e702c1b4e2e56788e8b67d3efd9c242807c3d4b/src/lib.rs#L116-L121
WASI:
https://github.com/rust-lang/libc/blob/0e702c1b4e2e56788e8b67d3efd9c242807c3d4b/src/wasi.rs#L1001
https://github.com/rust-lang/libc/blob/0e702c1b4e2e56788e8b67d3efd9c242807c3d4b/src/lib.rs#L134-L139
Co-authored-by: Kevin Wern <kevin.m.wern@gmail.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/fcntl.rs | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/src/fcntl.rs b/src/fcntl.rs index 3d932a53..2201873a 100644 --- a/src/fcntl.rs +++ b/src/fcntl.rs @@ -12,6 +12,15 @@ use std::ptr; // For splice and copy_file_range #[cfg(any(target_os = "android", target_os = "linux"))] use sys::uio::IoVec; // For vmsplice +#[cfg(any(target_os = "linux", + target_os = "android", + target_os = "emscripten", + target_os = "fuchsia", + any(target_os = "wasi", target_env = "wasi"), + target_env = "uclibc", + target_env = "freebsd"))] +pub use self::posix_fadvise::*; + libc_bitflags!{ pub struct AtFlags: c_int { AT_SYMLINK_NOFOLLOW; @@ -448,3 +457,37 @@ pub fn fallocate(fd: RawFd, mode: FallocateFlags, offset: libc::off_t, len: libc let res = unsafe { libc::fallocate(fd, mode.bits(), offset, len) }; Errno::result(res) } + +#[cfg(any(target_os = "linux", + target_os = "android", + target_os = "emscripten", + target_os = "fuchsia", + any(target_os = "wasi", target_env = "wasi"), + target_env = "uclibc", + target_env = "freebsd"))] +mod posix_fadvise { + use Result; + use libc; + use errno::Errno; + use std::os::unix::io::RawFd; + + libc_enum! { + #[repr(i32)] + pub enum PosixFadviseAdvice { + POSIX_FADV_NORMAL, + POSIX_FADV_SEQUENTIAL, + POSIX_FADV_RANDOM, + POSIX_FADV_NOREUSE, + POSIX_FADV_WILLNEED, + POSIX_FADV_DONTNEED, + } + } + + pub fn posix_fadvise(fd: RawFd, + offset: libc::off_t, + len: libc::off_t, + advice: PosixFadviseAdvice) -> Result<libc::c_int> { + let res = unsafe { libc::posix_fadvise(fd, offset, len, advice as libc::c_int) }; + Errno::result(res) + } +} |