From 7b43d70be4fe9c3f9003b189e62e4f86a6a88516 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E6=98=8E?= <7737673+caobug@users.noreply.github.com> Date: Mon, 26 Jun 2023 19:47:48 +0800 Subject: [PATCH] unix: fix build for lower versions of Android (#4046) Available since Android N (API level 24): getgrgid_r, preadv, pwritev Refs: https://cs.android.com/android/platform/superproject/+/master:bionic/docs/status.md --- src/unix/core.c | 5 +++++ src/unix/fs.c | 17 +++++++++++------ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/unix/core.c b/src/unix/core.c index 0756364f..25c5181f 100644 --- a/src/unix/core.c +++ b/src/unix/core.c @@ -1271,6 +1271,10 @@ static int uv__getpwuid_r(uv_passwd_t *pwd, uid_t uid) { int uv_os_get_group(uv_group_t* grp, uv_uid_t gid) { +#if defined(__ANDROID__) && __ANDROID_API__ < 24 + /* This function getgrgid_r() was added in Android N (level 24) */ + return UV_ENOSYS; +#else struct group gp; struct group* result; char* buf; @@ -1347,6 +1351,7 @@ int uv_os_get_group(uv_group_t* grp, uv_uid_t gid) { uv__free(buf); return 0; +#endif } diff --git a/src/unix/fs.c b/src/unix/fs.c index e9e323e7..6b051c12 100644 --- a/src/unix/fs.c +++ b/src/unix/fs.c @@ -55,6 +55,11 @@ # define HAVE_PREADV 0 #endif +/* preadv() and pwritev() were added in Android N (level 24) */ +#if defined(__linux__) && !(defined(__ANDROID__) && __ANDROID_API__ < 24) +# define TRY_PREADV 1 +#endif + #if defined(__linux__) # include #endif @@ -456,7 +461,7 @@ static ssize_t uv__fs_preadv(uv_file fd, static ssize_t uv__fs_read(uv_fs_t* req) { -#if defined(__linux__) +#if TRY_PREADV static _Atomic int no_preadv; #endif unsigned int iovmax; @@ -480,13 +485,13 @@ static ssize_t uv__fs_read(uv_fs_t* req) { #if HAVE_PREADV result = preadv(req->file, (struct iovec*) req->bufs, req->nbufs, req->off); #else -# if defined(__linux__) +# if TRY_PREADV if (atomic_load_explicit(&no_preadv, memory_order_relaxed)) retry: # endif { result = uv__fs_preadv(req->file, req->bufs, req->nbufs, req->off); } -# if defined(__linux__) +# if TRY_PREADV else { result = preadv(req->file, (struct iovec*) req->bufs, @@ -1156,7 +1161,7 @@ static ssize_t uv__fs_lutime(uv_fs_t* req) { static ssize_t uv__fs_write(uv_fs_t* req) { -#if defined(__linux__) +#if TRY_PREADV static _Atomic int no_pwritev; #endif ssize_t r; @@ -1185,13 +1190,13 @@ static ssize_t uv__fs_write(uv_fs_t* req) { #if HAVE_PREADV r = pwritev(req->file, (struct iovec*) req->bufs, req->nbufs, req->off); #else -# if defined(__linux__) +# if TRY_PREADV if (atomic_load_explicit(&no_pwritev, memory_order_relaxed)) retry: # endif { r = pwrite(req->file, req->bufs[0].base, req->bufs[0].len, req->off); } -# if defined(__linux__) +# if TRY_PREADV else { r = pwritev(req->file, (struct iovec*) req->bufs,