glibc declares the dirfd() function in <dirent.h>. Here's a proposed patch to do the same in gnulib.
2008-10-18 Bruno Haible <[EMAIL PROTECTED]> * lib/dirfd.h: Remove file. * lib/dirent.in.h: Add placeholder for GL_LINK_WARNING. (dirfd): New declaration. * lib/dirfd.c: Include <dirent.h> instead of dirfd.h. * m4/dirfd.m4 (gl_FUNC_DIRFD): Require gl_DIRENT_H_DEFAULTS and AC_USE_SYSTEM_EXTENSIONS. Invoke gl_REPLACE_DIRENT_H. Set HAVE_DECL_DIRFD. * m4/dirent_h.m4 (gl_DIRENT_H_DEFAULTS): Initialize GNULIB_DIRFD and HAVE_DECL_DIRFD. * modules/dirfd (Files): Remove lib/dirfd.h. (Depends-on): Add dirent, extensions. (configure.ac): Invoke gl_DIRENT_MODULE_INDICATOR. (Include): Specify <dirent.h> instead of dirfd.h. * modules/dirent (Depends-on): Add link-warning. (Makefile.am): Substitute GNULIB_DIRFD, HAVE_DECL_DIRFD, and definition of GL_LINK_WARNING. * NEWS: Mention the change. * lib/fchdir.c: Don't include dirfd.h. * lib/fts.c: Likewise. * lib/getcwd.c: Likewise. * lib/glob.c: Likewise. --- lib/dirfd.h.orig 2008-10-19 02:53:10.000000000 +0200 +++ lib/dirfd.h 2003-09-23 19:59:22.000000000 +0200 @@ -1,28 +0,0 @@ -/* Declare dirfd, if necessary. - Copyright (C) 2001, 2002, 2006 Free Software Foundation, Inc. - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. - - Written by Jim Meyering. */ - -#include <sys/types.h> - -#include <dirent.h> - -#ifndef HAVE_DECL_DIRFD -"this configure-time declaration test was not run" -#endif -#if !HAVE_DECL_DIRFD && !defined dirfd -int dirfd (DIR const *); -#endif --- lib/dirent.in.h.orig 2008-10-19 02:53:10.000000000 +0200 +++ lib/dirent.in.h 2008-10-19 02:03:17.000000000 +0200 @@ -26,13 +26,15 @@ #ifndef _GL_DIRENT_H #define _GL_DIRENT_H +/* The definition of GL_LINK_WARNING is copied here. */ -/* Declare overridden functions. */ #ifdef __cplusplus extern "C" { #endif +/* Declare overridden functions. */ + #if @REPLACE_FCHDIR@ # define opendir rpl_opendir extern DIR * opendir (const char *); @@ -40,6 +42,22 @@ extern int closedir (DIR *); #endif +/* Declare GNU extensions. */ + +#if @GNULIB_DIRFD@ +# if [EMAIL PROTECTED]@ && !defined dirfd +/* Return the file descriptor associated with the given directory stream, + or -1 if none exists. */ +extern int dirfd (DIR const *dir); +# endif +#elif defined GNULIB_POSIXCHECK +# undef dirfd +# define dirfd(d) \ + (GL_LINK_WARNING ("dirfd is unportable - " \ + "use gnulib module dirfd for portability"), \ + dirfd (d)) +#endif + #ifdef __cplusplus } #endif --- lib/dirfd.c.orig 2008-10-19 02:53:10.000000000 +0200 +++ lib/dirfd.c 2008-10-19 02:11:44.000000000 +0200 @@ -1,6 +1,6 @@ /* dirfd.c -- return the file descriptor associated with an open DIR* - Copyright (C) 2001, 2006 Free Software Foundation, Inc. + Copyright (C) 2001, 2006, 2008 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -19,7 +19,7 @@ #include <config.h> -#include "dirfd.h" +#include <dirent.h> int dirfd (DIR const *dir_p) --- m4/dirfd.m4.orig 2008-10-19 02:53:10.000000000 +0200 +++ m4/dirfd.m4 2008-10-19 02:24:45.000000000 +0200 @@ -1,8 +1,8 @@ -#serial 14 -*- Autoconf -*- +#serial 15 -*- Autoconf -*- dnl Find out how to get the file descriptor associated with an open DIR*. -# Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006 Free Software +# Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2008 Free Software # Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -12,13 +12,23 @@ AC_DEFUN([gl_FUNC_DIRFD], [ + AC_REQUIRE([gl_DIRENT_H_DEFAULTS]) + gl_REPLACE_DIRENT_H + + dnl Persuade glibc <dirent.h> to declare dirfd(). + AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) + dnl Work around a bug of AC_EGREP_CPP in autoconf-2.57. AC_REQUIRE([AC_PROG_CPP]) AC_REQUIRE([AC_PROG_EGREP]) + AC_CHECK_FUNCS(dirfd) AC_CHECK_DECLS([dirfd], , , [#include <sys/types.h> #include <dirent.h>]) + if test $ac_cv_have_decl_dirfd = no; then + HAVE_DECL_DIRFD=0 + fi AC_CACHE_CHECK([whether dirfd is a macro], gl_cv_func_dirfd_macro, --- m4/dirent_h.m4.orig 2008-10-19 02:53:10.000000000 +0200 +++ m4/dirent_h.m4 2008-10-19 02:04:36.000000000 +0200 @@ -1,4 +1,4 @@ -# dirent_h.m4 serial 1 +# dirent_h.m4 serial 2 dnl Copyright (C) 2008 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -32,6 +32,8 @@ AC_DEFUN([gl_DIRENT_H_DEFAULTS], [ AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) dnl for REPLACE_FCHDIR + GNULIB_DIRFD=0; AC_SUBST([GNULIB_DIRFD]) dnl Assume proper GNU behavior unless another module says otherwise. - DIRENT_H=''; AC_SUBST([DIRENT_H]) + HAVE_DECL_DIRFD=1; AC_SUBST([HAVE_DECL_DIRFD]) + DIRENT_H=''; AC_SUBST([DIRENT_H]) ]) --- modules/dirfd.orig 2008-10-19 02:53:10.000000000 +0200 +++ modules/dirfd 2008-10-19 02:09:56.000000000 +0200 @@ -2,19 +2,21 @@ Retrieving the file descriptor of an open directory stream. (Unportable.) Files: -lib/dirfd.h lib/dirfd.c m4/dirfd.m4 Depends-on: +dirent +extensions configure.ac: gl_FUNC_DIRFD +gl_DIRENT_MODULE_INDICATOR([dirfd]) Makefile.am: Include: -"dirfd.h" +<dirent.h> License: LGPLv2+ --- modules/dirent.orig 2008-10-19 02:53:10.000000000 +0200 +++ modules/dirent 2008-10-19 02:02:34.000000000 +0200 @@ -8,6 +8,7 @@ Depends-on: include_next +link-warning configure.ac: gl_DIRENT_H @@ -23,7 +24,10 @@ sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''NEXT_DIRENT_H''@|$(NEXT_DIRENT_H)|g' \ + -e 's|@''GNULIB_DIRFD''@|$(GNULIB_DIRFD)|g' \ + -e 's|@''HAVE_DECL_DIRFD''@|$(HAVE_DECL_DIRFD)|g' \ -e 's|@''REPLACE_FCHDIR''@|$(REPLACE_FCHDIR)|g' \ + -e '/definition of GL_LINK_WARNING/r $(LINK_WARNING_H)' \ < $(srcdir)/dirent.in.h; \ } > [EMAIL PROTECTED] mv [EMAIL PROTECTED] $@ --- NEWS.orig 2008-10-19 02:53:10.000000000 +0200 +++ NEWS 2008-10-19 02:11:27.000000000 +0200 @@ -6,6 +6,9 @@ Date Modules Changes +2008-10-18 dirfd The include file is changed from "dirfd.h" to + <dirent.h>. + 2008-09-28 sockets When using this module, you now need to link with $(LIBSOCKET). --- lib/fchdir.c.orig 2008-10-19 02:53:10.000000000 +0200 +++ lib/fchdir.c 2008-10-19 02:12:30.000000000 +0200 @@ -19,6 +19,7 @@ /* Specification. */ #include <unistd.h> +#include <dirent.h> #include <errno.h> #include <fcntl.h> #include <stdarg.h> @@ -26,10 +27,8 @@ #include <string.h> #include <sys/types.h> #include <sys/stat.h> -#include <dirent.h> #include "canonicalize.h" -#include "dirfd.h" /* This replacement assumes that a directory is not renamed while opened through a file descriptor. */ --- lib/fts.c.orig 2008-10-19 02:53:10.000000000 +0200 +++ lib/fts.c 2008-10-19 02:14:17.000000000 +0200 @@ -62,7 +62,6 @@ #endif #include <fcntl.h> #include <errno.h> -#include "dirfd.h" #include <stdbool.h> #include <stdlib.h> #include <string.h> --- lib/getcwd.c.orig 2008-10-19 02:53:10.000000000 +0200 +++ lib/getcwd.c 2008-10-19 02:13:34.000000000 +0200 @@ -1,5 +1,4 @@ -/* Copyright (C) 1991,92,93,94,95,96,97,98,99,2004,2005,2006,2007 Free Software - Foundation, Inc. +/* Copyright (C) 1991-1999, 2004-2008 Free Software Foundation, Inc. This file is part of the GNU C Library. This program is free software: you can redistribute it and/or modify @@ -18,7 +17,6 @@ #if !_LIBC # include <config.h> # include <unistd.h> -# include "dirfd.h" #endif #include <errno.h> --- lib/glob.c.orig 2008-10-19 02:53:10.000000000 +0200 +++ lib/glob.c 2008-10-19 02:14:01.000000000 +0200 @@ -153,10 +153,6 @@ #include <fnmatch.h> -#ifndef _LIBC -# include "dirfd.h" -#endif - #ifdef _SC_GETPW_R_SIZE_MAX # define GETPW_R_SIZE_MAX() sysconf (_SC_GETPW_R_SIZE_MAX) #else