diff --git a/crates/host_env/src/errno_wasm.rs b/crates/host_env/src/errno_wasm.rs new file mode 100644 index 000000000..1bf4922c1 --- /dev/null +++ b/crates/host_env/src/errno_wasm.rs @@ -0,0 +1,10 @@ +//! Errno numbers for `wasm32-unknown-unknown`. +//! +//! There is no libc errno table. The values are the Linux ABI the stdlib +//! and `OSError` subclasses match against. + +pub mod errors { + pub const EAGAIN: i32 = 11; + pub const ECONNABORTED: i32 = 103; + pub const ECONNRESET: i32 = 104; +} diff --git a/crates/host_env/src/lib.rs b/crates/host_env/src/lib.rs index f285771de..202f40456 100644 --- a/crates/host_env/src/lib.rs +++ b/crates/host_env/src/lib.rs @@ -9,6 +9,9 @@ pub use macros::*; pub mod ctypes; #[cfg(any(unix, windows, target_os = "wasi"))] pub mod errno; +#[cfg(all(target_arch = "wasm32", target_os = "unknown"))] +#[path = "errno_wasm.rs"] +pub mod errno; #[cfg(any(unix, windows, target_os = "wasi"))] pub mod io; #[cfg(all(target_arch = "wasm32", not(target_os = "wasi")))] @@ -44,6 +47,9 @@ pub mod fcntl; pub mod select; #[cfg(any(unix, windows))] pub mod socket; +#[cfg(any(all(target_arch = "wasm32", target_os = "unknown"), target_os = "wasi"))] +#[path = "socket_wasm.rs"] +pub mod socket; #[cfg(unix)] pub mod syslog; #[cfg(all(unix, not(target_os = "redox"), not(target_os = "ios")))] diff --git a/crates/host_env/src/os.rs b/crates/host_env/src/os.rs index cdfced96c..ae3784ace 100644 --- a/crates/host_env/src/os.rs +++ b/crates/host_env/src/os.rs @@ -60,6 +60,42 @@ pub const SF_SUPPORTED: u32 = 0x009f0000; #[cfg(target_os = "macos")] pub const SF_SYNTHETIC: u32 = 0xc0000000; +/// BSD `chflags` bits libc binds on macOS and `_stat.c` falls back to +/// elsewhere. Published by `_stat` on every platform. +#[cfg(target_os = "macos")] +pub use libc::{ + SF_APPEND, SF_ARCHIVED, SF_IMMUTABLE, UF_APPEND, UF_COMPRESSED, UF_HIDDEN, UF_IMMUTABLE, + UF_NODUMP, UF_OPAQUE, +}; +#[cfg(not(target_os = "macos"))] +pub const UF_NODUMP: u32 = 0x00000001; +#[cfg(not(target_os = "macos"))] +pub const UF_IMMUTABLE: u32 = 0x00000002; +#[cfg(not(target_os = "macos"))] +pub const UF_APPEND: u32 = 0x00000004; +#[cfg(not(target_os = "macos"))] +pub const UF_OPAQUE: u32 = 0x00000008; +#[cfg(not(target_os = "macos"))] +pub const UF_COMPRESSED: u32 = 0x00000020; +#[cfg(not(target_os = "macos"))] +pub const UF_HIDDEN: u32 = 0x00008000; +#[cfg(not(target_os = "macos"))] +pub const SF_ARCHIVED: u32 = 0x00010000; +#[cfg(not(target_os = "macos"))] +pub const SF_IMMUTABLE: u32 = 0x00020000; +#[cfg(not(target_os = "macos"))] +pub const SF_APPEND: u32 = 0x00040000; + +/// Solaris door/port and BSD whiteout. `_stat` publishes 0 where the +/// platform has no such file type. +pub const S_IFDOOR: u32 = 0; +pub const S_IFPORT: u32 = 0; +pub const S_IFWHT: u32 = if cfg!(target_os = "macos") { + 0o160000 +} else { + 0 +}; + #[cfg(not(any(unix, windows, target_os = "wasi")))] pub fn rename( from: impl AsRef, diff --git a/crates/host_env/src/socket.rs b/crates/host_env/src/socket.rs index 3c87b1851..dd9b47a2c 100644 --- a/crates/host_env/src/socket.rs +++ b/crates/host_env/src/socket.rs @@ -181,6 +181,88 @@ pub const CAN_BCM_RX_RTR_FRAME: i32 = 0x0400; #[cfg(target_os = "linux")] pub const CAN_BCM_CAN_FD_FRAME: i32 = 0x0800; +/// `linux/vm_sockets.h`. libc does not bind the vsock sockopt / cid names. +#[cfg(any(target_os = "android", target_os = "fuchsia", target_os = "linux"))] +pub const SO_VM_SOCKETS_BUFFER_SIZE: u32 = 0; +#[cfg(any(target_os = "android", target_os = "fuchsia", target_os = "linux"))] +pub const SO_VM_SOCKETS_BUFFER_MIN_SIZE: u32 = 1; +#[cfg(any(target_os = "android", target_os = "fuchsia", target_os = "linux"))] +pub const SO_VM_SOCKETS_BUFFER_MAX_SIZE: u32 = 2; +#[cfg(any(target_os = "android", target_os = "fuchsia", target_os = "linux"))] +pub const VMADDR_CID_ANY: u32 = 0xffff_ffff; +#[cfg(any(target_os = "android", target_os = "fuchsia", target_os = "linux"))] +pub const VMADDR_PORT_ANY: u32 = 0xffff_ffff; +#[cfg(any(target_os = "android", target_os = "fuchsia", target_os = "linux"))] +pub const VMADDR_CID_HOST: u32 = 2; +#[cfg(any(target_os = "android", target_os = "fuchsia", target_os = "linux"))] +pub const VM_SOCKETS_INVALID_VERSION: u32 = 0xffff_ffff; + +/// `netinet/udplite.h`. libc does not bind the coverage sockopts. +#[cfg(any( + target_os = "android", + target_os = "fuchsia", + target_os = "freebsd", + target_os = "linux" +))] +pub const UDPLITE_SEND_CSCOV: i32 = 10; +#[cfg(any( + target_os = "android", + target_os = "fuchsia", + target_os = "freebsd", + target_os = "linux" +))] +pub const UDPLITE_RECV_CSCOV: i32 = 11; + +/// `SOL_IP` / `SOL_UDP` when libc does not bind them. Linux takes the +/// header names; Windows takes WinSock `SOL_IP`. Elsewhere they are the +/// IANA protocol numbers. +#[cfg(not(any( + target_os = "android", + target_os = "fuchsia", + target_os = "linux", + windows +)))] +pub const SOL_IP: i32 = 0; +#[cfg(not(any( + target_os = "android", + target_os = "fuchsia", + target_os = "linux", + windows +)))] +pub const SOL_UDP: i32 = 17; + +/// `SOMAXCONN` when neither libc nor WinSock publishes it. +#[cfg(not(any( + target_os = "android", + target_os = "dragonfly", + target_os = "freebsd", + target_os = "fuchsia", + target_os = "linux", + target_os = "netbsd", + target_os = "openbsd", + target_vendor = "apple", + windows +)))] +pub const SOMAXCONN: i32 = 5; + +/// Bluetooth wildcard / local addresses. Header strings, not libc names. +#[cfg(any( + target_os = "android", + target_os = "freebsd", + target_os = "fuchsia", + target_os = "linux", + target_os = "openbsd" +))] +pub const BDADDR_ANY: &str = "00:00:00:00:00:00"; +#[cfg(any( + target_os = "android", + target_os = "freebsd", + target_os = "fuchsia", + target_os = "linux", + target_os = "openbsd" +))] +pub const BDADDR_LOCAL: &str = "00:00:00:FF:FF:FF"; + /// RFC 3542 IPv6 socket options (`netinet6/in6.h`). Not in libc. #[cfg(target_vendor = "apple")] pub const IPV6_RECVHOPLIMIT: i32 = 37; diff --git a/crates/host_env/src/socket_wasm.rs b/crates/host_env/src/socket_wasm.rs new file mode 100644 index 000000000..05c784322 --- /dev/null +++ b/crates/host_env/src/socket_wasm.rs @@ -0,0 +1,57 @@ +//! Socket constant surface for `wasm32-unknown-unknown` and WASI. +//! +//! There are no BSD sockets on unknown-unknown, and WASI does not use the +//! unix/windows socket engine yet. The numbers are the Linux ABI +//! `Lib/socket.py` expects so the stdlib can import. + +pub const AF_UNSPEC: i32 = 0; +pub const AF_UNIX: i32 = 1; +pub const AF_INET: i32 = 2; +pub const AF_INET6: i32 = 10; + +pub const SOCK_STREAM: i32 = 1; +pub const SOCK_DGRAM: i32 = 2; +pub const SOCK_RAW: i32 = 3; + +pub const SOL_SOCKET: i32 = 1; +pub const SO_REUSEADDR: i32 = 2; +pub const SO_TYPE: i32 = 3; +pub const SO_ERROR: i32 = 4; +pub const SO_BROADCAST: i32 = 6; +pub const SO_KEEPALIVE: i32 = 9; +pub const SO_RCVBUF: i32 = 8; +pub const SO_SNDBUF: i32 = 7; + +pub const IPPROTO_IP: i32 = 0; +pub const IPPROTO_TCP: i32 = 6; +pub const IPPROTO_UDP: i32 = 17; +pub const IPPROTO_IPV6: i32 = 41; +pub const SOL_TCP: i32 = IPPROTO_TCP; + +pub const SHUT_RD: i32 = 0; +pub const SHUT_WR: i32 = 1; +pub const SHUT_RDWR: i32 = 2; + +pub const MSG_OOB: i32 = 1; +pub const MSG_PEEK: i32 = 2; +pub const MSG_DONTROUTE: i32 = 4; + +pub const AI_PASSIVE: i32 = 1; +pub const AI_CANONNAME: i32 = 2; +pub const AI_NUMERICHOST: i32 = 4; +pub const AI_NUMERICSERV: i32 = 8; +pub const AI_ADDRCONFIG: i32 = 32; + +pub const NI_NUMERICHOST: i32 = 1; +pub const NI_NUMERICSERV: i32 = 2; +pub const NI_NOFQDN: i32 = 4; +pub const NI_NAMEREQD: i32 = 8; +pub const NI_DGRAM: i32 = 16; + +pub const INADDR_ANY: u32 = 0; +pub const INADDR_LOOPBACK: u32 = 0x7f00_0001; +pub const INADDR_BROADCAST: u32 = 0xffff_ffff; +pub const INADDR_NONE: u32 = 0xffff_ffff; +pub const IPPORT_RESERVED: i32 = 1024; +pub const IPPORT_USERRESERVED: i32 = 5000; +pub const TCP_NODELAY: i32 = 1; diff --git a/crates/stdlib/src/lib.rs b/crates/stdlib/src/lib.rs index 68dcf0b69..070685d0c 100644 --- a/crates/stdlib/src/lib.rs +++ b/crates/stdlib/src/lib.rs @@ -65,10 +65,13 @@ mod suggestions; // TODO: maybe make this an extension module, if we ever get those // mod re; -#[cfg(all(feature = "host_env", not(target_arch = "wasm32")))] +#[cfg(all( + feature = "host_env", + not(any(all(target_arch = "wasm32", target_os = "unknown"), target_os = "wasi")) +))] pub mod socket; -#[cfg(target_arch = "wasm32")] +#[cfg(any(all(target_arch = "wasm32", target_os = "unknown"), target_os = "wasi"))] #[path = "socket_wasm.rs"] pub mod socket; @@ -267,9 +270,12 @@ pub fn stdlib_module_defs(ctx: &Context) -> Vec<&'static builtins::PyModuleDef> sha256::module_def(ctx), sha3::module_def(ctx), sha512::module_def(ctx), - #[cfg(all(feature = "host_env", not(target_arch = "wasm32")))] + #[cfg(all( + feature = "host_env", + not(any(all(target_arch = "wasm32", target_os = "unknown"), target_os = "wasi")) + ))] socket::module_def(ctx), - #[cfg(target_arch = "wasm32")] + #[cfg(any(all(target_arch = "wasm32", target_os = "unknown"), target_os = "wasi"))] socket::module_def(ctx), #[cfg(all( feature = "sqlite", diff --git a/crates/stdlib/src/openssl.rs b/crates/stdlib/src/openssl.rs index 8c3f5f9c7..026c99f19 100644 --- a/crates/stdlib/src/openssl.rs +++ b/crates/stdlib/src/openssl.rs @@ -136,62 +136,27 @@ mod _ssl { X509_V_FLAG_X509_STRICT as VERIFY_X509_STRICT, }; - // SSL Alert Descriptions (RFC 5246 and extensions) - // Hybrid approach: use openssl_sys constants where available, hardcode others #[pyattr] - const ALERT_DESCRIPTION_CLOSE_NOTIFY: core::ffi::c_int = 0; - #[pyattr] - const ALERT_DESCRIPTION_UNEXPECTED_MESSAGE: core::ffi::c_int = 10; - #[pyattr] - const ALERT_DESCRIPTION_BAD_RECORD_MAC: core::ffi::c_int = 20; - #[pyattr] - const ALERT_DESCRIPTION_RECORD_OVERFLOW: core::ffi::c_int = 22; - #[pyattr] - const ALERT_DESCRIPTION_DECOMPRESSION_FAILURE: core::ffi::c_int = 30; - #[pyattr] - const ALERT_DESCRIPTION_HANDSHAKE_FAILURE: core::ffi::c_int = 40; - #[pyattr] - const ALERT_DESCRIPTION_BAD_CERTIFICATE: core::ffi::c_int = 42; - #[pyattr] - const ALERT_DESCRIPTION_UNSUPPORTED_CERTIFICATE: core::ffi::c_int = 43; - #[pyattr] - const ALERT_DESCRIPTION_CERTIFICATE_REVOKED: core::ffi::c_int = 44; - #[pyattr] - const ALERT_DESCRIPTION_CERTIFICATE_EXPIRED: core::ffi::c_int = 45; - #[pyattr] - const ALERT_DESCRIPTION_CERTIFICATE_UNKNOWN: core::ffi::c_int = 46; - #[pyattr] - const ALERT_DESCRIPTION_ILLEGAL_PARAMETER: core::ffi::c_int = SSL_AD_ILLEGAL_PARAMETER; - #[pyattr] - const ALERT_DESCRIPTION_UNKNOWN_CA: core::ffi::c_int = 48; - #[pyattr] - const ALERT_DESCRIPTION_ACCESS_DENIED: core::ffi::c_int = 49; - #[pyattr] - const ALERT_DESCRIPTION_DECODE_ERROR: core::ffi::c_int = SSL_AD_DECODE_ERROR; - #[pyattr] - const ALERT_DESCRIPTION_DECRYPT_ERROR: core::ffi::c_int = 51; - #[pyattr] - const ALERT_DESCRIPTION_PROTOCOL_VERSION: core::ffi::c_int = 70; - #[pyattr] - const ALERT_DESCRIPTION_INSUFFICIENT_SECURITY: core::ffi::c_int = 71; - #[pyattr] - const ALERT_DESCRIPTION_INTERNAL_ERROR: core::ffi::c_int = 80; - #[pyattr] - const ALERT_DESCRIPTION_USER_CANCELLED: core::ffi::c_int = 90; - #[pyattr] - const ALERT_DESCRIPTION_NO_RENEGOTIATION: core::ffi::c_int = 100; - #[pyattr] - const ALERT_DESCRIPTION_UNSUPPORTED_EXTENSION: core::ffi::c_int = 110; - #[pyattr] - const ALERT_DESCRIPTION_CERTIFICATE_UNOBTAINABLE: core::ffi::c_int = 111; - #[pyattr] - const ALERT_DESCRIPTION_UNRECOGNIZED_NAME: core::ffi::c_int = SSL_AD_UNRECOGNIZED_NAME; - #[pyattr] - const ALERT_DESCRIPTION_BAD_CERTIFICATE_STATUS_RESPONSE: core::ffi::c_int = 113; - #[pyattr] - const ALERT_DESCRIPTION_BAD_CERTIFICATE_HASH_VALUE: core::ffi::c_int = 114; - #[pyattr] - const ALERT_DESCRIPTION_UNKNOWN_PSK_IDENTITY: core::ffi::c_int = 115; + use rustpython_host_env::ssl::{ + ALERT_DESCRIPTION_ACCESS_DENIED, ALERT_DESCRIPTION_BAD_CERTIFICATE, + ALERT_DESCRIPTION_BAD_CERTIFICATE_HASH_VALUE, + ALERT_DESCRIPTION_BAD_CERTIFICATE_STATUS_RESPONSE, ALERT_DESCRIPTION_BAD_RECORD_MAC, + ALERT_DESCRIPTION_CERTIFICATE_EXPIRED, ALERT_DESCRIPTION_CERTIFICATE_REQUIRED, + ALERT_DESCRIPTION_CERTIFICATE_REVOKED, ALERT_DESCRIPTION_CERTIFICATE_UNKNOWN, + ALERT_DESCRIPTION_CERTIFICATE_UNOBTAINABLE, ALERT_DESCRIPTION_CLOSE_NOTIFY, + ALERT_DESCRIPTION_DECODE_ERROR, ALERT_DESCRIPTION_DECOMPRESSION_FAILURE, + ALERT_DESCRIPTION_DECRYPT_ERROR, ALERT_DESCRIPTION_DECRYPTION_FAILED, + ALERT_DESCRIPTION_EXPORT_RESTRICTION, ALERT_DESCRIPTION_HANDSHAKE_FAILURE, + ALERT_DESCRIPTION_ILLEGAL_PARAMETER, ALERT_DESCRIPTION_INAPPROPRIATE_FALLBACK, + ALERT_DESCRIPTION_INSUFFICIENT_SECURITY, ALERT_DESCRIPTION_INTERNAL_ERROR, + ALERT_DESCRIPTION_MISSING_EXTENSION, ALERT_DESCRIPTION_NO_APPLICATION_PROTOCOL, + ALERT_DESCRIPTION_NO_CERTIFICATE, ALERT_DESCRIPTION_NO_RENEGOTIATION, + ALERT_DESCRIPTION_PROTOCOL_VERSION, ALERT_DESCRIPTION_RECORD_OVERFLOW, + ALERT_DESCRIPTION_UNEXPECTED_MESSAGE, ALERT_DESCRIPTION_UNKNOWN_CA, + ALERT_DESCRIPTION_UNKNOWN_PSK_IDENTITY, ALERT_DESCRIPTION_UNRECOGNIZED_NAME, + ALERT_DESCRIPTION_UNSUPPORTED_CERTIFICATE, ALERT_DESCRIPTION_UNSUPPORTED_EXTENSION, + ALERT_DESCRIPTION_USER_CANCELLED, + }; // CRL verification constants #[pyattr] diff --git a/crates/stdlib/src/socket.rs b/crates/stdlib/src/socket.rs index 26f6e96ad..e4bd8d501 100644 --- a/crates/stdlib/src/socket.rs +++ b/crates/stdlib/src/socket.rs @@ -262,40 +262,12 @@ mod _socket { TCP_SYNCNT, TCP_WINDOW_CLAMP, }; - // gated on presence of AF_VSOCK: #[cfg(any(target_os = "android", target_os = "fuchsia", target_os = "linux"))] #[pyattr] - const SO_VM_SOCKETS_BUFFER_SIZE: u32 = 0; - - // gated on presence of AF_VSOCK: - #[cfg(any(target_os = "android", target_os = "fuchsia", target_os = "linux"))] - #[pyattr] - const SO_VM_SOCKETS_BUFFER_MIN_SIZE: u32 = 1; - - // gated on presence of AF_VSOCK: - #[cfg(any(target_os = "android", target_os = "fuchsia", target_os = "linux"))] - #[pyattr] - const SO_VM_SOCKETS_BUFFER_MAX_SIZE: u32 = 2; - - // gated on presence of AF_VSOCK: - #[cfg(any(target_os = "android", target_os = "fuchsia", target_os = "linux"))] - #[pyattr] - const VMADDR_CID_ANY: u32 = 0xffffffff; // 0xffffffff - - // gated on presence of AF_VSOCK: - #[cfg(any(target_os = "android", target_os = "fuchsia", target_os = "linux"))] - #[pyattr] - const VMADDR_PORT_ANY: u32 = 0xffffffff; // 0xffffffff - - // gated on presence of AF_VSOCK: - #[cfg(any(target_os = "android", target_os = "fuchsia", target_os = "linux"))] - #[pyattr] - const VMADDR_CID_HOST: u32 = 2; - - // gated on presence of AF_VSOCK: - #[cfg(any(target_os = "android", target_os = "fuchsia", target_os = "linux"))] - #[pyattr] - const VM_SOCKETS_INVALID_VERSION: u32 = 0xffffffff; // 0xffffffff + use host_socket::{ + SO_VM_SOCKETS_BUFFER_MAX_SIZE, SO_VM_SOCKETS_BUFFER_MIN_SIZE, SO_VM_SOCKETS_BUFFER_SIZE, + VM_SOCKETS_INVALID_VERSION, VMADDR_CID_ANY, VMADDR_CID_HOST, VMADDR_PORT_ANY, + }; // TODO: gated on https://github.com/rust-lang/libc/pull/1662 // // gated on presence of AF_VSOCK: @@ -307,11 +279,7 @@ mod _socket { #[cfg(not(any(target_os = "android", target_os = "fuchsia", target_os = "linux")))] #[pyattr] - const SOL_IP: i32 = 0; - - #[cfg(not(any(target_os = "android", target_os = "fuchsia", target_os = "linux")))] - #[pyattr] - const SOL_UDP: i32 = 17; + use host_socket::{SOL_IP, SOL_UDP}; #[cfg(any(target_os = "android", target_os = "linux", windows))] #[pyattr] @@ -345,16 +313,7 @@ mod _socket { target_os = "linux" ))] #[pyattr] - const UDPLITE_SEND_CSCOV: i32 = 10; - - #[cfg(any( - target_os = "android", - target_os = "fuchsia", - target_os = "freebsd", - target_os = "linux" - ))] - #[pyattr] - const UDPLITE_RECV_CSCOV: i32 = 11; + use host_socket::{UDPLITE_RECV_CSCOV, UDPLITE_SEND_CSCOV}; #[cfg(any( target_os = "android", @@ -693,7 +652,7 @@ mod _socket { windows )))] #[pyattr] - const SOMAXCONN: i32 = 5; // Common value + use host_socket::SOMAXCONN; // HERE IS WHERE THE BLUETOOTH CONSTANTS START // TODO: there should be a more intelligent way of detecting bluetooth on a platform. @@ -716,16 +675,7 @@ mod _socket { target_os = "openbsd" ))] #[pyattr] - const BDADDR_ANY: &str = "00:00:00:00:00:00"; - #[cfg(any( - target_os = "android", - target_os = "freebsd", - target_os = "fuchsia", - target_os = "linux", - target_os = "openbsd" - ))] - #[pyattr] - const BDADDR_LOCAL: &str = "00:00:00:FF:FF:FF"; + use host_socket::{BDADDR_ANY, BDADDR_LOCAL}; // HERE IS WHERE THE BLUETOOTH CONSTANTS END #[cfg(windows)] diff --git a/crates/stdlib/src/socket_wasm.rs b/crates/stdlib/src/socket_wasm.rs index df9bc75f9..085785965 100644 --- a/crates/stdlib/src/socket_wasm.rs +++ b/crates/stdlib/src/socket_wasm.rs @@ -20,99 +20,15 @@ mod _socket { use std::sync::atomic::{AtomicI32, AtomicU64, Ordering}; #[pyattr] - const AF_UNSPEC: i32 = 0; - #[pyattr] - const AF_UNIX: i32 = 1; - #[pyattr] - const AF_INET: i32 = 2; - #[pyattr] - const AF_INET6: i32 = 10; - - #[pyattr] - const SOCK_STREAM: i32 = 1; - #[pyattr] - const SOCK_DGRAM: i32 = 2; - #[pyattr] - const SOCK_RAW: i32 = 3; - - #[pyattr] - const SOL_SOCKET: i32 = 1; - #[pyattr] - const SO_REUSEADDR: i32 = 2; - #[pyattr] - const SO_TYPE: i32 = 3; - #[pyattr] - const SO_ERROR: i32 = 4; - #[pyattr] - const SO_BROADCAST: i32 = 6; - #[pyattr] - const SO_KEEPALIVE: i32 = 9; - #[pyattr] - const SO_RCVBUF: i32 = 8; - #[pyattr] - const SO_SNDBUF: i32 = 7; - - #[pyattr] - const IPPROTO_IP: i32 = 0; - #[pyattr] - const IPPROTO_TCP: i32 = 6; - #[pyattr] - const IPPROTO_UDP: i32 = 17; - #[pyattr] - const IPPROTO_IPV6: i32 = 41; - #[pyattr] - const SOL_TCP: i32 = IPPROTO_TCP; - - #[pyattr] - const SHUT_RD: i32 = 0; - #[pyattr] - const SHUT_WR: i32 = 1; - #[pyattr] - const SHUT_RDWR: i32 = 2; - - #[pyattr] - const MSG_OOB: i32 = 1; - #[pyattr] - const MSG_PEEK: i32 = 2; - #[pyattr] - const MSG_DONTROUTE: i32 = 4; - - #[pyattr] - const AI_PASSIVE: i32 = 1; - #[pyattr] - const AI_CANONNAME: i32 = 2; - #[pyattr] - const AI_NUMERICHOST: i32 = 4; - #[pyattr] - const AI_NUMERICSERV: i32 = 8; - #[pyattr] - const AI_ADDRCONFIG: i32 = 32; - - #[pyattr] - const NI_NUMERICHOST: i32 = 1; - #[pyattr] - const NI_NUMERICSERV: i32 = 2; - #[pyattr] - const NI_NOFQDN: i32 = 4; - #[pyattr] - const NI_NAMEREQD: i32 = 8; - #[pyattr] - const NI_DGRAM: i32 = 16; - - #[pyattr] - const INADDR_ANY: u32 = 0; - #[pyattr] - const INADDR_LOOPBACK: u32 = 0x7f00_0001; - #[pyattr] - const INADDR_BROADCAST: u32 = 0xffff_ffff; - #[pyattr] - const INADDR_NONE: u32 = 0xffff_ffff; - #[pyattr] - const IPPORT_RESERVED: i32 = 1024; - #[pyattr] - const IPPORT_USERRESERVED: i32 = 5000; - #[pyattr] - const TCP_NODELAY: i32 = 1; + use rustpython_host_env::socket::{ + AF_INET, AF_INET6, AF_UNIX, AF_UNSPEC, AI_ADDRCONFIG, AI_CANONNAME, AI_NUMERICHOST, + AI_NUMERICSERV, AI_PASSIVE, INADDR_ANY, INADDR_BROADCAST, INADDR_LOOPBACK, INADDR_NONE, + IPPORT_RESERVED, IPPORT_USERRESERVED, IPPROTO_IP, IPPROTO_IPV6, IPPROTO_TCP, IPPROTO_UDP, + MSG_DONTROUTE, MSG_OOB, MSG_PEEK, NI_DGRAM, NI_NAMEREQD, NI_NOFQDN, NI_NUMERICHOST, + NI_NUMERICSERV, SHUT_RD, SHUT_RDWR, SHUT_WR, SO_BROADCAST, SO_ERROR, SO_KEEPALIVE, + SO_RCVBUF, SO_REUSEADDR, SO_SNDBUF, SO_TYPE, SOCK_DGRAM, SOCK_RAW, SOCK_STREAM, SOL_SOCKET, + SOL_TCP, TCP_NODELAY, + }; #[pyattr(name = "has_ipv6")] const HAS_IPV6: bool = true; diff --git a/crates/vm/src/stdlib/_io.rs b/crates/vm/src/stdlib/_io.rs index 5abf2cdaa..6195f501d 100644 --- a/crates/vm/src/stdlib/_io.rs +++ b/crates/vm/src/stdlib/_io.rs @@ -15,7 +15,7 @@ cfg_select! { _ => { type Offset = i64; // EAGAIN constant for BlockingIOError - const EAGAIN: i32 = 11; // Standard POSIX value + const EAGAIN: i32 = rustpython_host_env::errno::errors::EAGAIN; } } diff --git a/crates/vm/src/stdlib/_stat.rs b/crates/vm/src/stdlib/_stat.rs index f105aad94..b8533555b 100644 --- a/crates/vm/src/stdlib/_stat.rs +++ b/crates/vm/src/stdlib/_stat.rs @@ -84,20 +84,13 @@ mod _stat { ); #[pyattr] - pub const S_IFDOOR: Mode = 0; // TODO: RUSTPYTHON Support Solaris + pub const S_IFDOOR: Mode = rustpython_host_env::os::S_IFDOOR as Mode; #[pyattr] - pub const S_IFPORT: Mode = 0; // TODO: RUSTPYTHON Support Solaris - - // TODO: RUSTPYTHON Support BSD - // https://man.freebsd.org/cgi/man.cgi?stat(2) + pub const S_IFPORT: Mode = rustpython_host_env::os::S_IFPORT as Mode; #[pyattr] - pub const S_IFWHT: Mode = if cfg!(target_os = "macos") { - 0o160000 - } else { - 0 - }; + pub const S_IFWHT: Mode = rustpython_host_env::os::S_IFWHT as Mode; // Permission bits @@ -255,73 +248,11 @@ mod _stat { // Unix file flags (if on Unix) - #[pyattr] - pub const UF_NODUMP: u32 = libc_const!( - #[cfg(target_os = "macos")] - UF_NODUMP, - 0x00000001 - ); - - #[pyattr] - pub const UF_IMMUTABLE: u32 = libc_const!( - #[cfg(target_os = "macos")] - UF_IMMUTABLE, - 0x00000002 - ); - - #[pyattr] - pub const UF_APPEND: u32 = libc_const!( - #[cfg(target_os = "macos")] - UF_APPEND, - 0x00000004 - ); - - #[pyattr] - pub const UF_OPAQUE: u32 = libc_const!( - #[cfg(target_os = "macos")] - UF_OPAQUE, - 0x00000008 - ); - - #[pyattr] - pub const UF_COMPRESSED: u32 = libc_const!( - #[cfg(target_os = "macos")] - UF_COMPRESSED, - 0x00000020 - ); - - #[pyattr] - pub const UF_HIDDEN: u32 = libc_const!( - #[cfg(target_os = "macos")] - UF_HIDDEN, - 0x00008000 - ); - - #[pyattr] - pub const SF_ARCHIVED: u32 = libc_const!( - #[cfg(target_os = "macos")] - SF_ARCHIVED, - 0x00010000 - ); - - #[pyattr] - pub const SF_IMMUTABLE: u32 = libc_const!( - #[cfg(target_os = "macos")] - SF_IMMUTABLE, - 0x00020000 - ); - - #[pyattr] - pub const SF_APPEND: u32 = libc_const!( - #[cfg(target_os = "macos")] - SF_APPEND, - 0x00040000 - ); - #[pyattr] pub use rustpython_host_env::os::{ - SF_DATALESS, SF_FIRMLINK, SF_NOUNLINK, SF_SETTABLE, SF_SNAPSHOT, UF_DATAVAULT, UF_NOUNLINK, - UF_SETTABLE, UF_TRACKED, + SF_APPEND, SF_ARCHIVED, SF_DATALESS, SF_FIRMLINK, SF_IMMUTABLE, SF_NOUNLINK, SF_SETTABLE, + SF_SNAPSHOT, UF_APPEND, UF_COMPRESSED, UF_DATAVAULT, UF_HIDDEN, UF_IMMUTABLE, UF_NODUMP, + UF_NOUNLINK, UF_OPAQUE, UF_SETTABLE, UF_TRACKED, }; #[cfg(target_os = "macos")] diff --git a/crates/vm/src/stdlib/errno.rs b/crates/vm/src/stdlib/errno.rs index 8327a3a98..0921ebac6 100644 --- a/crates/vm/src/stdlib/errno.rs +++ b/crates/vm/src/stdlib/errno.rs @@ -23,15 +23,8 @@ mod errno_mod { } } -#[cfg(any(unix, windows, target_os = "wasi"))] pub use rustpython_host_env::errno::errors; -#[cfg(all(target_arch = "wasm32", not(target_os = "wasi")))] -pub mod errors { - pub const ECONNABORTED: i32 = 103; - pub const ECONNRESET: i32 = 104; -} - #[cfg(any(unix, windows, target_os = "wasi"))] macro_rules! e { ($name:ident) => {