# HG changeset patch # User Eric Blake # Date 1296881560 25200 # Node ID 225153ab2524b35dab9d43767209ef27b12981f5 # Parent 702056cdbca041cdc96e41dc0b4be0802ec8f49e 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 diff --git a/ChangeLog b/ChangeLog --- 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 --- a/doc/posix-functions/fdopendir.texi +++ b/doc/posix-functions/fdopendir.texi @@ -23,6 +23,10 @@ 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 --- 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_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"])])