FreeBSD fdopendir(fd) always consumes fd, even if it fails with ENOTDIR. The code that works around the GNU Hurd bug also fixes this; we just need to detect it.
* m4/fdopendir.m4 (gl_FUNC_FDOPENDIR): Detect bug. * doc/posix-functions/fdopendir.texi (fdopendir): Document it. Reported by Jim Meyering. Signed-off-by: Eric Blake <[email protected]> --- Easier than I thought. ChangeLog | 6 ++++++ doc/posix-functions/fdopendir.texi | 4 ++++ m4/fdopendir.m4 | 12 ++++++++---- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index 3026c15..e4932ea 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2011-02-04 Eric Blake <[email protected]> + + fdopendir: detect FreeBSD bug + * m4/fdopendir.m4 (gl_FUNC_FDOPENDIR): Detect bug. + * doc/posix-functions/fdopendir.texi (fdopendir): Document it. + 2011-02-04 Bruno Haible <[email protected]> wcsnrtombs: Prepare for new module wwcsnrtombs. diff --git a/doc/posix-functions/fdopendir.texi b/doc/posix-functions/fdopendir.texi index 92f0a43..8b8a51e 100644 --- a/doc/posix-functions/fdopendir.texi +++ b/doc/posix-functions/fdopendir.texi @@ -23,6 +23,10 @@ fdopendir This function does not reject non-directory file descriptors on some platforms: GNU/Hurd. +@item +This function mistakenly closes non-directory file descriptors on some +platforms: +FreeBSD 8.1. @end itemize Portability problems not fixed by Gnulib: diff --git a/m4/fdopendir.m4 b/m4/fdopendir.m4 index 7ce0b5a..f192a62 100644 --- a/m4/fdopendir.m4 +++ b/m4/fdopendir.m4 @@ -1,4 +1,4 @@ -# serial 4 +# serial 5 # See if we need to provide fdopendir. dnl Copyright (C) 2009-2011 Free Software Foundation, Inc. @@ -27,12 +27,16 @@ AC_DEFUN([gl_FUNC_FDOPENDIR], [AC_RUN_IFELSE([AC_LANG_PROGRAM([[ #include <dirent.h> #include <fcntl.h> +#include <unistd.h> #if !HAVE_DECL_FDOPENDIR extern DIR *fdopendir (int); #endif -]], [int fd = open ("conftest.c", O_RDONLY); - if (fd < 0) return 2; - return !!fdopendir (fd);])], +]], [int result = 0; + int fd = open ("conftest.c", O_RDONLY); + if (fd < 0) result |= 1; + if (fdopendir (fd)) result |= 2; + if (close (fd)) result |= 4; + return result;])], [gl_cv_func_fdopendir_works=yes], [gl_cv_func_fdopendir_works=no], [gl_cv_func_fdopendir_works="guessing no"])]) -- 1.7.4
