Skip to content

Commit 24be899

Browse files
committed
Avoid using libc::sigemptyset on Android
1 parent b45c631 commit 24be899

File tree

2 files changed

+25
-2
lines changed

2 files changed

+25
-2
lines changed

src/libstd/sys/unix/process/process_common.rs

+15-1
Original file line numberDiff line numberDiff line change
@@ -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

src/libstd/sys/unix/process/process_unix.rs

+10-1
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,16 @@ impl Command {
193193
// need to clean things up now to avoid confusing the program
194194
// we're about to run.
195195
let mut set: libc::sigset_t = mem::uninitialized();
196-
t!(cvt(libc::sigemptyset(&mut set)));
196+
if cfg!(target_os = "android") {
197+
// Implementing sigemptyset allow us to support older Android
198+
// versions. See the comment about Android and sig* functions in
199+
// process_common.rs
200+
libc::memset(&mut set as *mut _ as *mut _,
201+
0,
202+
mem::size_of::<libc::sigset_t>());
203+
} else {
204+
t!(cvt(libc::sigemptyset(&mut set)));
205+
}
197206
t!(cvt(libc::pthread_sigmask(libc::SIG_SETMASK, &set,
198207
ptr::null_mut())));
199208
let ret = sys::signal(libc::SIGPIPE, libc::SIG_DFL);

0 commit comments

Comments
 (0)