From 5bcac36de6b8f6a19f8ef25775790293873ebded Mon Sep 17 00:00:00 2001 From: Maarten de Vries Date: Sat, 31 Oct 2020 17:48:03 +0100 Subject: [PATCH] Implement accept4 on Android as raw syscall. This avoids relying on Android 5.0 / API level 21. The Linux kernel used by Android supports the syscall (except in truly ancient Android versions), but the Android libc did not expose a wrapper. --- src/unix/linux_like/android/mod.rs | 14 ++++++++++++++ src/unix/linux_like/emscripten/mod.rs | 6 ++++++ src/unix/linux_like/linux/mod.rs | 6 ++++++ src/unix/linux_like/mod.rs | 6 ------ 4 files changed, 26 insertions(+), 6 deletions(-) diff --git a/src/unix/linux_like/android/mod.rs b/src/unix/linux_like/android/mod.rs index 1240e208be883..09ce6ec69be5b 100644 --- a/src/unix/linux_like/android/mod.rs +++ b/src/unix/linux_like/android/mod.rs @@ -2349,6 +2349,20 @@ f! { pub fn SO_EE_OFFENDER(ee: *const ::sock_extended_err) -> *mut ::sockaddr { ee.offset(1) as *mut ::sockaddr } + + // Sadly, Android before 5.0 (API level 21), the accept4 syscall is not + // exposed by the libc. As work-around, we implement it through `syscall` + // directly. This workaround can be removed if the minimum version of + // Android is bumped. When the workaround is removed, `accept4` can be + // moved back to `linux_like/mod.rs` + pub unsafe fn accept4( + fd: ::c_int, + addr: *mut ::sockaddr, + len: *mut ::socklen_t, + flg: ::c_int, + ) -> ::c_int { + syscall(SYS_accept4, fd, addr, len, flg) as ::c_int + } } extern "C" { diff --git a/src/unix/linux_like/emscripten/mod.rs b/src/unix/linux_like/emscripten/mod.rs index 945efeea74ea2..9599e1992fbeb 100644 --- a/src/unix/linux_like/emscripten/mod.rs +++ b/src/unix/linux_like/emscripten/mod.rs @@ -1851,6 +1851,12 @@ extern "C" { ) -> ::c_int; pub fn nl_langinfo_l(item: ::nl_item, locale: ::locale_t) -> *mut ::c_char; + pub fn accept4( + fd: ::c_int, + addr: *mut ::sockaddr, + len: *mut ::socklen_t, + flg: ::c_int, + ) -> ::c_int; pub fn getnameinfo( sa: *const ::sockaddr, salen: ::socklen_t, diff --git a/src/unix/linux_like/linux/mod.rs b/src/unix/linux_like/linux/mod.rs index 249c98bce2bd6..90face2e958f1 100644 --- a/src/unix/linux_like/linux/mod.rs +++ b/src/unix/linux_like/linux/mod.rs @@ -2997,6 +2997,12 @@ extern "C" { pub fn sigwaitinfo(set: *const sigset_t, info: *mut siginfo_t) -> ::c_int; pub fn nl_langinfo_l(item: ::nl_item, locale: ::locale_t) -> *mut ::c_char; + pub fn accept4( + fd: ::c_int, + addr: *mut ::sockaddr, + len: *mut ::socklen_t, + flg: ::c_int, + ) -> ::c_int; pub fn getnameinfo( sa: *const ::sockaddr, salen: ::socklen_t, diff --git a/src/unix/linux_like/mod.rs b/src/unix/linux_like/mod.rs index 80c4f5bc0b7dd..d5299b2c38908 100644 --- a/src/unix/linux_like/mod.rs +++ b/src/unix/linux_like/mod.rs @@ -1581,12 +1581,6 @@ extern "C" { attr: *mut pthread_condattr_t, pshared: ::c_int, ) -> ::c_int; - pub fn accept4( - fd: ::c_int, - addr: *mut ::sockaddr, - len: *mut ::socklen_t, - flg: ::c_int, - ) -> ::c_int; pub fn pthread_mutexattr_setpshared( attr: *mut pthread_mutexattr_t, pshared: ::c_int,