bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

declare dirfd() in dirent.h


From: Bruno Haible
Subject: declare dirfd() in dirent.h
Date: Sun, 19 Oct 2008 03:06:09 +0200
User-agent: KMail/1.5.4

glibc declares the dirfd() function in <dirent.h>. Here's a proposed patch
to do the same in gnulib.

2008-10-18  Bruno Haible  <address@hidden>

        * 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 address@hidden@ && !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; \
        } > address@hidden
        mv address@hidden $@
--- 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





reply via email to

[Prev in Thread] Current Thread [Next in Thread]