diff options
author | Pádraig Brady <P@draigBrady.com> | 2011-03-31 11:28:58 +0100 |
---|---|---|
committer | Pádraig Brady <P@draigBrady.com> | 2011-04-01 14:17:27 +0100 |
commit | 594292a1d89332dd006cd7fe3116cf46ebe9acf6 (patch) | |
tree | 75db5403a519f0e3c501129f1302af352e0827e5 /tests | |
parent | 0ec711b5c4c5094fa206115a666e5878f463a07f (diff) | |
download | coreutils-594292a1d89332dd006cd7fe3116cf46ebe9acf6.tar.xz |
copy: link rather than copy symlinks, when --link used
This bug was introduced in commit ca9e212c, 2009-09-24,
"cp, mv: use linkat to guarantee semantics", which
inadvertently disabled the creation of hardlinks to symlinks.
However rather than implementing the intention of that commit
and relying on gnulib linkat emulation, we'll revert to the
previous emulation as that maintains ownership and timestamps.
* src/copy.c (copy_internal): Use our existing hardlink to
symlink emulation when link() might dereference the symlink.
Also ensure that we copy the timestamps of the original symlink
when we use the emulation.
* tests/cp/link-symlink: Add a test to ensure timestamps copied.
* tests/Makefile.am: Reference the new test.
* NEWS: Mention the fix.
Reported by Ruediger Meier
Diffstat (limited to 'tests')
-rw-r--r-- | tests/Makefile.am | 1 | ||||
-rwxr-xr-x | tests/cp/link-symlink | 41 |
2 files changed, 42 insertions, 0 deletions
diff --git a/tests/Makefile.am b/tests/Makefile.am index 99b46e8e8..e7f3fffb1 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -328,6 +328,7 @@ TESTS = \ cp/link \ cp/link-no-deref \ cp/link-preserve \ + cp/link-symlink \ cp/no-deref-link1 \ cp/no-deref-link2 \ cp/no-deref-link3 \ diff --git a/tests/cp/link-symlink b/tests/cp/link-symlink new file mode 100755 index 000000000..443b337db --- /dev/null +++ b/tests/cp/link-symlink @@ -0,0 +1,41 @@ +#!/bin/sh +# Ensure that cp -a --link maintains timestamps if possible + +# Copyright (C) 2011 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src +print_ver_ cp + +# Check that the timestamps of the symlink are copied +# if we're using hardlink to symlink emulation. +touch file +ln -s file link || framework_failure +touch -m -h -d 2011-01-01 link || + skip_test_ "Your system doesn't support updating symlink timestamps" +case `stat --format=%y link` in + 2011-01-01*) ;; + *) skip_test_ "Your system doesn't support updating symlink timestamps" ;; +esac + +# link.cp is probably a hardlink, but may also be a symlink +# In either case the timestamp should match the original. +cp -al link link.cp +case `stat --format=%y link.cp` in + 2011-01-01*) ;; + *) fail=1 ;; +esac + +Exit $fail |