| //! System bindings for the WASI platforms. |
| //! |
| //! This module contains the facade (aka platform-specific) implementations of |
| //! OS level functionality for WASI. Currently this includes both WASIp1 and |
| //! WASIp2. |
| |
| use crate::io; |
| |
| pub mod conf; |
| #[allow(unused)] |
| #[path = "../wasm/atomics/futex.rs"] |
| pub mod futex; |
| pub mod stack_overflow; |
| #[path = "../unix/time.rs"] |
| pub mod time; |
| |
| #[cfg(not(target_env = "p1"))] |
| mod cabi_realloc; |
| |
| #[path = "../unsupported/common.rs"] |
| #[deny(unsafe_op_in_unsafe_fn)] |
| #[expect(dead_code)] |
| mod common; |
| pub use common::{cleanup, init, unsupported}; |
| |
| pub fn abort_internal() -> ! { |
| unsafe { libc::abort() } |
| } |
| |
| #[inline] |
| #[cfg(target_env = "p1")] |
| pub(crate) fn err2io(err: wasi::Errno) -> crate::io::Error { |
| crate::io::Error::from_raw_os_error(err.raw().into()) |
| } |
| |
| #[doc(hidden)] |
| pub 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! { i8 i16 i32 i64 isize } |
| |
| pub fn cvt<T: IsMinusOne>(t: T) -> io::Result<T> { |
| if t.is_minus_one() { Err(io::Error::last_os_error()) } else { Ok(t) } |
| } |
| |
| pub fn cvt_r<T, F>(mut f: F) -> io::Result<T> |
| where |
| T: IsMinusOne, |
| F: FnMut() -> T, |
| { |
| loop { |
| match cvt(f()) { |
| Err(ref e) if e.is_interrupted() => {} |
| other => return other, |
| } |
| } |
| } |