@@ -85,12 +85,46 @@ pub fn init() {
85
85
86
86
#[ cfg( not( target_os = "nacl" ) ) ]
87
87
unsafe fn reset_sigpipe ( ) {
88
- assert ! ( libc :: signal( libc:: SIGPIPE , libc:: SIG_IGN ) != !0 ) ;
88
+ assert ! ( signal( libc:: SIGPIPE , libc:: SIG_IGN ) != !0 ) ;
89
89
}
90
90
#[ cfg( target_os = "nacl" ) ]
91
91
unsafe fn reset_sigpipe ( ) { }
92
92
}
93
93
94
+ // Currently the minimum supported Android version of the standard library is
95
+ // API level 18 (android-18). Back in those days [1] the `signal` function was
96
+ // just an inline wrapper around `bsd_signal`, but starting in API level
97
+ // android-20 the `signal` symbols was introduced [2]. Finally, in android-21
98
+ // the API `bsd_signal` was removed [3].
99
+ //
100
+ // Basically this means that if we want to be binary compatible with multiple
101
+ // Android releases (oldest being 18 and newest being 21) then we need to check
102
+ // for both symbols and not actually link against either.
103
+ //
104
+ // Note that if we're not on android we just link against the `android` symbol
105
+ // itself.
106
+ //
107
+ // [1]: https://chromium.googlesource.com/android_tools/+/20ee6d20/ndk/platforms
108
+ // /android-18/arch-arm/usr/include/signal.h
109
+ // [2]: https://chromium.googlesource.com/android_tools/+/fbd420/ndk_experimental
110
+ // /platforms/android-20/arch-arm
111
+ // /usr/include/signal.h
112
+ // [3]: https://chromium.googlesource.com/android_tools/+/20ee6d/ndk/platforms
113
+ // /android-21/arch-arm/usr/include/signal.h
114
+ #[ cfg( target_os = "android" ) ]
115
+ unsafe fn signal ( signum : libc:: c_int ,
116
+ handler : libc:: sighandler_t ) -> libc:: sighandler_t {
117
+ weak ! ( fn signal( libc:: c_int, libc:: sighandler_t) -> libc:: sighandler_t) ;
118
+ weak ! ( fn bsd_signal( libc:: c_int, libc:: sighandler_t) -> libc:: sighandler_t) ;
119
+
120
+ let f = signal. get ( ) . or_else ( || bsd_signal. get ( ) ) ;
121
+ let f = f. expect ( "neither `signal` nor `bsd_signal` symbols found" ) ;
122
+ f ( signum, handler)
123
+ }
124
+
125
+ #[ cfg( not( target_os = "android" ) ) ]
126
+ pub use libc:: signal;
127
+
94
128
pub fn decode_error_kind ( errno : i32 ) -> ErrorKind {
95
129
match errno as libc:: c_int {
96
130
libc:: ECONNREFUSED => ErrorKind :: ConnectionRefused ,
0 commit comments