>From 781c36385ed07995e37ed9e5bb0b7dc0e702c969 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Fri, 20 Feb 2015 10:53:10 -0800 Subject: [PATCH 2/2] getdtablesize: port better for Android Problem reported by Kevin Cernekee in: http://lists.gnu.org/archive/html/bug-gnulib/2015-02/msg00112.html * doc/glibc-functions/getdtablesize.texi (getdtablesize): Mention bug. * lib/getdtablesize.c (getdtablesize): Don't fall back on _SC_OPEN_MAX. Instead, just use getrlimit, taking care to avoid Cygwin bug. dup2, fcntl: cross-compile better for Android --- ChangeLog | 9 ++++++++- doc/glibc-functions/getdtablesize.texi | 2 +- lib/getdtablesize.c | 35 +++++++++++++++++----------------- 3 files changed, 26 insertions(+), 20 deletions(-) diff --git a/ChangeLog b/ChangeLog index 6f2118c..67ad015 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,12 @@ 2015-02-20 Paul Eggert + getdtablesize: port better for Android + Problem reported by Kevin Cernekee in: + http://lists.gnu.org/archive/html/bug-gnulib/2015-02/msg00112.html + * doc/glibc-functions/getdtablesize.texi (getdtablesize): Mention bug. + * lib/getdtablesize.c (getdtablesize): Don't fall back on _SC_OPEN_MAX. + Instead, just use getrlimit, taking care to avoid Cygwin bug. + poll: fixes for large fds * lib/poll.c (poll): Don't check directly for NFD too large. Don't rely on undefined behavior in FD_SET when an arg exceeds @@ -15,7 +22,7 @@ 2015-02-18 Paul Eggert - dup2, fcntl: cross-compiler better for Android + dup2, fcntl: cross-compile better for Android Problem reported by Kevin Cernekee in: http://lists.gnu.org/archive/html/bug-gnulib/2015-02/msg00109.html * m4/dup2.m4 (gl_FUNC_DUP2): Don't guess no when cross-compiling diff --git a/doc/glibc-functions/getdtablesize.texi b/doc/glibc-functions/getdtablesize.texi index 4c2cc85..f1314f0 100644 --- a/doc/glibc-functions/getdtablesize.texi +++ b/doc/glibc-functions/getdtablesize.texi @@ -17,7 +17,7 @@ Android LP32. @item This function does not represent the true @code{RLIMIT_NOFILE} soft limit on some platforms: -Cygwin 1.7.25. +Android LP32, Cygwin 1.7.25. @end itemize Portability problems not fixed by Gnulib: diff --git a/lib/getdtablesize.c b/lib/getdtablesize.c index 9fe7462..bad45f7 100644 --- a/lib/getdtablesize.c +++ b/lib/getdtablesize.c @@ -84,32 +84,31 @@ getdtablesize (void) return dtablesize; } -#elif HAVE_GETDTABLESIZE && HAVE_DECL_GETDTABLESIZE +#else +# include # include -# undef getdtablesize + +# ifdef __CYGWIN__ + /* Cygwin 1.7.25 auto-increases the RLIMIT_NOFILE soft limit until it + hits the compile-time constant hard limit of 3200. We might as + well just report the hard limit. */ +# define rlim_cur rlim_max +# endif int -rpl_getdtablesize(void) +getdtablesize (void) { - /* To date, this replacement is only compiled for Cygwin 1.7.25, - which auto-increased the RLIMIT_NOFILE soft limit until it - hits the compile-time constant hard limit of 3200. Although - that version of cygwin supported a child process inheriting - a smaller soft limit, the smaller limit is not enforced, so - we might as well just report the hard limit. */ struct rlimit lim; - if (!getrlimit (RLIMIT_NOFILE, &lim) && lim.rlim_max != RLIM_INFINITY) - return lim.rlim_max; - return getdtablesize (); -} -#elif defined _SC_OPEN_MAX + if (getrlimit (RLIMIT_NOFILE, &lim) == 0 + && 0 <= lim.rlim_cur && lim.rlim_cur <= INT_MAX + && lim.rlim_cur != RLIM_INFINITY + && lim.rlim_cur != RLIM_SAVED_CUR + && lim.rlim_cur != RLIM_SAVED_MAX) + return lim.rlim_cur; -int -getdtablesize (void) -{ - return sysconf (_SC_OPEN_MAX); + return INT_MAX; } #endif -- 2.1.0