Todd Zullinger wrote: > I tried to build a git update into dist-f12-openssl earlier and had it > die in %doc with an error from cp¹: > > cp: preserving times for > `/builddir/build/BUILDROOT/git-1.6.4.1-1.fc12.i386/usr/share/doc/git-1.6.4.1/contrib/hooks': > Function not implemented
Hi Todd, This is because that latest version of coreutils tries to preserve permissions on symlinks when it thinks that is possible. It determines whether to try by testing at configure time for the existence of the utimensat function. If it can compile and link against that function, then the resulting executable will call it and report any failure. The trouble is when you configure on a system with recent libraries and headers, yet *run* with a kernel that is old enough as to lack the syscall. Normally in coreutils, I try not to pollute the tools with run-time work-around code that will be obsolete in a few years, but this time, it appears to be required, due to the distance between koji's build and run-time environments. The solution is probably something like this: >From 57d640722e04352a468cc595b0b94dbceaec4871 Mon Sep 17 00:00:00 2001 From: Jim Meyering <meyer...@redhat.com> Date: Mon, 24 Aug 2009 08:21:47 +0200 Subject: [PATCH] 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. --- NEWS | 6 ++++++ src/copy.c | 8 +++++++- 2 files changed, 13 insertions(+), 1 deletions(-) diff --git a/NEWS b/NEWS index 2c744b1..c125b31 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 bf9230b..8fc4b68 100644 --- a/src/copy.c +++ b/src/copy.c @@ -124,7 +124,13 @@ static inline int utimens_symlink (char const *file, struct timespec const *timespec) { #if HAVE_UTIMENSAT - return utimensat (AT_FDCWD, file, timespec, AT_SYMLINK_NOFOLLOW); + int 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 ENOTSUP. Ignore that. */ + if (err && errno == ENOSYS) + err = 0; + return err; #else /* Don't set errno=ENOTSUP here as we don't want to output an error message for this case. */ -- 1.6.4.378.g88f2f -- fedora-devel-list mailing list fedora-devel-list@redhat.com https://www.redhat.com/mailman/listinfo/fedora-devel-list