fdopendir: work around FreeBSD bug
authorEric Blake <eblake@redhat.com>
Mon, 29 Mar 2010 21:08:59 +0000 (15:08 -0600)
committerEric Blake <eblake@redhat.com>
Tue, 30 Mar 2010 14:26:01 +0000 (08:26 -0600)
Without a declaration, at least tar would core dump on 64-bit
FreeBSD because gcc only used 32 bits of the resulting pointer.

* m4/dirent_h.m4 (gl_DIRENT_H_DEFAULTS): New witness.
* m4/fdopendir.m4 (gl_FUNC_FDOPENDIR): Set it.
* modules/dirent (Makefile.am): Substitute it.
* lib/dirent.in.h (fdopendir): Supply missing FreeBSD
declaration.
* doc/posix-functions/fdopendir.texi (fdopendir): Document the
fix.
Reported by Christian Weisgerber <naddy@mips.inka.de>.

Signed-off-by: Eric Blake <eblake@redhat.com>
ChangeLog
doc/posix-functions/fdopendir.texi
lib/dirent.in.h
m4/dirent_h.m4
m4/fdopendir.m4
modules/dirent

index b8c880b..2d652c6 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2010-03-30  Eric Blake  <eblake@redhat.com>
+
+       fdopendir: work around FreeBSD bug
+       * m4/dirent_h.m4 (gl_DIRENT_H_DEFAULTS): New witness.
+       * m4/fdopendir.m4 (gl_FUNC_FDOPENDIR): Set it.
+       * modules/dirent (Makefile.am): Substitute it.
+       * lib/dirent.in.h (fdopendir): Supply missing FreeBSD
+       declaration.
+       * doc/posix-functions/fdopendir.texi (fdopendir): Document the
+       fix.
+       Reported by Christian Weisgerber <naddy@mips.inka.de>.
+
 2010-03-29  Bruno Haible  <bruno@clisp.org>
 
        Emit #pragma system_header after the inclusion guard, not before.
index fae7bb7..89b1a6a 100644 (file)
@@ -17,6 +17,9 @@ is not multithread-safe.  Also, the replacement does not guarantee
 that @samp{dirfd(fdopendir(n))==n} (dirfd might fail, or return a
 different file descriptor than n).
 @item
+This function exists but is not declared on some platforms:
+FreeBSD 7.3.
+@item
 This function does not reject non-directory file descriptors on some
 platforms:
 GNU/Hurd.
index 3989a25..e684928 100644 (file)
@@ -77,7 +77,7 @@ _GL_WARN_ON_USE (dirfd, "dirfd is unportable - "
 _GL_FUNCDECL_RPL (fdopendir, DIR *, (int fd));
 _GL_CXXALIAS_RPL (fdopendir, DIR *, (int fd));
 # else
-#  if !@HAVE_FDOPENDIR@
+#  if !@HAVE_FDOPENDIR@ || !@HAVE_DECL_FDOPENDIR@
 _GL_FUNCDECL_SYS (fdopendir, DIR *, (int fd));
 #  endif
 _GL_CXXALIAS_SYS (fdopendir, DIR *, (int fd));
index 5f88a27..361296a 100644 (file)
@@ -1,4 +1,4 @@
-# dirent_h.m4 serial 11
+# dirent_h.m4 serial 12
 dnl Copyright (C) 2008-2010 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -46,6 +46,7 @@ AC_DEFUN([gl_DIRENT_H_DEFAULTS],
   GNULIB_ALPHASORT=0;   AC_SUBST([GNULIB_ALPHASORT])
   dnl Assume proper GNU behavior unless another module says otherwise.
   HAVE_DECL_DIRFD=1;    AC_SUBST([HAVE_DECL_DIRFD])
+  HAVE_DECL_FDOPENDIR=1;AC_SUBST([HAVE_DECL_FDOPENDIR])
   HAVE_FDOPENDIR=1;     AC_SUBST([HAVE_FDOPENDIR])
   HAVE_SCANDIR=1;       AC_SUBST([HAVE_SCANDIR])
   HAVE_ALPHASORT=1;     AC_SUBST([HAVE_ALPHASORT])
index 7282d4b..0908e1f 100644 (file)
@@ -1,4 +1,4 @@
-# serial 3
+# serial 4
 # See if we need to provide fdopendir.
 
 dnl Copyright (C) 2009-2010 Free Software Foundation, Inc.
@@ -11,6 +11,10 @@ dnl with or without modifications, as long as this notice is preserved.
 AC_DEFUN([gl_FUNC_FDOPENDIR],
 [
   AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+  dnl FreeBSD 7.3 has the function, but failed to declare it.
+  AC_CHECK_DECLS([fdopendir], [], [HAVE_DECL_FDOPENDIR=0], [[
+#include <dirent.h>
+    ]])
   AC_CHECK_FUNCS_ONCE([fdopendir])
   if test $ac_cv_func_fdopendir = no; then
     AC_LIBOBJ([openat-proc])
@@ -23,6 +27,9 @@ AC_DEFUN([gl_FUNC_FDOPENDIR],
       [AC_RUN_IFELSE([AC_LANG_PROGRAM([[
 #include <dirent.h>
 #include <fcntl.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);])],
index 9b99dbc..8783d83 100644 (file)
@@ -31,6 +31,7 @@ dirent.h: dirent.in.h $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
              -e 's|@''GNULIB_SCANDIR''@|$(GNULIB_SCANDIR)|g' \
              -e 's|@''GNULIB_ALPHASORT''@|$(GNULIB_ALPHASORT)|g' \
              -e 's|@''HAVE_DECL_DIRFD''@|$(HAVE_DECL_DIRFD)|g' \
+             -e 's|@''HAVE_DECL_FDOPENDIR''@|$(HAVE_DECL_FDOPENDIR)|g' \
              -e 's|@''HAVE_FDOPENDIR''@|$(HAVE_FDOPENDIR)|g' \
              -e 's|@''HAVE_SCANDIR''@|$(HAVE_SCANDIR)|g' \
              -e 's|@''HAVE_ALPHASORT''@|$(HAVE_ALPHASORT)|g' \