copy: allow symlink timestamp preservation on more systems
authorEric Blake <ebb9@byu.net>
Thu, 8 Oct 2009 21:57:06 +0000 (15:57 -0600)
committerEric Blake <ebb9@byu.net>
Sat, 10 Oct 2009 21:16:52 +0000 (15:16 -0600)
* src/copy.c (utimens_symlink): Simplify by using lutimens.
* m4/jm-macros.m4 (coreutils_MACROS): Drop utimensat; gnulib does
this for us.
* tests/cp/preserve-slink-time: Recognize lutimes support.

m4/jm-macros.m4
src/copy.c
tests/cp/preserve-slink-time

index f4d43f1..8339404 100644 (file)
@@ -89,9 +89,6 @@ AC_DEFUN([coreutils_MACROS],
     tcgetpgrp \
   )
 
-  # for cp.c
-  AC_CHECK_FUNCS_ONCE([utimensat])
-
   dnl This can't use AC_REQUIRE; I'm not quite sure why.
   cu_PREREQ_STAT_PROG
 
index 49e620a..0a8b0e4 100644 (file)
@@ -123,20 +123,12 @@ static char const *top_level_dst_name;
 static inline int
 utimens_symlink (char const *file, struct timespec const *timespec)
 {
-  int err = 0;
-
-#if HAVE_UTIMENSAT
-  err = utimensat (AT_FDCWD, file, timespec, AT_SYMLINK_NOFOLLOW);
+  int err = lutimens (file, timespec);
   /* When configuring on a system with new headers and libraries, and
      running on one with a kernel that is old enough to lack the syscall,
      utimensat fails with ENOSYS.  Ignore that.  */
   if (err && errno == ENOSYS)
     err = 0;
-#else
-  (void) file;
-  (void) timespec;
-#endif
-
   return err;
 }
 
index c5c21a5..407b772 100755 (executable)
@@ -24,6 +24,7 @@ fi
 . $srcdir/test-lib.sh
 
 grep '^#define HAVE_UTIMENSAT' "$CONFIG_HEADER" > /dev/null ||
+grep '^#define HAVE_LUTIMES' "$CONFIG_HEADER" > /dev/null ||
   skip_test_ 'this system lacks the utimensat function'
 
 ln -s no-such dangle || framework_failure
@@ -34,6 +35,7 @@ case $(stat --format=%y dangle) in
   ??:??:??.000000000) sleep 2;;
 esac
 
+# Can't use --format=%x, as lstat() modifies atime on some platforms.
 cp -Pp dangle d2 || framework_failure
 stat --format=%y dangle > t1 || framework_failure
 stat --format=%y d2 > t2 || framework_failure