From b9c8323b171cdba65857c4c4ad79d0047dcf6047 Mon Sep 17 00:00:00 2001 From: Aphek Date: Sun, 25 Jun 2023 19:18:05 -0300 Subject: [PATCH 1/2] Add missing and fix PS Vita definitions Combination of 10 commits: * Add missing PS Vita definitions, fix some unused ones * Fix cfg's target_os * Move conflicting EAI_* definitions back to vita-specific file * Remove out-of-order pub uses * Added padding to dirent and fixed clockid_t * Use repr(align()) instead of zero field * Fixed sockaddr structs * Fixup * socketpair is not available on vita * Lint Co-authored-by: Nikolay Arhipov --- src/unix/mod.rs | 30 ++++++++++------ src/unix/newlib/dirent.rs | 7 ++++ src/unix/newlib/mod.rs | 70 +++++++++++++++++++++++-------------- src/unix/newlib/vita/mod.rs | 35 +++++++++++++++++-- 4 files changed, 102 insertions(+), 40 deletions(-) create mode 100644 src/unix/newlib/dirent.rs diff --git a/src/unix/mod.rs b/src/unix/mod.rs index 088e4fd30abb7..5126940146d6a 100644 --- a/src/unix/mod.rs +++ b/src/unix/mod.rs @@ -678,17 +678,6 @@ extern "C" { value: *const ::c_void, option_len: socklen_t, ) -> ::c_int; - #[cfg_attr( - all(target_os = "macos", target_arch = "x86"), - link_name = "socketpair$UNIX2003" - )] - #[cfg_attr(target_os = "illumos", link_name = "__xnet_socketpair")] - pub fn socketpair( - domain: ::c_int, - type_: ::c_int, - protocol: ::c_int, - socket_vector: *mut ::c_int, - ) -> ::c_int; #[cfg(not(all( libc_cfg_target_vendor, target_arch = "powerpc", @@ -1412,6 +1401,25 @@ extern "C" { pub fn lockf(fd: ::c_int, cmd: ::c_int, len: ::off_t) -> ::c_int; } + +cfg_if! { + if #[cfg(not(target_os = "vita"))] { + extern "C" { + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "socketpair$UNIX2003" + )] + #[cfg_attr(target_os = "illumos", link_name = "__xnet_socketpair")] + pub fn socketpair( + domain: ::c_int, + type_: ::c_int, + protocol: ::c_int, + socket_vector: *mut ::c_int, + ) -> ::c_int; + } + } +} + cfg_if! { if #[cfg(not(any(target_os = "emscripten", target_os = "android", diff --git a/src/unix/newlib/dirent.rs b/src/unix/newlib/dirent.rs new file mode 100644 index 0000000000000..664ca066e8947 --- /dev/null +++ b/src/unix/newlib/dirent.rs @@ -0,0 +1,7 @@ +s! { + pub struct dirent { + pub d_ino: ::ino_t, + pub d_type: ::c_uchar, + pub d_name: [::c_char; 256usize], + } +} diff --git a/src/unix/newlib/mod.rs b/src/unix/newlib/mod.rs index ce84f1421f0ea..faa87659b6030 100644 --- a/src/unix/newlib/mod.rs +++ b/src/unix/newlib/mod.rs @@ -1,13 +1,7 @@ pub type blkcnt_t = i32; pub type blksize_t = i32; -cfg_if! { - if #[cfg(target_os = "vita")] { - pub type clockid_t = ::c_uint; - } else { - pub type clockid_t = ::c_ulong; - } -} +pub type clockid_t = ::c_ulong; cfg_if! { if #[cfg(any(target_os = "espidf"))] { @@ -170,16 +164,6 @@ s! { pub sa_flags: ::c_int, } - pub struct dirent { - #[cfg(not(target_os = "vita"))] - pub d_ino: ino_t, - #[cfg(not(target_os = "vita"))] - pub d_type: ::c_uchar, - #[cfg(target_os = "vita")] - __offset: [u8; 88], - pub d_name: [::c_char; 256usize], - } - pub struct stack_t { pub ss_sp: *mut ::c_void, pub ss_flags: ::c_int, @@ -546,8 +530,16 @@ pub const IFF_LINK2: ::c_int = 0x4000; // per link layer defined bit pub const IFF_ALTPHYS: ::c_int = IFF_LINK2; // use alternate physical connection pub const IFF_MULTICAST: ::c_int = 0x8000; // supports multicast -pub const TCP_NODELAY: ::c_int = 8193; -pub const TCP_MAXSEG: ::c_int = 8194; +cfg_if! { + if #[cfg(target_os = "vita")] { + pub const TCP_NODELAY: ::c_int = 1; + pub const TCP_MAXSEG: ::c_int = 2; + } else { + pub const TCP_NODELAY: ::c_int = 8193; + pub const TCP_MAXSEG: ::c_int = 8194; + } +} + pub const TCP_NOPUSH: ::c_int = 4; pub const TCP_NOOPT: ::c_int = 8; pub const TCP_KEEPIDLE: ::c_int = 256; @@ -561,13 +553,25 @@ cfg_if! { pub const IP_TOS: ::c_int = 3; } } -pub const IP_TTL: ::c_int = 8; +cfg_if! { + if #[cfg(target_os = "vita")] { + pub const IP_TTL: ::c_int = 4; + } else { + pub const IP_TTL: ::c_int = 8; + } +} pub const IP_MULTICAST_IF: ::c_int = 9; pub const IP_MULTICAST_TTL: ::c_int = 10; pub const IP_MULTICAST_LOOP: ::c_int = 11; -pub const IP_ADD_MEMBERSHIP: ::c_int = 11; -pub const IP_DROP_MEMBERSHIP: ::c_int = 12; - +cfg_if! { + if #[cfg(target_os = "vita")] { + pub const IP_ADD_MEMBERSHIP: ::c_int = 12; + pub const IP_DROP_MEMBERSHIP: ::c_int = 13; + } else { + pub const IP_ADD_MEMBERSHIP: ::c_int = 11; + pub const IP_DROP_MEMBERSHIP: ::c_int = 12; + } +} pub const IPV6_UNICAST_HOPS: ::c_int = 4; pub const IPV6_MULTICAST_IF: ::c_int = 9; pub const IPV6_MULTICAST_HOPS: ::c_int = 10; @@ -598,10 +602,15 @@ pub const NI_NAMEREQD: ::c_int = 4; pub const NI_NUMERICSERV: ::c_int = 0; pub const NI_DGRAM: ::c_int = 0; -pub const EAI_FAMILY: ::c_int = -303; -pub const EAI_MEMORY: ::c_int = -304; -pub const EAI_NONAME: ::c_int = -305; -pub const EAI_SOCKTYPE: ::c_int = -307; +cfg_if! { + // Defined in vita/mod.rs for "vita" + if #[cfg(not(target_os = "vita"))] { + pub const EAI_FAMILY: ::c_int = -303; + pub const EAI_MEMORY: ::c_int = -304; + pub const EAI_NONAME: ::c_int = -305; + pub const EAI_SOCKTYPE: ::c_int = -307; + } +} pub const EXIT_SUCCESS: ::c_int = 0; pub const EXIT_FAILURE: ::c_int = 1; @@ -777,6 +786,13 @@ cfg_if! { } } +cfg_if! { + if #[cfg(not(target_os = "vita"))] { + mod dirent; + pub use self::dirent::*; + } +} + cfg_if! { if #[cfg(libc_align)] { #[macro_use] diff --git a/src/unix/newlib/vita/mod.rs b/src/unix/newlib/vita/mod.rs index 6e2e4d3ebe89f..51d45f67c9989 100644 --- a/src/unix/newlib/vita/mod.rs +++ b/src/unix/newlib/vita/mod.rs @@ -9,6 +9,16 @@ pub type c_ulong = u32; pub type sigset_t = ::c_ulong; s! { + pub struct msghdr { + pub msg_name: *mut ::c_void, + pub msg_namelen: ::socklen_t, + pub msg_iov: *mut ::iovec, + pub msg_iovlen: ::c_int, + pub msg_control: *mut ::c_void, + pub msg_controllen: ::socklen_t, + pub msg_flags: ::c_int, + } + pub struct sockaddr { pub sa_len: u8, pub sa_family: ::sa_family_t, @@ -35,6 +45,7 @@ s! { } pub struct sockaddr_un { + pub ss_len: u8, pub sun_family: ::sa_family_t, pub sun_path: [::c_char; 108usize], } @@ -42,9 +53,9 @@ s! { pub struct sockaddr_storage { pub ss_len: u8, pub ss_family: ::sa_family_t, - pub __ss_pad1: [u8; 4], + pub __ss_pad1: [u8; 2], pub __ss_align: i64, - pub __ss_pad2: [u8; 4], + pub __ss_pad2: [u8; 116], } pub struct sched_param { @@ -67,16 +78,31 @@ s! { pub st_blocks: ::blkcnt_t, pub st_spare4: [::c_long; 2usize], } + + #[repr(align(8))] + pub struct dirent { + __offset: [u8; 88], + pub d_name: [::c_char; 256usize], + __pad: [u8; 8], + } } pub const AF_UNIX: ::c_int = 1; pub const AF_INET6: ::c_int = 24; +pub const SOCK_RAW: ::c_int = 3; +pub const SOCK_RDM: ::c_int = 4; +pub const SOCK_SEQPACKET: ::c_int = 5; + pub const FIONBIO: ::c_ulong = 1; pub const POLLIN: ::c_short = 0x0001; pub const POLLPRI: ::c_short = POLLIN; pub const POLLOUT: ::c_short = 0x0004; +pub const POLLRDNORM: ::c_short = POLLIN; +pub const POLLRDBAND: ::c_short = POLLIN; +pub const POLLWRNORM: ::c_short = POLLOUT; +pub const POLLWRBAND: ::c_short = POLLOUT; pub const POLLERR: ::c_short = 0x0008; pub const POLLHUP: ::c_short = 0x0010; pub const POLLNVAL: ::c_short = 0x0020; @@ -141,11 +167,16 @@ pub const _SC_PAGESIZE: ::c_int = 8; pub const _SC_GETPW_R_SIZE_MAX: ::c_int = 51; pub const PTHREAD_STACK_MIN: ::size_t = 32 * 1024; +pub const IP_HDRINCL: ::c_int = 2; + extern "C" { pub fn futimens(fd: ::c_int, times: *const ::timespec) -> ::c_int; pub fn writev(fd: ::c_int, iov: *const ::iovec, iovcnt: ::c_int) -> ::ssize_t; pub fn readv(fd: ::c_int, iov: *const ::iovec, iovcnt: ::c_int) -> ::ssize_t; + pub fn sendmsg(s: ::c_int, msg: *const ::msghdr, flags: ::c_int) -> ::ssize_t; + pub fn recvmsg(s: ::c_int, msg: *mut ::msghdr, flags: ::c_int) -> ::ssize_t; + pub fn pthread_create( native: *mut ::pthread_t, attr: *const ::pthread_attr_t, From 53c6b31638bc10065e9adb698ec622840459e0d3 Mon Sep 17 00:00:00 2001 From: Nikolay Arhipov Date: Sun, 24 Sep 2023 10:20:37 +0300 Subject: [PATCH 2/2] Moved dirent to generic.rs --- src/unix/newlib/aarch64/mod.rs | 2 +- src/unix/newlib/arm/mod.rs | 2 +- src/unix/newlib/dirent.rs | 7 ------- src/unix/newlib/espidf/mod.rs | 2 +- src/unix/newlib/generic.rs | 6 ++++++ src/unix/newlib/horizon/mod.rs | 2 ++ src/unix/newlib/mod.rs | 7 ------- src/unix/newlib/powerpc/mod.rs | 2 +- 8 files changed, 12 insertions(+), 18 deletions(-) delete mode 100644 src/unix/newlib/dirent.rs diff --git a/src/unix/newlib/aarch64/mod.rs b/src/unix/newlib/aarch64/mod.rs index d686b3692d86d..2b4713c9a364e 100644 --- a/src/unix/newlib/aarch64/mod.rs +++ b/src/unix/newlib/aarch64/mod.rs @@ -51,4 +51,4 @@ pub const MSG_WAITALL: ::c_int = 0; pub const MSG_MORE: ::c_int = 0; pub const MSG_NOSIGNAL: ::c_int = 0; -pub use crate::unix::newlib::generic::{sigset_t, stat}; +pub use crate::unix::newlib::generic::{dirent, sigset_t, stat}; diff --git a/src/unix/newlib/arm/mod.rs b/src/unix/newlib/arm/mod.rs index f644349cb997f..23b75977e63ec 100644 --- a/src/unix/newlib/arm/mod.rs +++ b/src/unix/newlib/arm/mod.rs @@ -53,4 +53,4 @@ pub const MSG_WAITALL: ::c_int = 0; pub const MSG_MORE: ::c_int = 0; pub const MSG_NOSIGNAL: ::c_int = 0; -pub use crate::unix::newlib::generic::{sigset_t, stat}; +pub use crate::unix::newlib::generic::{dirent, sigset_t, stat}; diff --git a/src/unix/newlib/dirent.rs b/src/unix/newlib/dirent.rs deleted file mode 100644 index 664ca066e8947..0000000000000 --- a/src/unix/newlib/dirent.rs +++ /dev/null @@ -1,7 +0,0 @@ -s! { - pub struct dirent { - pub d_ino: ::ino_t, - pub d_type: ::c_uchar, - pub d_name: [::c_char; 256usize], - } -} diff --git a/src/unix/newlib/espidf/mod.rs b/src/unix/newlib/espidf/mod.rs index 804cd66454f46..409d7ad9bd784 100644 --- a/src/unix/newlib/espidf/mod.rs +++ b/src/unix/newlib/espidf/mod.rs @@ -107,4 +107,4 @@ extern "C" { pub fn eventfd(initval: ::c_uint, flags: ::c_int) -> ::c_int; } -pub use crate::unix::newlib::generic::{sigset_t, stat}; +pub use crate::unix::newlib::generic::{dirent, sigset_t, stat}; diff --git a/src/unix/newlib/generic.rs b/src/unix/newlib/generic.rs index db7797f17c297..e45413a7a9e2c 100644 --- a/src/unix/newlib/generic.rs +++ b/src/unix/newlib/generic.rs @@ -24,4 +24,10 @@ s! { pub st_blocks: ::blkcnt_t, pub st_spare4: [::c_long; 2usize], } + + pub struct dirent { + pub d_ino: ::ino_t, + pub d_type: ::c_uchar, + pub d_name: [::c_char; 256usize], + } } diff --git a/src/unix/newlib/horizon/mod.rs b/src/unix/newlib/horizon/mod.rs index bcb93ad9df4f1..9c70f7b031b63 100644 --- a/src/unix/newlib/horizon/mod.rs +++ b/src/unix/newlib/horizon/mod.rs @@ -266,3 +266,5 @@ extern "C" { pub fn gethostid() -> ::c_long; } + +pub use crate::unix::newlib::generic::dirent; diff --git a/src/unix/newlib/mod.rs b/src/unix/newlib/mod.rs index faa87659b6030..a572cc38bfda9 100644 --- a/src/unix/newlib/mod.rs +++ b/src/unix/newlib/mod.rs @@ -786,13 +786,6 @@ cfg_if! { } } -cfg_if! { - if #[cfg(not(target_os = "vita"))] { - mod dirent; - pub use self::dirent::*; - } -} - cfg_if! { if #[cfg(libc_align)] { #[macro_use] diff --git a/src/unix/newlib/powerpc/mod.rs b/src/unix/newlib/powerpc/mod.rs index 6bed1ce27acbf..10faadbdf8c0a 100644 --- a/src/unix/newlib/powerpc/mod.rs +++ b/src/unix/newlib/powerpc/mod.rs @@ -5,7 +5,7 @@ pub type wchar_t = ::c_int; pub type c_long = i32; pub type c_ulong = u32; -pub use crate::unix::newlib::generic::{sigset_t, stat}; +pub use crate::unix::newlib::generic::{dirent, sigset_t, stat}; // the newlib shipped with devkitPPC does not support the following components: // - sockaddr