summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Blake <ebb9@byu.net>2009-10-08 15:57:06 -0600
committerEric Blake <ebb9@byu.net>2009-10-10 09:14:35 -0600
commit82e344ca09dbc3f168ee598749e751373161ce30 (patch)
treefa5497649b0847e3ef8d1ca42a2129c25e2036ae
parent2cd157755422a0317564af844e1886742cd2d4e7 (diff)
downloadcoreutils-82e344ca09dbc3f168ee598749e751373161ce30.tar.gz
copy: allow symlink timestamp preservation on more systems
* 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.
-rw-r--r--m4/jm-macros.m43
-rw-r--r--src/copy.c10
-rwxr-xr-xtests/cp/preserve-slink-time2
3 files changed, 3 insertions, 12 deletions
diff --git a/m4/jm-macros.m4 b/m4/jm-macros.m4
index f4d43f1dd..833940469 100644
--- a/m4/jm-macros.m4
+++ b/m4/jm-macros.m4
@@ -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
diff --git a/src/copy.c b/src/copy.c
index 49e620afd..0a8b0e41d 100644
--- a/src/copy.c
+++ b/src/copy.c
@@ -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;
}
diff --git a/tests/cp/preserve-slink-time b/tests/cp/preserve-slink-time
index c5c21a5e1..407b77272 100755
--- a/tests/cp/preserve-slink-time
+++ b/tests/cp/preserve-slink-time
@@ -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