From 947eb1fb530f5ceb562c2c2f6dd5a7113704b60f Mon Sep 17 00:00:00 2001 From: Marcin Mielniczuk Date: Fri, 23 Aug 2019 18:34:04 +0200 Subject: [PATCH] Move fd_advise on Linux to nix --- src/sys/unix/hostcalls_impl/fs.rs | 59 +++++++++++++++++-------------- 1 file changed, 32 insertions(+), 27 deletions(-) diff --git a/src/sys/unix/hostcalls_impl/fs.rs b/src/sys/unix/hostcalls_impl/fs.rs index 90ce9c217f..863d28e5f5 100644 --- a/src/sys/unix/hostcalls_impl/fs.rs +++ b/src/sys/unix/hostcalls_impl/fs.rs @@ -4,7 +4,7 @@ use super::fs_helpers::*; use crate::helpers::systemtime_to_timestamp; use crate::hostcalls_impl::PathGet; use crate::sys::errno_from_ioerror; -use crate::sys::host_impl; +use crate::sys::host_impl::{self, errno_from_nix}; use crate::{host, Result}; use nix::libc::{self, c_long, c_void}; use std::convert::TryInto; @@ -42,45 +42,50 @@ pub(crate) fn fd_fdstat_set_flags(fd: &File, fdflags: host::__wasi_fdflags_t) -> } } +#[cfg(target_os = "linux")] pub(crate) fn fd_advise( file: &File, advice: host::__wasi_advice_t, offset: host::__wasi_filesize_t, len: host::__wasi_filesize_t, ) -> Result<()> { - #[cfg(target_os = "linux")] { - use nix::libc::off_t; + use nix::fcntl::{posix_fadvise, PosixFadviseAdvice}; + let offset = offset.try_into().map_err(|_| host::__WASI_EOVERFLOW)?; + let len = len.try_into().map_err(|_| host::__WASI_EOVERFLOW)?; let host_advice = match advice { - host::__WASI_ADVICE_DONTNEED => libc::POSIX_FADV_DONTNEED, - host::__WASI_ADVICE_SEQUENTIAL => libc::POSIX_FADV_SEQUENTIAL, - host::__WASI_ADVICE_WILLNEED => libc::POSIX_FADV_DONTNEED, - host::__WASI_ADVICE_NOREUSE => libc::POSIX_FADV_NOREUSE, - host::__WASI_ADVICE_RANDOM => libc::POSIX_FADV_RANDOM, - host::__WASI_ADVICE_NORMAL => libc::POSIX_FADV_NORMAL, + host::__WASI_ADVICE_DONTNEED => PosixFadviseAdvice::POSIX_FADV_DONTNEED, + host::__WASI_ADVICE_SEQUENTIAL => PosixFadviseAdvice::POSIX_FADV_SEQUENTIAL, + host::__WASI_ADVICE_WILLNEED => PosixFadviseAdvice::POSIX_FADV_DONTNEED, + host::__WASI_ADVICE_NOREUSE => PosixFadviseAdvice::POSIX_FADV_NOREUSE, + host::__WASI_ADVICE_RANDOM => PosixFadviseAdvice::POSIX_FADV_RANDOM, + host::__WASI_ADVICE_NORMAL => PosixFadviseAdvice::POSIX_FADV_NORMAL, _ => return Err(host::__WASI_EINVAL), }; - let res = unsafe { - libc::posix_fadvise(file.as_raw_fd(), offset as off_t, len as off_t, host_advice) - }; - if res != 0 { - return Err(host_impl::errno_from_nix(nix::errno::Errno::last())); - } + + posix_fadvise(file.as_raw_fd(), offset, len, host_advice) + .map_err(|err| errno_from_nix(err.as_errno().unwrap()))?; } - #[cfg(not(target_os = "linux"))] - { - let _ = (file, offset, len); - match advice { - host::__WASI_ADVICE_DONTNEED - | host::__WASI_ADVICE_SEQUENTIAL - | host::__WASI_ADVICE_WILLNEED - | host::__WASI_ADVICE_NOREUSE - | host::__WASI_ADVICE_RANDOM - | host::__WASI_ADVICE_NORMAL => {} - _ => return Err(host::__WASI_EINVAL), - } + Ok(()) +} + +#[cfg(not(target_os = "linux"))] +pub(crate) fn fd_advise( + _file: &File, + advice: host::__wasi_advice_t, + _offset: host::__wasi_filesize_t, + _len: host::__wasi_filesize_t, +) -> Result<()> { + match advice { + host::__WASI_ADVICE_DONTNEED + | host::__WASI_ADVICE_SEQUENTIAL + | host::__WASI_ADVICE_WILLNEED + | host::__WASI_ADVICE_NOREUSE + | host::__WASI_ADVICE_RANDOM + | host::__WASI_ADVICE_NORMAL => {} + _ => return Err(host::__WASI_EINVAL), } Ok(())