2006-10-05 Paul Eggert <eggert@cs.ucla.edu>
+ * fcntl_.h (O_NOFOLLOW): Don't depend on O_NOFOLLOW_IS_INEFFECTIVE;
+ we now test for that separately.
+ * fts.c (fts_safe_changedir): Inspect HAVE_WORKING_O_NOFOLLOW
+ rather than O_NOFOLLOW, when testing whether it's possible to
+ avoid a race condition reliably.
+ * savewd.c (savewd_chdir): Likewise.
+
Remove macros that are no longer needed now that stdint.h is
reliable.
* fsusage.c (UINTMAX_MAX): Remove.
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
+ #ifndef O_NOATIME
+ #define O_NOATIME 0
+ #endif
#ifndef O_NOFOLLOW
#define O_NOFOLLOW 0
#endif
O_NONBLOCK, O_SYNC, O_ACCMODE, O_RDONLY, O_RDWR, O_WRONLY
};
]],
- [[static char const sym[] = "conftest.sym";
- if (O_NOFOLLOW)
- {
- if (symlink (".", sym) != 0)
- return 1;
- if (0 <= open (sym, O_RDONLY | O_NOFOLLOW))
- return 1;
- }
- return !constants;]])],
+ [[
+ int status = !constants;
+ {
+ static char const sym[] = "conftest.sym";
+ if (symlink (".", sym) != 0
+ || close (open (sym, O_RDONLY | O_NOFOLLOW)) == 0)
+ status |= 32;
+ }
+ {
+ static char const file[] = "confdefs.h";
+ int fd = open (file, O_RDONLY | O_NOATIME);
+ char c;
+ struct stat st0, st1;
+ if (fd < 0
+ || fstat (fd, &st0) != 0
+ || sleep (1) != 0
+ || read (fd, &c, 1) != 1
+ || close (fd) != 0
+ || stat (file, &st1) != 0
+ || st1.st_mtime <= st0.st_mtime
+ || close (fd) != 0)
+ status |= 64;
+ }
+ return status;]])],
[gl_cv_header_working_fcntl_h=yes],
- [gl_cv_header_working_fcntl_h=no],
+ [case $? in #(
+ 32) gl_cv_header_working_fcntl_h='no (bad O_NOFOLLOW)';; #(
+ 64) gl_cv_header_working_fcntl_h='no (bad O_NOATIME)';; #(
+ 96) gl_cv_header_working_fcntl_h='no (bad O_NOATIME, O_NOFOLLOW)';; #(
+ *) gl_cv_header_working_fcntl_h='no';;
+ esac],
[gl_cv_header_working_fcntl_h=cross-compiling])])
- if test $gl_cv_header_working_fcntl_h != yes; then
- AC_DEFINE([O_NOFOLLOW_IS_INEFFECTIVE], 1,
- [Define to 1 if O_NOFOLLOW is ineffective.])
- fi
+ case $gl_cv_header_working_fcntl_h in #(
+ *O_NOATIME* | no | cross-compiling) ac_val=0;; #(
+ *) ac_val=1;;
+ esac
+ AC_DEFINE_UNQUOTED([HAVE_WORKING_O_NOATIME], [$ac_val],
+ [Define to 1 if O_NOATIME works.])
+
+ case $gl_cv_header_working_fcntl_h in #(
+ *O_NOFOLLOW* | no | cross-compiling) ac_val=0;; #(
+ *) ac_val=1;;
+ esac
+ AC_DEFINE_UNQUOTED([HAVE_WORKING_O_NOFOLLOW], [$ac_val],
+ [Define to 1 if O_NOFOLLOW works.])
gl_ABSOLUTE_HEADER([fcntl.h])
ABSOLUTE_FCNTL_H=\"$gl_cv_absolute_fcntl_h\"