@@ -28,6 +28,7 @@ pub type zoneid_t = ::c_int;
28
28
pub type psetid_t = :: c_int ;
29
29
pub type processorid_t = :: c_int ;
30
30
pub type chipid_t = :: c_int ;
31
+ pub type ctid_t = :: id_t ;
31
32
32
33
pub type suseconds_t = :: c_long ;
33
34
pub type off_t = :: c_long ;
@@ -516,13 +517,15 @@ s_no_extra_traits! {
516
517
__ss_pad2: [ u8 ; 240 ] ,
517
518
}
518
519
520
+ #[ cfg_attr( all( target_pointer_width = "64" , libc_align) , repr( align( 8 ) ) ) ]
519
521
pub struct siginfo_t {
520
522
pub si_signo: :: c_int,
521
523
pub si_code: :: c_int,
522
524
pub si_errno: :: c_int,
525
+ #[ cfg( target_pointer_width = "64" ) ]
523
526
pub si_pad: :: c_int,
524
- pub si_addr : * mut :: c_void ,
525
- __pad : [ u8 ; 232 ] ,
527
+
528
+ __data_pad : [ :: c_int ; SIGINFO_DATA_SIZE ] ,
526
529
}
527
530
528
531
pub struct sockaddr_dl {
@@ -773,17 +776,52 @@ cfg_if! {
773
776
}
774
777
}
775
778
779
+ impl siginfo_t {
780
+ /// The siginfo_t will have differing contents based on the delivered signal. Based on
781
+ /// `si_signo`, this determines how many of the `c_int` pad fields contain valid data
782
+ /// exposed by the C unions.
783
+ ///
784
+ /// It is not yet exhausitive for the OS-defined types, and defaults to assuming the
785
+ /// entire data pad area is "valid" for otherwise unrecognized signal numbers.
786
+ fn data_field_count( & self ) -> usize {
787
+ match self . si_signo {
788
+ :: SIGSEGV | :: SIGBUS | :: SIGILL | :: SIGTRAP | :: SIGFPE => {
789
+ :: mem:: size_of:: <siginfo_fault>( ) / :: mem:: size_of:: <:: c_int>( )
790
+ }
791
+ :: SIGCLD => :: mem:: size_of:: <siginfo_sigcld>( ) / :: mem:: size_of:: <:: c_int>( ) ,
792
+ :: SIGHUP
793
+ | :: SIGINT
794
+ | :: SIGQUIT
795
+ | :: SIGABRT
796
+ | :: SIGSYS
797
+ | :: SIGPIPE
798
+ | :: SIGALRM
799
+ | :: SIGTERM
800
+ | :: SIGUSR1
801
+ | :: SIGUSR2
802
+ | :: SIGPWR
803
+ | :: SIGWINCH
804
+ | :: SIGURG => :: mem:: size_of:: <siginfo_kill>( ) / :: mem:: size_of:: <:: c_int>( ) ,
805
+ _ => SIGINFO_DATA_SIZE ,
806
+ }
807
+ }
808
+ }
776
809
impl PartialEq for siginfo_t {
777
810
fn eq( & self , other: & siginfo_t) -> bool {
778
- self . si_signo == other. si_signo
811
+ if self . si_signo == other. si_signo
779
812
&& self . si_code == other. si_code
780
- && self . si_errno == other. si_errno
781
- && self . si_addr == other. si_addr
782
- && self
783
- . __pad
784
- . iter( )
785
- . zip( other. __pad. iter( ) )
786
- . all( |( a, b) | a == b)
813
+ && self . si_errno == other. si_errno {
814
+ // FIXME: The `si_pad` field in the 64-bit version of the struct is ignored
815
+ // (for now) when doing comparisons.
816
+
817
+ let field_count = self . data_field_count( ) ;
818
+ self . __data_pad[ ..field_count]
819
+ . iter( )
820
+ . zip( other. __data_pad[ ..field_count] . iter( ) )
821
+ . all( |( a, b) | a == b)
822
+ } else {
823
+ false
824
+ }
787
825
}
788
826
}
789
827
impl Eq for siginfo_t { }
@@ -793,7 +831,6 @@ cfg_if! {
793
831
. field( "si_signo" , & self . si_signo)
794
832
. field( "si_code" , & self . si_code)
795
833
. field( "si_errno" , & self . si_errno)
796
- . field( "si_addr" , & self . si_addr)
797
834
// FIXME: .field("__pad", &self.__pad)
798
835
. finish( )
799
836
}
@@ -803,8 +840,12 @@ cfg_if! {
803
840
self . si_signo. hash( state) ;
804
841
self . si_code. hash( state) ;
805
842
self . si_errno. hash( state) ;
806
- self . si_addr. hash( state) ;
807
- self . __pad. hash( state) ;
843
+
844
+ // FIXME: The `si_pad` field in the 64-bit version of the struct is ignored
845
+ // (for now) when doing hashing.
846
+
847
+ let field_count = self . data_field_count( ) ;
848
+ self . __data_pad[ ..field_count] . hash( state)
808
849
}
809
850
}
810
851
@@ -947,6 +988,116 @@ cfg_if! {
947
988
}
948
989
}
949
990
991
+ cfg_if ! {
992
+ if #[ cfg( target_pointer_width = "64" ) ] {
993
+ const SIGINFO_DATA_SIZE : usize = 60 ;
994
+ } else {
995
+ const SIGINFO_DATA_SIZE : usize = 29 ;
996
+ }
997
+ }
998
+
999
+ #[ repr( C ) ]
1000
+ struct siginfo_fault {
1001
+ addr : * mut :: c_void ,
1002
+ trapno : :: c_int ,
1003
+ pc : * mut :: caddr_t ,
1004
+ }
1005
+ impl Copy for siginfo_fault { }
1006
+ impl Clone for siginfo_fault {
1007
+ fn clone ( & self ) -> Self {
1008
+ * self
1009
+ }
1010
+ }
1011
+
1012
+ #[ repr( C ) ]
1013
+ struct siginfo_cldval {
1014
+ utime : :: clock_t ,
1015
+ status : :: c_int ,
1016
+ stime : :: clock_t ,
1017
+ }
1018
+ impl Copy for siginfo_cldval { }
1019
+ impl Clone for siginfo_cldval {
1020
+ fn clone ( & self ) -> Self {
1021
+ * self
1022
+ }
1023
+ }
1024
+
1025
+ #[ repr( C ) ]
1026
+ struct siginfo_killval {
1027
+ uid : :: uid_t ,
1028
+ value : :: sigval ,
1029
+ // Pad out to match the SIGCLD value size
1030
+ _pad : * mut :: c_void ,
1031
+ }
1032
+ impl Copy for siginfo_killval { }
1033
+ impl Clone for siginfo_killval {
1034
+ fn clone ( & self ) -> Self {
1035
+ * self
1036
+ }
1037
+ }
1038
+
1039
+ #[ repr( C ) ]
1040
+ struct siginfo_sigcld {
1041
+ pid : :: pid_t ,
1042
+ val : siginfo_cldval ,
1043
+ ctid : :: ctid_t ,
1044
+ zoneid : :: zoneid_t ,
1045
+ }
1046
+ impl Copy for siginfo_sigcld { }
1047
+ impl Clone for siginfo_sigcld {
1048
+ fn clone ( & self ) -> Self {
1049
+ * self
1050
+ }
1051
+ }
1052
+
1053
+ #[ repr( C ) ]
1054
+ struct siginfo_kill {
1055
+ pid : :: pid_t ,
1056
+ val : siginfo_killval ,
1057
+ ctid : :: ctid_t ,
1058
+ zoneid : :: zoneid_t ,
1059
+ }
1060
+ impl Copy for siginfo_kill { }
1061
+ impl Clone for siginfo_kill {
1062
+ fn clone ( & self ) -> Self {
1063
+ * self
1064
+ }
1065
+ }
1066
+
1067
+ impl siginfo_t {
1068
+ unsafe fn sidata < T : Copy > ( & self ) -> T {
1069
+ * ( ( & self . __data_pad ) as * const :: c_int as * const T )
1070
+ }
1071
+ pub unsafe fn si_addr ( & self ) -> * mut :: c_void {
1072
+ let sifault: siginfo_fault = self . sidata ( ) ;
1073
+ sifault. addr
1074
+ }
1075
+ pub unsafe fn si_uid ( & self ) -> :: uid_t {
1076
+ let kill: siginfo_kill = self . sidata ( ) ;
1077
+ kill. val . uid
1078
+ }
1079
+ pub unsafe fn si_value ( & self ) -> :: sigval {
1080
+ let kill: siginfo_kill = self . sidata ( ) ;
1081
+ kill. val . value
1082
+ }
1083
+ pub unsafe fn si_pid ( & self ) -> :: pid_t {
1084
+ let sigcld: siginfo_sigcld = self . sidata ( ) ;
1085
+ sigcld. pid
1086
+ }
1087
+ pub unsafe fn si_status ( & self ) -> :: c_int {
1088
+ let sigcld: siginfo_sigcld = self . sidata ( ) ;
1089
+ sigcld. val . status
1090
+ }
1091
+ pub unsafe fn si_utime ( & self ) -> :: c_long {
1092
+ let sigcld: siginfo_sigcld = self . sidata ( ) ;
1093
+ sigcld. val . utime
1094
+ }
1095
+ pub unsafe fn si_stime ( & self ) -> :: c_long {
1096
+ let sigcld: siginfo_sigcld = self . sidata ( ) ;
1097
+ sigcld. val . stime
1098
+ }
1099
+ }
1100
+
950
1101
pub const LC_CTYPE : :: c_int = 0 ;
951
1102
pub const LC_NUMERIC : :: c_int = 1 ;
952
1103
pub const LC_TIME : :: c_int = 2 ;
@@ -1055,6 +1206,7 @@ pub const FIOSETOWN: ::c_int = 0x8004667c;
1055
1206
pub const FIOGETOWN : :: c_int = 0x4004667b ;
1056
1207
1057
1208
pub const SIGCHLD : :: c_int = 18 ;
1209
+ pub const SIGCLD : :: c_int = :: SIGCHLD ;
1058
1210
pub const SIGBUS : :: c_int = 10 ;
1059
1211
pub const SIGINFO : :: c_int = 41 ;
1060
1212
pub const SIG_BLOCK : :: c_int = 1 ;
@@ -1065,6 +1217,13 @@ pub const SIGEV_NONE: ::c_int = 1;
1065
1217
pub const SIGEV_SIGNAL : :: c_int = 2 ;
1066
1218
pub const SIGEV_THREAD : :: c_int = 3 ;
1067
1219
1220
+ pub const CLD_EXITED : :: c_int = 1 ;
1221
+ pub const CLD_KILLED : :: c_int = 2 ;
1222
+ pub const CLD_DUMPED : :: c_int = 3 ;
1223
+ pub const CLD_TRAPPED : :: c_int = 4 ;
1224
+ pub const CLD_STOPPED : :: c_int = 5 ;
1225
+ pub const CLD_CONTINUED : :: c_int = 6 ;
1226
+
1068
1227
pub const IP_RECVDSTADDR : :: c_int = 0x7 ;
1069
1228
pub const IP_SEC_OPT : :: c_int = 0x22 ;
1070
1229
0 commit comments