Mercurial > hg > octave-nkf > gnulib-hg
changeset 14266:225153ab2524
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 <eblake@redhat.com>
author | Eric Blake <eblake@redhat.com> |
---|---|
date | Fri, 04 Feb 2011 21:52:40 -0700 |
parents | 702056cdbca0 |
children | 9ccff8d6fbbe |
files | ChangeLog doc/posix-functions/fdopendir.texi m4/fdopendir.m4 |
diffstat | 3 files changed, 18 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2011-02-04 Eric Blake <eblake@redhat.com> + + 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 <eggert@cs.ucla.edu> stdbool: do not define HAVE_STDBOOL_H
--- 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:
--- 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 <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"])])