diff --git a/libc-test/build.rs b/libc-test/build.rs index 4288084675141..7d4e9c0f469d5 100644 --- a/libc-test/build.rs +++ b/libc-test/build.rs @@ -296,6 +296,9 @@ fn test_apple(target: &str) { } cfg.skip_struct(move |ty| { + if ty.starts_with("__c_anonymous_") { + return true; + } match ty { // FIXME: actually a union "sigval" => true, diff --git a/src/unix/mod.rs b/src/unix/mod.rs index 826b835182a82..69ecd202c4892 100644 --- a/src/unix/mod.rs +++ b/src/unix/mod.rs @@ -25,7 +25,7 @@ pub type ssize_t = isize; pub type pid_t = i32; pub type in_addr_t = u32; pub type in_port_t = u16; -pub type sighandler_t = ::size_t; +pub type sighandler_t = __c_anonymous_sigaction_handler; pub type cc_t = ::c_uchar; cfg_if! { @@ -51,6 +51,18 @@ impl ::Clone for DIR { } pub type locale_t = *mut ::c_void; +s_no_extra_traits! { + pub union __c_anonymous_sigaction_handler { + pub sa_handler: Option ()>, + pub sa_sigaction: Option ()>, + pub default: size_t, + } +} + s! { pub struct group { pub gr_name: *mut ::c_char, @@ -206,12 +218,36 @@ s! { } } +cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for __c_anonymous_sigaction_handler { + fn eq(&self, other: &__c_anonymous_sigaction_handler) -> bool { + unsafe { self.default == other.default } + } + } + impl Eq for __c_anonymous_sigaction_handler {} + impl ::fmt::Debug for __c_anonymous_sigaction_handler { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sigaction_t") + .field("value", unsafe { &self.default } ) + .finish() + } + } + impl ::hash::Hash for __c_anonymous_sigaction_handler { + fn hash(&self, state: &mut H) { + unsafe { self.default.hash(state) }; + } + } + } +} + pub const INT_MIN: c_int = -2147483648; pub const INT_MAX: c_int = 2147483647; -pub const SIG_DFL: sighandler_t = 0 as sighandler_t; -pub const SIG_IGN: sighandler_t = 1 as sighandler_t; -pub const SIG_ERR: sighandler_t = !0 as sighandler_t; +pub const SIG_DFL: sighandler_t = sighandler_t { default: 0 }; +pub const SIG_IGN: sighandler_t = sighandler_t { default: 1 }; +pub const SIG_ERR: sighandler_t = sighandler_t { default: !0 }; + cfg_if! { if #[cfg(not(target_os = "nto"))] { pub const DT_UNKNOWN: u8 = 0; @@ -224,6 +260,7 @@ cfg_if! { pub const DT_SOCK: u8 = 12; } } + cfg_if! { if #[cfg(not(target_os = "redox"))] { pub const FD_CLOEXEC: ::c_int = 0x1;