1 #![allow(dead_code, missing_docs, nonstandard_style)]
3 use crate::io::ErrorKind;
6 pub use self::rand::hashmap_random_keys;
8 #[path = "../unix/alloc.rs"]
11 #[cfg(feature = "backtrace")]
17 pub mod fast_thread_local;
30 pub mod stack_overflow;
37 pub use crate::sys_common::os_str_bytes as os_str;
42 pub fn decode_error_kind(errno: i32) -> ErrorKind {
44 syscall::ECONNREFUSED => ErrorKind::ConnectionRefused,
45 syscall::ECONNRESET => ErrorKind::ConnectionReset,
46 syscall::EPERM | syscall::EACCES => ErrorKind::PermissionDenied,
47 syscall::EPIPE => ErrorKind::BrokenPipe,
48 syscall::ENOTCONN => ErrorKind::NotConnected,
49 syscall::ECONNABORTED => ErrorKind::ConnectionAborted,
50 syscall::EADDRNOTAVAIL => ErrorKind::AddrNotAvailable,
51 syscall::EADDRINUSE => ErrorKind::AddrInUse,
52 syscall::ENOENT => ErrorKind::NotFound,
53 syscall::EINTR => ErrorKind::Interrupted,
54 syscall::EINVAL => ErrorKind::InvalidInput,
55 syscall::ETIMEDOUT => ErrorKind::TimedOut,
56 syscall::EEXIST => ErrorKind::AlreadyExists,
58 // These two constants can have the same value on some systems,
59 // but different values on others, so we can't use a match
61 x if x == syscall::EAGAIN || x == syscall::EWOULDBLOCK =>
62 ErrorKind::WouldBlock,
64 _ => ErrorKind::Other,
68 pub fn cvt(result: Result<usize, syscall::Error>) -> crate::io::Result<usize> {
69 result.map_err(|err| crate::io::Error::from_raw_os_error(err.errno))
73 pub trait IsMinusOne {
74 fn is_minus_one(&self) -> bool;
77 macro_rules! impl_is_minus_one {
78 ($($t:ident)*) => ($(impl IsMinusOne for $t {
79 fn is_minus_one(&self) -> bool {
85 impl_is_minus_one! { i8 i16 i32 i64 isize }
87 pub fn cvt_libc<T: IsMinusOne>(t: T) -> crate::io::Result<T> {
89 Err(crate::io::Error::last_os_error())
95 /// On Redox, use an illegal instruction to abort
96 pub unsafe fn abort_internal() -> ! {
97 core::intrinsics::abort();