From 2bc0f3caaafeb240cdcfd050b7ad1fe0ad14addf Mon Sep 17 00:00:00 2001 From: Jim Meyering Date: Mon, 24 Aug 2009 08:21:47 +0200 Subject: cp: ignore obscure failure to preserve symlink time stamps, ...when run on a kernel older than what was implied by headers and libraries tested at configure time. * src/copy.c (utimens_symlink): Ignore failure when errno == ENOSYS. * NEWS (Bug fixes): Mention it. Reported by Todd Zullinger and Kamil Dudka. Details in this thread: http://thread.gmane.org/gmane.linux.redhat.fedora.devel/119834 --- NEWS | 6 ++++++ src/copy.c | 15 ++++++++++----- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/NEWS b/NEWS index 2c744b15d..c125b3194 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,12 @@ GNU coreutils NEWS -*- outline -*- * Noteworthy changes in release ?.? (????-??-??) [?] +** Bug fixes + + cp, mv now ignore failure to preserve a symlink time stamp, when it is + due to their running on a kernel older than what was implied by headers + and libraries tested at configure time. + * Noteworthy changes in release 7.5 (2009-08-20) [stable] diff --git a/src/copy.c b/src/copy.c index bf9230bb0..b5cf64c6a 100644 --- a/src/copy.c +++ b/src/copy.c @@ -123,13 +123,18 @@ 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 - return utimensat (AT_FDCWD, file, timespec, AT_SYMLINK_NOFOLLOW); -#else - /* Don't set errno=ENOTSUP here as we don't want - to output an error message for this case. */ - return 0; + err = utimensat (AT_FDCWD, file, timespec, AT_SYMLINK_NOFOLLOW); + /* 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; #endif + + return err; } /* Perform the O(1) btrfs clone operation, if possible. -- cgit v1.2.3-70-g09d2