changeset 8796:89e066e48000

* m4/d-ino.m4 (gl_CHECK_TYPE_STRUCT_DIRENT_D_INO): Test whether readdir returns garbage in d_ino. Problem reported by Kaz Sasayama in <http://lists.gnu.org/archive/html/bug-gnulib/2007-05/msg00021.html>.
author Paul Eggert <eggert@cs.ucla.edu>
date Wed, 02 May 2007 19:06:46 +0000
parents 38a423116341
children 339ca8e82188
files ChangeLog m4/d-ino.m4
diffstat 2 files changed, 28 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2007-05-02  Paul Eggert  <eggert@cs.ucla.edu>
+
+	* m4/d-ino.m4 (gl_CHECK_TYPE_STRUCT_DIRENT_D_INO): Test whether
+	readdir returns garbage in d_ino.  Problem reported by Kaz Sasayama in
+	<http://lists.gnu.org/archive/html/bug-gnulib/2007-05/msg00021.html>.
+
 2007-05-02  Sergey Poznyakoff  <gray@gnu.org.ua>
 
 	* lib/argp-help.c (struct hol_entry): New member `ord'.
--- a/m4/d-ino.m4
+++ b/m4/d-ino.m4
@@ -1,11 +1,11 @@
-#serial 8
+#serial 9
 
 dnl From Jim Meyering.
 dnl
 dnl Check whether struct dirent has a member named d_ino.
 dnl
 
-# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2006 Free Software
+# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2006, 2007 Free Software
 # Foundation, Inc.
 
 # This file is free software; the Free Software Foundation
@@ -14,19 +14,26 @@
 
 AC_DEFUN([gl_CHECK_TYPE_STRUCT_DIRENT_D_INO],
   [AC_CACHE_CHECK([for d_ino member in directory struct],
-		  jm_cv_struct_dirent_d_ino,
-     [AC_TRY_LINK(dnl
-       [
-#include <sys/types.h>
-#include <dirent.h>
-       ],
-       [struct dirent dp; dp.d_ino = 0;],
-
-       jm_cv_struct_dirent_d_ino=yes,
-       jm_cv_struct_dirent_d_ino=no)
-     ]
-   )
-   if test $jm_cv_struct_dirent_d_ino = yes; then
+		  gl_cv_struct_dirent_d_ino,
+     [AC_RUN_IFELSE(
+	[AC_LANG_PROGRAM(
+	   [[#include <sys/types.h>
+	     #include <sys/stat.h>
+	     #include <dirent.h>
+	   ]],
+	   [[DIR *dp = opendir (".");
+	     struct dirent *e;
+	     struct stat st;
+	     if (! dp)
+	       return 1;
+	     e = readdir (dp);
+	     return ! (e
+		       && stat (e->d_name, &st) == 0
+		       && e->d_ino == st.st_ino);]])],
+	    [gl_cv_struct_dirent_d_ino=yes],
+	    [gl_cv_struct_dirent_d_ino=no],
+	    [gl_cv_struct_dirent_d_ino=no])])
+   if test $gl_cv_struct_dirent_d_ino = yes; then
      AC_DEFINE(D_INO_IN_DIRENT, 1,
        [Define if there is a member named d_ino in the struct describing
         directory headers.])