-#serial 1
-
-dnl FIXME: describe
-
-AC_DEFUN(jm_FUNC_READDIR,
+#serial 8
+
+# Copyright (C) 1997, 1999, 2000, 2001, 2002, 2003 Free Software
+# Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+dnl SunOS's readdir is broken in such a way that rm.c has to add extra code
+dnl to test whether a NULL return value really means there are no more files
+dnl in the directory.
+dnl
+dnl And the rm from coreutils-5.0 exposes a similar problem when there
+dnl are 338 or more files in a directory on a Darwin-6.5 system
+dnl
+dnl Detect the problem by creating a directory containing 500 files (254 not
+dnl counting . and .. is the minimum for SunOS, 338 for Darwin) and see
+dnl if a loop doing `readdir; unlink' removes all of them.
+dnl
+dnl Define HAVE_WORKING_READDIR if readdir does *not* have this problem.
+
+dnl Written by Jim Meyering.
+
+AC_DEFUN([GL_FUNC_READDIR],
[dnl
AC_REQUIRE([AC_HEADER_DIRENT])
-AC_CHECK_HEADERS(string.h)
-AC_CACHE_CHECK([for working readdir], jm_cv_func_working_readdir,
- [AC_TRY_RUN(
- changequote(<<, >>)dnl
- <<
-# include <stdio.h>
+AC_CACHE_CHECK([for working readdir], gl_cv_func_working_readdir,
+ [dnl
+ # Arrange for deletion of the temporary directory this test creates, in
+ # case the test itself fails to delete everything -- as happens on Sunos.
+ ac_clean_files="$ac_clean_files conf-dir"
+
+ AC_TRY_RUN(
+[# include <stdio.h>
# include <sys/types.h>
-# if HAVE_STRING_H
-# include <string.h>
-# endif
+# include <string.h>
# ifdef HAVE_DIRENT_H
# include <dirent.h>
(Basename[0] == '.' && (Basename[1] == '\0' \
|| (Basename[1] == '.' && Basename[2] == '\0')))
+/* Don't try to use replacement mkdir; it wouldn't resolve at link time. */
+# undef mkdir
+
static void
- create_300_file_dir (const char *dir)
+ create_N_file_dir (const char *dir, size_t n_files)
{
- int i;
+ unsigned int i;
if (mkdir (dir, 0700))
- exit (1);
+ abort ();
if (chdir (dir))
- exit (1);
+ abort ();
- for (i = 0; i < 300; i++)
+ for (i = 0; i < n_files; i++)
{
char file_name[4];
FILE *out;
sprintf (file_name, "%03d", i);
out = fopen (file_name, "w");
if (!out)
- exit (1);
+ abort ();
if (fclose (out) == EOF)
- exit (1);
+ abort ();
}
if (chdir (".."))
- exit (1);
+ abort ();
}
static void
DIR *dirp;
if (chdir (dir))
- exit (1);
+ abort ();
dirp = opendir (".");
if (dirp == NULL)
- exit (1);
+ abort ();
while (1)
{
continue;
if (unlink (dp->d_name))
- exit (1);
+ abort ();
}
closedir (dirp);
if (chdir (".."))
- exit (1);
+ abort ();
if (rmdir (dir))
exit (1);
main ()
{
const char *dir = "conf-dir";
- create_300_file_dir (dir);
+ create_N_file_dir (dir, 500);
remove_dir (dir);
exit (0);
- }
- >>,
- changequote([, ])dnl
- jm_cv_func_working_readdir=yes,
- jm_cv_func_working_readdir=no,
- jm_cv_func_working_readdir=no)])
-
- if test x = y; then
- dnl This code is deliberately never run via ./configure.
- dnl FIXME: this is a gross hack to make autoheader put an entry
- dnl for this HAVE_-prefixed symbol in config.h.in.
- AC_CHECK_FUNCS(WORKING_READDIR)
- fi
-
- if test $jm_cv_func_working_readdir = yes; then
- ac_kludge=HAVE_WORKING_READDIR
- AC_DEFINE_UNQUOTED($ac_kludge)
+ }],
+ gl_cv_func_working_readdir=yes,
+ gl_cv_func_working_readdir=no,
+ gl_cv_func_working_readdir=no)])
+
+ if test $gl_cv_func_working_readdir = yes; then
+ AC_DEFINE(HAVE_WORKING_READDIR, 1,
+ [Define if readdir is found to work properly in some unusual cases. ])
fi
])