# HG changeset patch # User Paul Eggert # Date 1160084290 0 # Node ID e23b1333a117dd51319d2bea370c5720be48f5bf # Parent cb56735ed8f5597d31905e49330e1aaf7da01175 [lib/ChangeLog] * 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. [m4/ChangeLog] * fcntl_h.m4 (gl_FCNTL_H): Define HAVE_WORKING_O_NOFOLLOW instead of O_NOFOLLOW_IS_INEFFECTIVE. Define HAVE_WORKING_O_NOATIME if O_NOATIME works. diff --git a/lib/ChangeLog b/lib/ChangeLog --- a/lib/ChangeLog +++ b/lib/ChangeLog @@ -1,5 +1,12 @@ 2006-10-05 Paul Eggert + * 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. diff --git a/lib/fcntl_.h b/lib/fcntl_.h --- a/lib/fcntl_.h +++ b/lib/fcntl_.h @@ -59,9 +59,6 @@ # define O_NOCTTY 0 #endif -#ifdef O_NOFOLLOW_IS_INEFFECTIVE -# undef O_NOFOLLOW -#endif #ifndef O_NOFOLLOW # define O_NOFOLLOW 0 #endif diff --git a/lib/fts.c b/lib/fts.c --- a/lib/fts.c +++ b/lib/fts.c @@ -1421,7 +1421,7 @@ general (when the target is not ".."), diropen's use of O_NOFOLLOW ensures we don't mistakenly follow a symlink, so we can avoid the expense of this fstat. */ - if (ISSET(FTS_LOGICAL) || O_NOFOLLOW == 0 + if (ISSET(FTS_LOGICAL) || ! HAVE_WORKING_O_NOFOLLOW || (dir && STREQ (dir, ".."))) { struct stat sb; diff --git a/lib/savewd.c b/lib/savewd.c --- a/lib/savewd.c +++ b/lib/savewd.c @@ -103,7 +103,8 @@ /* Open the directory if requested, or if avoiding a race condition is requested and possible. */ - if (open_result || (options & (O_NOFOLLOW ? SAVEWD_CHDIR_NOFOLLOW : 0))) + if (open_result + || (options & (HAVE_WORKING_O_NOFOLLOW ? SAVEWD_CHDIR_NOFOLLOW : 0))) { fd = open (dir, (O_RDONLY | O_DIRECTORY | O_NOCTTY | O_NONBLOCK diff --git a/m4/ChangeLog b/m4/ChangeLog --- a/m4/ChangeLog +++ b/m4/ChangeLog @@ -1,3 +1,9 @@ +2006-10-05 Paul Eggert + + * fcntl_h.m4 (gl_FCNTL_H): Define HAVE_WORKING_O_NOFOLLOW instead + of O_NOFOLLOW_IS_INEFFECTIVE. Define HAVE_WORKING_O_NOATIME if + O_NOATIME works. + 2006-10-01 Bruno Haible Make it possible to invoke AC_GNU_SOURCE after gl_LOCK_EARLY. diff --git a/m4/fcntl_h.m4 b/m4/fcntl_h.m4 --- a/m4/fcntl_h.m4 +++ b/m4/fcntl_h.m4 @@ -15,6 +15,9 @@ #include #include #include + #ifndef O_NOATIME + #define O_NOATIME 0 + #endif #ifndef O_NOFOLLOW #define O_NOFOLLOW 0 #endif @@ -24,23 +27,52 @@ 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\"