1#!/bin/sh 2# ensure that 'cp -d' preserves hard-links between command line arguments 3# ensure that --preserve=links works with -RH and -RL 4 5# Copyright (C) 2001-2023 Free Software Foundation, Inc. 6 7# This program is free software: you can redistribute it and/or modify 8# it under the terms of the GNU General Public License as published by 9# the Free Software Foundation, either version 3 of the License, or 10# (at your option) any later version. 11 12# This program is distributed in the hope that it will be useful, 13# but WITHOUT ANY WARRANTY; without even the implied warranty of 14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15# GNU General Public License for more details. 16 17# You should have received a copy of the GNU General Public License 18# along with this program. If not, see <https://www.gnu.org/licenses/>. 19 20. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src 21print_ver_ cp 22 23touch a || framework_failure_ 24ln a b || framework_failure_ 25mkdir c || framework_failure_ 26cp -d a b c || framework_failure_ 27test -f c/a || framework_failure_ 28test -f c/b || framework_failure_ 29 30 31a_inode=$(ls -i c/a|sed 's,c/.*,,') 32b_inode=$(ls -i c/b|sed 's,c/.*,,') 33test "$a_inode" = "$b_inode" || fail=1 34# -------------------------------------- 35 36rm -rf a b c 37touch a 38ln -s a b 39mkdir c 40cp --preserve=links -R -H a b c || fail=1 41a_inode=$(ls -i c/a|sed 's,c/.*,,') 42b_inode=$(ls -i c/b|sed 's,c/.*,,') 43test "$a_inode" = "$b_inode" || fail=1 44# -------------------------------------- 45 46# Ensure that -L makes cp follow the b->a symlink 47# and translates to hard-linked a and b in the destination dir. 48rm -rf a b c d; mkdir d; (cd d; touch a; ln -s a b) 49cp --preserve=links -R -L d c || fail=1 50a_inode=$(ls -i c/a|sed 's,c/.*,,') 51b_inode=$(ls -i c/b|sed 's,c/.*,,') 52test "$a_inode" = "$b_inode" || fail=1 53# -------------------------------------- 54 55# Same as above, but starting with a/b hard linked. 56rm -rf a b c d; mkdir d; (cd d; touch a; ln a b) 57cp --preserve=links -R -L d c || fail=1 58a_inode=$(ls -i c/a|sed 's,c/.*,,') 59b_inode=$(ls -i c/b|sed 's,c/.*,,') 60test "$a_inode" = "$b_inode" || fail=1 61# -------------------------------------- 62 63# Ensure that --no-preserve=links works. 64rm -rf a b c d; mkdir d; (cd d; touch a; ln a b) 65cp -dR --no-preserve=links d c || fail=1 66a_inode=$(ls -i c/a|sed 's,c/.*,,') 67b_inode=$(ls -i c/b|sed 's,c/.*,,') 68test "$a_inode" = "$b_inode" && fail=1 69# -------------------------------------- 70 71# Ensure that -d still preserves hard links. 72rm -rf a b c d 73touch a; ln a b 74mkdir c 75cp -d a b c || fail=1 76a_inode=$(ls -i c/a|sed 's,c/.*,,') 77b_inode=$(ls -i c/b|sed 's,c/.*,,') 78test "$a_inode" = "$b_inode" || fail=1 79# -------------------------------------- 80 81# Ensure that --no-preserve=mode works 82rm -rf a b c d 83touch a; chmod 731 a 84umask 077 85cp -a --no-preserve=mode a b || fail=1 86mode=$(ls -l b|cut -b-10) 87test "$mode" = "-rw-------" || fail=1 88umask 022 89# -------------------------------------- 90 91Exit $fail 92