@@ -417,12 +417,26 @@ mod tests {
417417 }
418418 }
419419
420+ // Android with api less than 21 define sig* functions inline, so it is not
421+ // available for dynamic link. Implementing sigemptyset and sigaddset allow us
422+ // to support older Android version (independent of libc version).
423+ // The following implementations are based on https://git.io/vSkNf
424+
420425 #[ cfg( not( target_os = "android" ) ) ]
421426 extern {
427+ #[ cfg_attr( target_os = "netbsd" , link_name = "__sigemptyset14" ) ]
428+ fn sigemptyset ( set : * mut libc:: sigset_t ) -> libc:: c_int ;
429+
422430 #[ cfg_attr( target_os = "netbsd" , link_name = "__sigaddset14" ) ]
423431 fn sigaddset ( set : * mut libc:: sigset_t , signum : libc:: c_int ) -> libc:: c_int ;
424432 }
425433
434+ #[ cfg( target_os = "android" ) ]
435+ unsafe fn sigemptyset ( set : * mut libc:: sigset_t ) -> libc:: c_int {
436+ libc:: memset ( set as * mut _ , 0 , mem:: size_of :: < libc:: sigset_t > ( ) ) ;
437+ return 0 ;
438+ }
439+
426440 #[ cfg( target_os = "android" ) ]
427441 unsafe fn sigaddset ( set : * mut libc:: sigset_t , signum : libc:: c_int ) -> libc:: c_int {
428442 use slice;
@@ -450,7 +464,7 @@ mod tests {
450464
451465 let mut set: libc:: sigset_t = mem:: uninitialized ( ) ;
452466 let mut old_set: libc:: sigset_t = mem:: uninitialized ( ) ;
453- t ! ( cvt( libc :: sigemptyset( & mut set) ) ) ;
467+ t ! ( cvt( sigemptyset( & mut set) ) ) ;
454468 t ! ( cvt( sigaddset( & mut set, libc:: SIGINT ) ) ) ;
455469 t ! ( cvt( libc:: pthread_sigmask( libc:: SIG_SETMASK , & set, & mut old_set) ) ) ;
456470
0 commit comments