1
0
mirror of git://git.sv.gnu.org/coreutils.git synced 2026-02-12 18:32:08 +02:00

[ChangeLog]

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.
[m4/ChangeLog]
* readdir.m4: Remove file once again.
* jm-macros.m4: Remove reference to gl_FUNC_READDIR.
This commit is contained in:
Jim Meyering
2006-09-29 15:58:04 +00:00
parent af46184a80
commit 31c77a2fde
5 changed files with 15 additions and 145 deletions

View File

@@ -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.

View File

@@ -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.

View File

@@ -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])

View File

@@ -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
])

View File

@@ -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
{