X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=m4%2Freaddir.m4;h=d2b1a557e121dca3b90dbaf10d4bc5d2001ae518;hb=eb53ea1e9a470b4e336c7a954375f8d59d4a14f6;hp=0bfc459d657a24e4c0a4571adf43c9e0f2e16231;hpb=964b557add9b71f98f4a8e13084374d2f24e96a8;p=gnulib.git diff --git a/m4/readdir.m4 b/m4/readdir.m4 index 0bfc459d6..d2b1a557e 100644 --- a/m4/readdir.m4 +++ b/m4/readdir.m4 @@ -1,13 +1,28 @@ #serial 1 -dnl FIXME: describe +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 Detect the problem by creating a directory containing 300 files (254 not +dnl counting . and .. is the minimum) and see if a loop doing `readdir; unlink' +dnl removes all of them. +dnl +dnl Define HAVE_WORKING_READDIR if readdir does *not* have this problem. + +dnl Written by Jim Meyering. AC_DEFUN(jm_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( + [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( changequote(<<, >>)dnl << # include @@ -43,9 +58,9 @@ AC_CACHE_CHECK([for working readdir], jm_cv_func_working_readdir, int i; if (mkdir (dir, 0700)) - exit (1); + abort (); if (chdir (dir)) - exit (1); + abort (); for (i = 0; i < 300; i++) { @@ -55,13 +70,13 @@ AC_CACHE_CHECK([for working readdir], jm_cv_func_working_readdir, 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 @@ -70,11 +85,11 @@ AC_CACHE_CHECK([for working readdir], jm_cv_func_working_readdir, DIR *dirp; if (chdir (dir)) - exit (1); + abort (); dirp = opendir ("."); if (dirp == NULL) - exit (1); + abort (); while (1) { @@ -86,12 +101,12 @@ AC_CACHE_CHECK([for working readdir], jm_cv_func_working_readdir, continue; if (unlink (dp->d_name)) - exit (1); + abort (); } closedir (dirp); if (chdir ("..")) - exit (1); + abort (); if (rmdir (dir)) exit (1); @@ -118,6 +133,7 @@ AC_CACHE_CHECK([for working readdir], jm_cv_func_working_readdir, 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)