From 95b1e24db9ccfb144574b65cb22611d31ebcdd29 Mon Sep 17 00:00:00 2001 From: Baoshan Pang Date: Mon, 23 Sep 2019 10:59:16 -0700 Subject: [PATCH 1/3] use union for unions --- src/vxworks/mod.rs | 61 +++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 55 insertions(+), 6 deletions(-) diff --git a/src/vxworks/mod.rs b/src/vxworks/mod.rs index 3f9930b0..6fb79c1d 100755 --- a/src/vxworks/mod.rs +++ b/src/vxworks/mod.rs @@ -252,8 +252,9 @@ s! { } // signal.h + pub struct sigaction { - pub sa_u : ::size_t, // actually union of two function pointers + pub sa_u : ::sa_u_t, pub sa_mask : ::sigset_t, pub sa_flags : ::c_int, } @@ -269,7 +270,7 @@ s! { pub struct siginfo_t { pub si_signo : ::c_int, pub si_code : ::c_int, - pub si_value : ::size_t, // actually union of int and void * + pub si_value : ::sigval, pub si_errno : ::c_int, pub si_status: ::c_int, pub si_addr: *mut ::c_void, @@ -414,6 +415,16 @@ s_no_extra_traits! { pub __ss_pad2 : [::c_char; _SS_PAD2SIZE], } + pub union sa_u_t { + pub sa_handler : extern "C" fn(::c_int) -> !, + pub sa_sigaction: extern "C" fn(::c_int, *mut ::siginfo_t, + *mut ::c_void) -> !, + } + + pub union sigval { + pub sival_int : ::c_int, + pub sival_ptr : *mut ::c_void, + } } cfg_if! { @@ -463,6 +474,46 @@ cfg_if! { .finish() } } + + impl PartialEq for sa_u_t { + fn eq(&self, other: &sa_u_t) -> bool { + unsafe { self.sa_handler == other.sa_handler } + } + } + impl Eq for sa_u_t {} + impl ::fmt::Debug for sa_u_t { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sa_u_t") + .field("sa_handler", unsafe { &self.sa_handler }) + .field("sa_sigaction", unsafe { &self.sa_sigaction }) + .finish() + } + } + impl ::hash::Hash for sa_u_t { + fn hash(&self, state: &mut H) { + unsafe { self.sa_handler.hash(state) }; + } + } + + impl PartialEq for sigval { + fn eq(&self, other: &sigval) -> bool { + unsafe { self.sival_ptr == other.sival_ptr } + } + } + impl Eq for sigval {} + impl ::fmt::Debug for sigval { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sigval") + .field("sival_int", unsafe { &self.sival_int}) + .field("sival_ptr", unsafe { &self.sival_ptr }) + .finish() + } + } + impl ::hash::Hash for sigval { + fn hash(&self, state: &mut H) { + unsafe { self.sival_ptr.hash(state) }; + } + } } } @@ -1976,16 +2027,14 @@ extern "C" { pub fn sigqueue( __pid: pid_t, __signo: ::c_int, - __value: ::size_t, // Actual type is const union sigval value, - // which is a union of int and void * + __value: ::sigval, ) -> ::c_int; // signal.h for user pub fn _sigqueue( rtpId: ::RTP_ID, signo: ::c_int, - pValue: *mut ::size_t, // Actual type is const union * sigval value, - // which is a union of int and void * + pValue: *const ::sigval, sigCode: ::c_int, ) -> ::c_int; From d751f237125d96147cb5eb1d074113a5e5cf8d10 Mon Sep 17 00:00:00 2001 From: Baoshan Pang Date: Mon, 23 Sep 2019 14:53:41 -0700 Subject: [PATCH 2/3] move rtpSpawn from libstd to libc --- src/vxworks/mod.rs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/vxworks/mod.rs b/src/vxworks/mod.rs index 6fb79c1d..f17773da 100755 --- a/src/vxworks/mod.rs +++ b/src/vxworks/mod.rs @@ -2050,6 +2050,15 @@ extern "C" { // rtpLibCommon.h pub fn rtpInfoGet(rtpId: ::RTP_ID, rtpStruct: *mut ::RTP_DESC) -> ::c_int; + pub fn rtpSpawn( + pubrtpFileName: *const ::c_char, + argv: *const *const ::c_char, + envp: *const *const ::c_char, + priority: ::c_int, + uStackSize: ::size_t, + options: ::c_int, + taskOptions: ::c_int, + ) -> RTP_ID; // ioLib.h pub fn _realpath( From 97f6c6751c2e240386dd53b7a804d9372eca3411 Mon Sep 17 00:00:00 2001 From: Baoshan Pang Date: Mon, 23 Sep 2019 14:53:41 -0700 Subject: [PATCH 3/3] move rtpSpawn and RTP_ID_ERROR from libstd to libc --- src/vxworks/mod.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/vxworks/mod.rs b/src/vxworks/mod.rs index 6fb79c1d..77d89559 100755 --- a/src/vxworks/mod.rs +++ b/src/vxworks/mod.rs @@ -968,6 +968,7 @@ pub const SEEK_END: ::c_int = 2; // rtpLibCommon.h pub const VX_RTP_NAME_LENGTH: usize = 255; +pub const RTP_ID_ERROR: ::RTP_ID = -1; // h/public/unistd.h pub const _SC_GETPW_R_SIZE_MAX: ::c_int = 21; // Via unistd.h @@ -2050,6 +2051,15 @@ extern "C" { // rtpLibCommon.h pub fn rtpInfoGet(rtpId: ::RTP_ID, rtpStruct: *mut ::RTP_DESC) -> ::c_int; + pub fn rtpSpawn( + pubrtpFileName: *const ::c_char, + argv: *const *const ::c_char, + envp: *const *const ::c_char, + priority: ::c_int, + uStackSize: ::size_t, + options: ::c_int, + taskOptions: ::c_int, + ) -> RTP_ID; // ioLib.h pub fn _realpath(