From e7455b30d0245d14619edf5298b98d523e6f1465 Mon Sep 17 00:00:00 2001 From: Eric Blake Date: Fri, 4 Feb 2011 21:52:40 -0700 Subject: [PATCH] fdopendir: detect FreeBSD bug 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 --- 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 fae49b6d09..19eaf55710 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2011-02-04 Eric Blake + + fdopendir: detect FreeBSD bug + * m4/fdopendir.m4 (gl_FUNC_FDOPENDIR): Detect bug. + * doc/posix-functions/fdopendir.texi (fdopendir): Document it. + 2011-02-04 Paul Eggert stdbool: do not define HAVE_STDBOOL_H diff --git a/doc/posix-functions/fdopendir.texi b/doc/posix-functions/fdopendir.texi index 92f0a43129..8b8a51e537 100644 --- a/doc/posix-functions/fdopendir.texi +++ b/doc/posix-functions/fdopendir.texi @@ -23,6 +23,10 @@ FreeBSD 7.3. 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 7ce0b5a5f5..f192a62830 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 #include +#include #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"])]) -- 2.30.2