X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=m4%2Freaddir.m4;h=2c4bbab9623479fec7e2144642cabba8b014e676;hb=455b3a9a5e1861152fe403dea25636586d256544;hp=0bfc459d657a24e4c0a4571adf43c9e0f2e16231;hpb=964b557add9b71f98f4a8e13084374d2f24e96a8;p=gnulib.git diff --git a/m4/readdir.m4 b/m4/readdir.m4 index 0bfc459d6..2c4bbab96 100644 --- a/m4/readdir.m4 +++ b/m4/readdir.m4 @@ -1,16 +1,29 @@ -#serial 1 +#serial 5 -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. -AC_DEFUN(jm_FUNC_READDIR, +dnl Written by Jim Meyering. + +AC_DEFUN([jm_FUNC_READDIR], [dnl AC_REQUIRE([AC_HEADER_DIRENT]) -AC_CHECK_HEADERS(string.h) +AC_CHECK_HEADERS_ONCE(string.h) AC_CACHE_CHECK([for working readdir], jm_cv_func_working_readdir, - [AC_TRY_RUN( - changequote(<<, >>)dnl - << -# include + [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 # include # if HAVE_STRING_H # include @@ -37,15 +50,18 @@ AC_CACHE_CHECK([for working readdir], jm_cv_func_working_readdir, (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_300_file_dir (const char *dir) { int i; if (mkdir (dir, 0700)) - exit (1); + abort (); if (chdir (dir)) - exit (1); + abort (); for (i = 0; i < 300; i++) { @@ -55,13 +71,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 +86,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 +102,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); @@ -104,22 +120,13 @@ AC_CACHE_CHECK([for working readdir], jm_cv_func_working_readdir, create_300_file_dir (dir); remove_dir (dir); exit (0); - } - >>, - changequote([, ])dnl + }], jm_cv_func_working_readdir=yes, jm_cv_func_working_readdir=no, jm_cv_func_working_readdir=no)]) - if test x = y; then - dnl This code is deliberately never run via ./configure. - dnl FIXME: this is a gross hack to make autoheader put an entry - dnl for this HAVE_-prefixed symbol in config.h.in. - 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) + AC_DEFINE(HAVE_WORKING_READDIR, 1, + [Define if readdir is found to work properly in some unusual cases. ]) fi ])