* Move filetime module to yanix I've noticed that we could replace every occurrence of `crate::Result` in `filetime` mods with `io::Result`, so I thought why not move it to `yanix` and get rid off a lot of unnecessary code duplication within `wasi-common`. Now, ideally I'd have our `filetime` modifications backported to Alex's [`filetime`] crate, but one step at a time (apologies Alex, I was meant to backport this ages ago, just didn't find the time yet... :-(). Anyway, this commit does just that; i.e., moves the `filetime` modules into `yanix` which seems a better fit for this type of code. [`filetime`]: https://github.com/alexcrichton/filetime There is one caveat here. On Emscripten, converting between `filetime::Filetime` and `libc::timespec` appears to be lossy, at least as far as the types are concerned. Now, `filetime::Filetime`'s seconds field is `i64` while nanoseconds field is `u32`, while Emscripten's `libc::timespec` requires both to be `i32` width. This might actually not be a problem since I don't think it's possible to fill `filetime::Filetime` struct with values of width wider than `i32` since Emscripten is 32bit but just to be on the safe side, we do a `TryInto` conversion, log the error (if any), and return `libc::EOVERFLOW`. * Run cargo fmt * Use i64::from instead of as cast
71 lines
1.5 KiB
Rust
71 lines
1.5 KiB
Rust
//! `yanix` stands for Yet Another Nix crate, and, well, it is simply
|
|
//! a yet another crate in the spirit of the [nix] crate. As such,
|
|
//! this crate is inspired by the original `nix` crate, however,
|
|
//! it takes a different approach, using lower-level interfaces with
|
|
//! less abstraction, so that it fits better with its main use case
|
|
//! which is our WASI implementation, [wasi-common].
|
|
//!
|
|
//! [nix]: https://github.com/nix-rust/nix
|
|
//! [wasi-common]: https://github.com/bytecodealliance/wasmtime/tree/master/crates/wasi-common
|
|
#![cfg(unix)]
|
|
|
|
pub mod clock;
|
|
pub mod dir;
|
|
pub mod fcntl;
|
|
pub mod file;
|
|
pub mod filetime;
|
|
pub mod poll;
|
|
pub mod socket;
|
|
|
|
mod sys;
|
|
|
|
pub mod fadvise {
|
|
pub use super::sys::fadvise::*;
|
|
}
|
|
|
|
use std::io::{Error, Result};
|
|
|
|
fn from_success_code<T: IsZero>(t: T) -> Result<()> {
|
|
if t.is_zero() {
|
|
Ok(())
|
|
} else {
|
|
Err(Error::last_os_error())
|
|
}
|
|
}
|
|
|
|
fn from_result<T: IsMinusOne>(t: T) -> Result<T> {
|
|
if t.is_minus_one() {
|
|
Err(Error::last_os_error())
|
|
} else {
|
|
Ok(t)
|
|
}
|
|
}
|
|
|
|
trait IsZero {
|
|
fn is_zero(&self) -> bool;
|
|
}
|
|
|
|
macro_rules! impl_is_zero {
|
|
($($t:ident)*) => ($(impl IsZero for $t {
|
|
fn is_zero(&self) -> bool {
|
|
*self == 0
|
|
}
|
|
})*)
|
|
}
|
|
|
|
impl_is_zero! { i32 i64 isize }
|
|
|
|
trait IsMinusOne {
|
|
fn is_minus_one(&self) -> bool;
|
|
}
|
|
|
|
macro_rules! impl_is_minus_one {
|
|
($($t:ident)*) => ($(impl IsMinusOne for $t {
|
|
fn is_minus_one(&self) -> bool {
|
|
*self == -1
|
|
}
|
|
})*)
|
|
}
|
|
|
|
impl_is_minus_one! { i32 i64 isize }
|