@@ -85,12 +85,46 @@ pub fn init() {
8585
8686 #[ cfg( not( target_os = "nacl" ) ) ]
8787 unsafe fn reset_sigpipe ( ) {
88- assert ! ( libc :: signal( libc:: SIGPIPE , libc:: SIG_IGN ) != !0 ) ;
88+ assert ! ( signal( libc:: SIGPIPE , libc:: SIG_IGN ) != !0 ) ;
8989 }
9090 #[ cfg( target_os = "nacl" ) ]
9191 unsafe fn reset_sigpipe ( ) { }
9292}
9393
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+
94128pub fn decode_error_kind ( errno : i32 ) -> ErrorKind {
95129 match errno as libc:: c_int {
96130 libc:: ECONNREFUSED => ErrorKind :: ConnectionRefused ,
0 commit comments