summaryrefslogtreecommitdiff
path: root/tests/cp
diff options
context:
space:
mode:
authorPádraig Brady <P@draigBrady.com>2013-12-12 22:43:05 +0000
committerPádraig Brady <P@draigBrady.com>2013-12-13 02:28:47 +0000
commit10ffe43d68f085995de5b95a8b301a9b7170eac2 (patch)
treeb753df7a1637631da56648f9abaee793a87e7620 /tests/cp
parentcbdb4d77d9984a22505a36f6d9b3a42423cbdd1f (diff)
downloadcoreutils-10ffe43d68f085995de5b95a8b301a9b7170eac2.tar.xz
tests: restrict cp --link inode comparisons to compatible systems
* tests/cp/link-deref.sh: On systems were cp can't determine if gnulib linkat() emulation might create a symlink instead of a hardlink to a symlink, copy.c will create a symlink to the symlink so that it has more control over its metadata. Also even if the system supports this operation, the particular file system under test may not. So avoid the hardlinked symlink verification in these cases. This fixes a false failure on aix, solaris and freebsd.
Diffstat (limited to 'tests/cp')
-rwxr-xr-xtests/cp/link-deref.sh16
1 files changed, 16 insertions, 0 deletions
diff --git a/tests/cp/link-deref.sh b/tests/cp/link-deref.sh
index c12dfc882..89f7a3654 100755
--- a/tests/cp/link-deref.sh
+++ b/tests/cp/link-deref.sh
@@ -19,6 +19,18 @@
. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src
print_ver_ cp
+if grep '^#define HAVE_LINKAT 1' "$CONFIG_HEADER" > /dev/null \
+ && grep '^#define LINK_FOLLOWS_SYMLINKS 0' "$CONFIG_HEADER" > /dev/null; then
+ # With this config (which is the case on GNU/Linux) cp will attempt to
+ # linkat() to hardlink a symlink. So now see if the current file system
+ # supports this operation.
+ ln -s testtarget test_sl || framework_failure_
+ ln -P test_sl test_hl_sl || framework_failure_
+ ino_sl="$(stat -c '%i' test_sl)" || framework_failure_
+ ino_hl="$(stat -c '%i' test_hl_sl)" || framework_failure_
+ test "$ino_sl" = "$ino_hl" && can_hardlink_to_symlink=1
+fi
+
mkdir dir || framework_failure_
: > file || framework_failure_
ln -s dir dirlink || framework_failure_
@@ -39,6 +51,10 @@ for src in dirlink filelink danglink; do
typ_tgt="$(stat -c '%F' $tgt 2>/dev/null)" || typ_tgt=
for o in '' -L -H -P; do
+
+ # Skip the -P case where we don't or can't hardlink symlinks
+ ! test "$can_hardlink_to_symlink" && test "$o" = '-P' && continue
+
for r in '' -R; do
command="cp --link $o $r $src dst"