3 dnl SunOS's readdir is broken in such a way that rm.c has to add extra code
4 dnl to test whether a NULL return value really means there are no more files
7 dnl Detect the problem by creating a directory containing 300 files (254 not
8 dnl counting . and .. is the minimum) and see if a loop doing `readdir; unlink'
9 dnl removes all of them.
11 dnl Define HAVE_WORKING_READDIR if readdir does *not* have this problem.
13 dnl Written by Jim Meyering.
15 AC_DEFUN(jm_FUNC_READDIR,
17 AC_REQUIRE([AC_HEADER_DIRENT])
18 AC_CHECK_HEADERS(string.h)
19 AC_CACHE_CHECK([for working readdir], jm_cv_func_working_readdir,
21 # Arrange for deletion of the temporary directory this test creates, in
22 # case the test itself fails to delete everything -- as happens on Sunos.
23 ac_clean_files="$ac_clean_files conf-dir"
26 changequote(<<, >>)dnl
29 # include <sys/types.h>
36 # define NLENGTH(direct) (strlen((direct)->d_name))
37 # else /* not HAVE_DIRENT_H */
38 # define dirent direct
39 # define NLENGTH(direct) ((direct)->d_namlen)
40 # ifdef HAVE_SYS_NDIR_H
41 # include <sys/ndir.h>
42 # endif /* HAVE_SYS_NDIR_H */
43 # ifdef HAVE_SYS_DIR_H
45 # endif /* HAVE_SYS_DIR_H */
48 # endif /* HAVE_NDIR_H */
49 # endif /* HAVE_DIRENT_H */
51 # define DOT_OR_DOTDOT(Basename) \
52 (Basename[0] == '.' && (Basename[1] == '\0' \
53 || (Basename[1] == '.' && Basename[2] == '\0')))
56 create_300_file_dir (const char *dir)
60 if (mkdir (dir, 0700))
65 for (i = 0; i < 300; i++)
70 sprintf (file_name, "%03d", i);
71 out = fopen (file_name, "w");
74 if (fclose (out) == EOF)
83 remove_dir (const char *dir)
96 struct dirent *dp = readdir (dirp);
100 if (DOT_OR_DOTDOT (dp->d_name))
103 if (unlink (dp->d_name))
118 const char *dir = "conf-dir";
119 create_300_file_dir (dir);
125 jm_cv_func_working_readdir=yes,
126 jm_cv_func_working_readdir=no,
127 jm_cv_func_working_readdir=no)])
129 if test $jm_cv_func_working_readdir = yes; then
130 AC_DEFINE_UNQUOTED(HAVE_WORKING_READDIR, 1,
131 [Define if readdir is found to work properly in some unusual cases. ])