bug-coreutils
[Top][All Lists]
Advanced

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

really fixed, this time [Re: GNU rm now works around Darwin 0.7.9 (MaxOS


From: Jim Meyering
Subject: really fixed, this time [Re: GNU rm now works around Darwin 0.7.9 (MaxOS X 10.3.9) readdir bug
Date: Fri, 29 Sep 2006 17:58:15 +0200

I hope this is the final iteration for a while.
Thanks to Bruno for helping to get this done right.

2006-09-29  Jim Meyering  <address@hidden>

        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.

Index: src/remove.c
===================================================================
RCS file: /fetish/cu/src/remove.c,v
retrieving revision 1.161
diff -u -r1.161 remove.c
--- src/remove.c        29 Sep 2006 09:54:24 -0000      1.161
+++ src/remove.c        29 Sep 2006 15:51:29 -0000
@@ -64,12 +64,11 @@
     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
   {
Index: m4/readdir.m4
===================================================================
RCS file: m4/readdir.m4
diff -N m4/readdir.m4
--- m4/readdir.m4       28 Sep 2006 21:03:58 -0000      1.19
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -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
-])
Index: m4/jm-macros.m4
===================================================================
RCS file: /fetish/cu/m4/jm-macros.m4,v
retrieving revision 1.245
diff -u -r1.245 jm-macros.m4
--- m4/jm-macros.m4     28 Sep 2006 21:03:15 -0000      1.245
+++ m4/jm-macros.m4     29 Sep 2006 15:44:45 -0000
@@ -45,7 +45,6 @@
   AC_REQUIRE([gl_PREREQ])

   AC_REQUIRE([AC_FUNC_FSEEKO])
-  AC_REQUIRE([gl_FUNC_READDIR])

   AC_CONFIG_LIBOBJ_DIR([lib])




reply via email to

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