changeset 10663:2b0380d48ff6

Move the dirfd() declaration to <dirent.h>.
author Bruno Haible <bruno@clisp.org>
date Sun, 19 Oct 2008 12:47:52 +0200
parents ad36db29dad7
children 3eb22f9808e0
files ChangeLog NEWS lib/dirent.in.h lib/dirfd.c lib/dirfd.h lib/fchdir.c lib/fts.c lib/getcwd.c lib/glob.c m4/dirent_h.m4 m4/dirfd.m4 modules/dirent modules/dirfd
diffstat 13 files changed, 76 insertions(+), 47 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,29 @@
+2008-10-18  Bruno Haible  <bruno@clisp.org>
+
+	* lib/fchdir.c: Don't include dirfd.h.
+	* lib/fts.c: Likewise.
+	* lib/getcwd.c: Likewise.
+	* lib/glob.c: Likewise.
+
+	Move the dirfd() declaration to <dirent.h>.
+	* 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.
+
 2008-10-18  Bruno Haible  <bruno@clisp.org>
 
 	Move the euidaccess() declaration to <unistd.h>.
--- a/NEWS
+++ b/NEWS
@@ -6,6 +6,9 @@
 
 Date        Modules         Changes
 
+2008-10-18  dirfd           The include file is changed from "dirfd.h" to
+                            <dirent.h>.
+
 2008-10-18  euidaccess      The include file is changed from "euidaccess.h"
                             to <unistd.h>.
 
--- a/lib/dirent.in.h
+++ b/lib/dirent.in.h
@@ -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 !@HAVE_DECL_DIRFD@ && !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
--- a/lib/dirfd.c
+++ b/lib/dirfd.c
@@ -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)
deleted file mode 100644
--- a/lib/dirfd.h
+++ /dev/null
@@ -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
--- a/lib/fchdir.c
+++ b/lib/fchdir.c
@@ -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.  */
--- a/lib/fts.c
+++ b/lib/fts.c
@@ -62,7 +62,6 @@
 #endif
 #include <fcntl.h>
 #include <errno.h>
-#include "dirfd.h"
 #include <stdbool.h>
 #include <stdlib.h>
 #include <string.h>
--- a/lib/getcwd.c
+++ b/lib/getcwd.c
@@ -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>
--- a/lib/glob.c
+++ b/lib/glob.c
@@ -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
--- a/m4/dirent_h.m4
+++ b/m4/dirent_h.m4
@@ -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])
 ])
--- a/m4/dirfd.m4
+++ b/m4/dirfd.m4
@@ -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,
--- a/modules/dirent
+++ b/modules/dirent
@@ -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; \
 	} > $@-t
 	mv $@-t $@
--- a/modules/dirfd
+++ b/modules/dirfd
@@ -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+