summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--m4/ChangeLog5
-rw-r--r--m4/jm-macros.m41
-rw-r--r--m4/readdir.m4139
-rw-r--r--src/remove.c9
5 files changed, 15 insertions, 145 deletions
diff --git a/ChangeLog b/ChangeLog
index 1dc726e19..d22566f66 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
2006-09-29 Jim Meyering <jim@meyering.net>
+ Since any system may be affected by the Darwin readdir bug,
+ perform the extra rewinddir unconditionally. The performance
+ impact of rewinding a directory is negligible.
+ * src/remove.c (NEED_REWIND): Define to use
+ CONSECUTIVE_READDIR_UNLINK_THRESHOLD unconditionally.
+
* tests/seq/basic: Use .11 as the upper bound, in case the ".1"
increment translates to a slightly larger value.
This corrects a test failure on FreeBSD 6.1 reported by Nelson Beebe.
diff --git a/m4/ChangeLog b/m4/ChangeLog
index 0d45148ed..c103d9807 100644
--- a/m4/ChangeLog
+++ b/m4/ChangeLog
@@ -1,3 +1,8 @@
+2006-09-29 Jim Meyering <jim@meyering.net>
+
+ * readdir.m4: Remove file once again.
+ * jm-macros.m4: Remove reference to gl_FUNC_READDIR.
+
2006-09-28 Jim Meyering <jim@meyering.net>
* jm-macros.m4: Require the new macro.
diff --git a/m4/jm-macros.m4 b/m4/jm-macros.m4
index 199e5c782..e0188e66b 100644
--- a/m4/jm-macros.m4
+++ b/m4/jm-macros.m4
@@ -45,7 +45,6 @@ AC_DEFUN([gl_MACROS],
AC_REQUIRE([gl_PREREQ])
AC_REQUIRE([AC_FUNC_FSEEKO])
- AC_REQUIRE([gl_FUNC_READDIR])
AC_CONFIG_LIBOBJ_DIR([lib])
diff --git a/m4/readdir.m4 b/m4/readdir.m4
deleted file mode 100644
index b0a6fb436..000000000
--- a/m4/readdir.m4
+++ /dev/null
@@ -1,139 +0,0 @@
-#serial 9
-
-# Copyright (C) 1997, 1999, 2000, 2001, 2002, 2003, 2006 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_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>
-# include <string.h>
-
-# ifdef HAVE_DIRENT_H
-# include <dirent.h>
-# define NLENGTH(direct) (strlen((direct)->d_name))
-# else /* not HAVE_DIRENT_H */
-# define dirent direct
-# define NLENGTH(direct) ((direct)->d_namlen)
-# ifdef HAVE_SYS_NDIR_H
-# include <sys/ndir.h>
-# endif /* HAVE_SYS_NDIR_H */
-# ifdef HAVE_SYS_DIR_H
-# include <sys/dir.h>
-# endif /* HAVE_SYS_DIR_H */
-# ifdef HAVE_NDIR_H
-# include <ndir.h>
-# endif /* HAVE_NDIR_H */
-# endif /* HAVE_DIRENT_H */
-
-# define DOT_OR_DOTDOT(Basename) \
- (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_N_file_dir (const char *dir, size_t n_files)
- {
- unsigned int i;
-
- if (mkdir (dir, 0700))
- abort ();
- if (chdir (dir))
- abort ();
-
- 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)
- abort ();
- if (fclose (out) == EOF)
- abort ();
- }
-
- if (chdir (".."))
- abort ();
- }
-
- static void
- remove_dir (const char *dir)
- {
- DIR *dirp;
-
- if (chdir (dir))
- abort ();
-
- dirp = opendir (".");
- if (dirp == NULL)
- abort ();
-
- while (1)
- {
- struct dirent *dp = readdir (dirp);
- if (dp == NULL)
- break;
-
- if (DOT_OR_DOTDOT (dp->d_name))
- continue;
-
- if (unlink (dp->d_name))
- abort ();
- }
- closedir (dirp);
-
- if (chdir (".."))
- abort ();
-
- if (rmdir (dir))
- exit (1);
- }
-
- int
- main ()
- {
- const char *dir = "conf-dir";
- create_N_file_dir (dir, 500);
- remove_dir (dir);
- exit (0);
- }],
- 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
-])
diff --git a/src/remove.c b/src/remove.c
index 1ea7773f7..1fcf79ff3 100644
--- a/src/remove.c
+++ b/src/remove.c
@@ -64,12 +64,11 @@ enum
CONSECUTIVE_READDIR_UNLINK_THRESHOLD = 10
};
-#ifdef HAVE_WORKING_READDIR
-# define NEED_REWIND(readdir_unlink_count) 0
-#else
-# define NEED_REWIND(readdir_unlink_count) \
+/* FIXME: in 2009, or whenever Darwin 7.9.0 (aka MacOS X 10.3.9) is no
+ longer relevant, remove this work-around code. Then, there will be
+ no need to perform the extra rewinddir call, ever. */
+#define NEED_REWIND(readdir_unlink_count) \
(CONSECUTIVE_READDIR_UNLINK_THRESHOLD <= (readdir_unlink_count))
-#endif
enum Ternary
{