Skip to main content

rustpython_host_env/
errno.rs

1// spell-checker:disable
2
3/// Return the platform `strerror(errno)` message as an owned `String`.
4/// Returns `None` when the runtime gives no description for `errno`.
5#[cfg(any(unix, windows))]
6#[must_use]
7pub fn strerror_string(errno: i32) -> Option<String> {
8    let ptr = unsafe { libc::strerror(errno) };
9    if ptr.is_null() {
10        return None;
11    }
12    let s = unsafe { core::ffi::CStr::from_ptr(ptr) }.to_string_lossy();
13    Some(s.into_owned())
14}
15
16#[cfg(any(unix, windows, target_os = "wasi"))]
17pub mod errors {
18    pub use libc::*;
19    #[cfg(windows)]
20    pub use windows_sys::Win32::{
21        Foundation::*,
22        Networking::WinSock::{
23            WSABASEERR, WSADESCRIPTION_LEN, WSAEACCES, WSAEADDRINUSE, WSAEADDRNOTAVAIL,
24            WSAEAFNOSUPPORT, WSAEALREADY, WSAEBADF, WSAECANCELLED, WSAECONNABORTED,
25            WSAECONNREFUSED, WSAECONNRESET, WSAEDESTADDRREQ, WSAEDISCON, WSAEDQUOT, WSAEFAULT,
26            WSAEHOSTDOWN, WSAEHOSTUNREACH, WSAEINPROGRESS, WSAEINTR, WSAEINVAL,
27            WSAEINVALIDPROCTABLE, WSAEINVALIDPROVIDER, WSAEISCONN, WSAELOOP, WSAEMFILE,
28            WSAEMSGSIZE, WSAENAMETOOLONG, WSAENETDOWN, WSAENETRESET, WSAENETUNREACH, WSAENOBUFS,
29            WSAENOMORE, WSAENOPROTOOPT, WSAENOTCONN, WSAENOTEMPTY, WSAENOTSOCK, WSAEOPNOTSUPP,
30            WSAEPFNOSUPPORT, WSAEPROCLIM, WSAEPROTONOSUPPORT, WSAEPROTOTYPE,
31            WSAEPROVIDERFAILEDINIT, WSAEREFUSED, WSAEREMOTE, WSAESHUTDOWN, WSAESOCKTNOSUPPORT,
32            WSAESTALE, WSAETIMEDOUT, WSAETOOMANYREFS, WSAEUSERS, WSAEWOULDBLOCK, WSAID_ACCEPTEX,
33            WSAID_CONNECTEX, WSAID_DISCONNECTEX, WSAID_GETACCEPTEXSOCKADDRS, WSAID_TRANSMITFILE,
34            WSAID_TRANSMITPACKETS, WSAID_WSAPOLL, WSAID_WSARECVMSG, WSANO_DATA, WSANO_RECOVERY,
35            WSANOTINITIALISED, WSAPROTOCOL_LEN, WSASERVICE_NOT_FOUND, WSASYS_STATUS_LEN,
36            WSASYSCALLFAILURE, WSASYSNOTREADY, WSATRY_AGAIN, WSATYPE_NOT_FOUND, WSAVERNOTSUPPORTED,
37        },
38    };
39    #[cfg(windows)]
40    macro_rules! reexport_wsa {
41        ($($errname:ident),*$(,)?) => {
42            paste::paste! {
43                $(pub const $errname: i32 = windows_sys::Win32::Networking::WinSock:: [<WSA $errname>] as i32;)*
44            }
45        }
46    }
47    #[cfg(windows)]
48    reexport_wsa! {
49        EADDRINUSE, EADDRNOTAVAIL, EAFNOSUPPORT, EALREADY, ECONNABORTED, ECONNREFUSED, ECONNRESET,
50        EDESTADDRREQ, EDQUOT, EHOSTDOWN, EHOSTUNREACH, EINPROGRESS, EISCONN, ELOOP, EMSGSIZE,
51        ENETDOWN, ENETRESET, ENETUNREACH, ENOBUFS, ENOPROTOOPT, ENOTCONN, ENOTSOCK, EOPNOTSUPP,
52        EPFNOSUPPORT, EPROTONOSUPPORT, EPROTOTYPE, EREMOTE, ESHUTDOWN, ESOCKTNOSUPPORT, ESTALE,
53        ETIMEDOUT, ETOOMANYREFS, EUSERS, EWOULDBLOCK,
54        // TODO: EBADF should be here once winerrs are translated to errnos but it messes up some things atm
55    }
56}