>From b600c3178c1604ff3174986b5fdf033ecb590a66 Mon Sep 17 00:00:00 2001
From: Paul Eggert
Date: Mon, 16 Feb 2015 21:38:02 -0800
Subject: [PATCH] getdtablesize, dup2, fcntl: port to Android
Problem reported by Kevin Cernekee in:
http://lists.gnu.org/archive/html/bug-gnulib/2015-02/msg00092.html
* doc/glibc-functions/getdtablesize.texi (getdtablesize):
Mention that getdtablesize doesn't work on Android.
* lib/getdtablesize.c: Use getrlimit substitute only if
getdtablesize is declared. This should suffice for Cygwin
while not breaking Android.
* m4/dup2.m4 (gl_FUNC_DUP2):
* m4/fcntl.m4 (gl_FUNC_FCNTL):
Prefer sysconf (_SC_OPEN_MAX) to getdtablesize, as the former is
standardized but the latter is not, and sysconf works on Android.
* m4/getdtablesize.m4 (gl_FUNC_GETDTABLESIZE):
Also check that getdtablesize is declared.
This removes the need for a special case for Android.
---
ChangeLog | 18 ++++++++++++++++++
doc/glibc-functions/getdtablesize.texi | 6 +++++-
lib/getdtablesize.c | 2 +-
m4/dup2.m4 | 13 +++++++------
m4/fcntl.m4 | 18 +++++++++---------
m4/getdtablesize.m4 | 10 +++++-----
6 files changed, 45 insertions(+), 22 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index b198739..5083e95 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,21 @@
+2015-02-16 Paul Eggert
+
+ getdtablesize, dup2, fcntl: port to Android
+ Problem reported by Kevin Cernekee in:
+ http://lists.gnu.org/archive/html/bug-gnulib/2015-02/msg00092.html
+ * doc/glibc-functions/getdtablesize.texi (getdtablesize):
+ Mention that getdtablesize doesn't work on Android.
+ * lib/getdtablesize.c: Use getrlimit substitute only if
+ getdtablesize is declared. This should suffice for Cygwin
+ while not breaking Android.
+ * m4/dup2.m4 (gl_FUNC_DUP2):
+ * m4/fcntl.m4 (gl_FUNC_FCNTL):
+ Prefer sysconf (_SC_OPEN_MAX) to getdtablesize, as the former is
+ standardized but the latter is not, and sysconf works on Android.
+ * m4/getdtablesize.m4 (gl_FUNC_GETDTABLESIZE):
+ Also check that getdtablesize is declared.
+ This removes the need for a special case for Android.
+
2015-02-16 Kevin Cernekee
localename: Implement gl_locale_name_thread_unsafe for Android
diff --git a/doc/glibc-functions/getdtablesize.texi b/doc/glibc-functions/getdtablesize.texi
index c28a546..4c2cc85 100644
--- a/doc/glibc-functions/getdtablesize.texi
+++ b/doc/glibc-functions/getdtablesize.texi
@@ -8,7 +8,11 @@ Portability problems fixed by Gnulib:
@itemize
@item
This function is missing on some platforms:
-mingw, MSVC 9.
+Android LP64, mingw, MSVC 9.
+
address@hidden
+This function is not declared on some platforms:
+Android LP32.
@item
This function does not represent the true @code{RLIMIT_NOFILE} soft
diff --git a/lib/getdtablesize.c b/lib/getdtablesize.c
index 59b9736..9fe7462 100644
--- a/lib/getdtablesize.c
+++ b/lib/getdtablesize.c
@@ -84,7 +84,7 @@ getdtablesize (void)
return dtablesize;
}
-#elif HAVE_GETDTABLESIZE
+#elif HAVE_GETDTABLESIZE && HAVE_DECL_GETDTABLESIZE
# include
# undef getdtablesize
diff --git a/m4/dup2.m4 b/m4/dup2.m4
index 0354c6a..c47ef27 100644
--- a/m4/dup2.m4
+++ b/m4/dup2.m4
@@ -1,4 +1,4 @@
-#serial 20
+#serial 21
dnl Copyright (C) 2002, 2005, 2007, 2009-2015 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
@@ -8,7 +8,6 @@ AC_DEFUN([gl_FUNC_DUP2],
[
AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
AC_REQUIRE([AC_CANONICAL_HOST])
- AC_CHECK_FUNCS_ONCE([getdtablesize])
m4_ifdef([gl_FUNC_DUP2_OBSOLETE], [
AC_CHECK_FUNCS_ONCE([dup2])
if test $ac_cv_func_dup2 = no; then
@@ -22,12 +21,14 @@ AC_DEFUN([gl_FUNC_DUP2],
[AC_RUN_IFELSE([
AC_LANG_PROGRAM([[#include
#include
+#include
#include ]],
[int result = 0;
-#ifdef HAVE_GETDTABLESIZE
- int bad_fd = getdtablesize ();
-#else
- int bad_fd = 1000000;
+ int bad_fd = INT_MAX;
+#ifdef _SC_OPEN_MAX
+ long int open_max = sysconf (_SC_OPEN_MAX);
+ if (0 <= open_max && open_max <= INT_MAX)
+ bad_fd = open_max;
#endif
#ifdef FD_CLOEXEC
if (fcntl (1, F_SETFD, FD_CLOEXEC) == -1)
diff --git a/m4/fcntl.m4 b/m4/fcntl.m4
index 733cd2d..9c044dc 100644
--- a/m4/fcntl.m4
+++ b/m4/fcntl.m4
@@ -1,4 +1,4 @@
-# fcntl.m4 serial 5
+# fcntl.m4 serial 6
dnl Copyright (C) 2009-2015 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
@@ -19,7 +19,7 @@ AC_DEFUN([gl_FUNC_FCNTL],
AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
AC_REQUIRE([gl_FCNTL_H_DEFAULTS])
AC_REQUIRE([AC_CANONICAL_HOST])
- AC_CHECK_FUNCS_ONCE([fcntl getdtablesize])
+ AC_CHECK_FUNCS_ONCE([fcntl])
if test $ac_cv_func_fcntl = no; then
gl_REPLACE_FCNTL
else
@@ -28,16 +28,16 @@ AC_DEFUN([gl_FUNC_FCNTL],
AC_CACHE_CHECK([whether fcntl handles F_DUPFD correctly],
[gl_cv_func_fcntl_f_dupfd_works],
[AC_RUN_IFELSE([AC_LANG_PROGRAM([[
-#ifdef HAVE_GETDTABLESIZE
-# include
-#endif
+#include
+#include
#include
#include
]], [[int result = 0;
-#ifdef HAVE_GETDTABLESIZE
- int bad_fd = getdtablesize ();
-#else
- int bad_fd = 1000000;
+ int bad_fd = INT_MAX;
+#ifdef _SC_OPEN_MAX
+ long int open_max = sysconf (_SC_OPEN_MAX);
+ if (0 <= open_max && open_max <= INT_MAX)
+ bad_fd = open_max;
#endif
if (fcntl (0, F_DUPFD, -1) != -1) result |= 1;
if (errno != EINVAL) result |= 2;
diff --git a/m4/getdtablesize.m4 b/m4/getdtablesize.m4
index 3ad204c..25e9968 100644
--- a/m4/getdtablesize.m4
+++ b/m4/getdtablesize.m4
@@ -1,4 +1,4 @@
-# getdtablesize.m4 serial 5
+# getdtablesize.m4 serial 6
dnl Copyright (C) 2008-2015 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
@@ -9,7 +9,9 @@ AC_DEFUN([gl_FUNC_GETDTABLESIZE],
AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
AC_REQUIRE([AC_CANONICAL_HOST])
AC_CHECK_FUNCS_ONCE([getdtablesize])
- if test $ac_cv_func_getdtablesize = yes; then
+ AC_CHECK_DECLS_ONCE([getdtablesize])
+ if test $ac_cv_func_getdtablesize = yes &&
+ test $ac_cv_have_decl_getdtablesize = yes; then
# Cygwin 1.7.25 automatically increases the RLIMIT_NOFILE soft limit
# up to an unchangeable hard limit; all other platforms correctly
# require setrlimit before getdtablesize() can report a larger value.
@@ -26,9 +28,7 @@ AC_DEFUN([gl_FUNC_GETDTABLESIZE],
[gl_cv_func_getdtablesize_works=yes],
[gl_cv_func_getdtablesize_works=no],
[case "$host_os" in
- cygwin*|*-android*)
- # on cygwin 1.5.25, getdtablesize() automatically grows
- # on Android API level >= 21, the declaration is missing from unistd.h
+ cygwin*) # on cygwin 1.5.25, getdtablesize() automatically grows
gl_cv_func_getdtablesize_works="guessing no" ;;
*) gl_cv_func_getdtablesize_works="guessing yes" ;;
esac])
--
2.1.0