#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 <stdio.h>
int i;
if (mkdir (dir, 0700))
- exit (1);
+ abort ();
if (chdir (dir))
- exit (1);
+ abort ();
for (i = 0; i < 300; i++)
{
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);
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)