1#!/bin/sh
2# Ensure that cp/mv/ln don't clobber a just-copied/moved/linked file.
3# With fileutils-4.1 and earlier, this test would fail for cp and mv.
4# With coreutils-6.9 and earlier, this test would fail for ln.
5
6# Copyright (C) 2001-2023 Free Software Foundation, Inc.
7
8# This program is free software: you can redistribute it and/or modify
9# it under the terms of the GNU General Public License as published by
10# the Free Software Foundation, either version 3 of the License, or
11# (at your option) any later version.
12
13# This program is distributed in the hope that it will be useful,
14# but WITHOUT ANY WARRANTY; without even the implied warranty of
15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16# GNU General Public License for more details.
17
18# You should have received a copy of the GNU General Public License
19# along with this program.  If not, see <https://www.gnu.org/licenses/>.
20
21. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src
22print_ver_ cp mv ln
23
24skip_if_root_
25
26mkdir a b c || framework_failure_
27echo a > a/f || framework_failure_
28echo b > b/f || framework_failure_
29
30
31returns_ 1 cp a/f b/f c 2> /dev/null || fail=1
32test -f a/f || fail=1
33test -f b/f || fail=1
34test -f c/f || fail=1
35test "$(cat c/f)" = a || fail=1
36rm -f c/f
37
38# With --backup=numbered, it should succeed
39cp --backup=numbered a/f b/f c || fail=1
40test -f a/f || fail=1
41test -f b/f || fail=1
42test -f c/f || fail=1
43test -f c/f.~1~ || fail=1
44rm -f c/f*
45
46returns_ 1 mv a/f b/f c 2> /dev/null || fail=1
47test -f a/f && fail=1
48test -f b/f || fail=1
49test -f c/f || fail=1
50test "$(cat c/f)" = a || fail=1
51
52# Make sure mv still works when moving hard links.
53# This is where the same_file test is necessary, and why
54# we save file names in addition to dev/ino.
55rm -f c/f* b/f
56touch a/f
57ln a/f b/g
58mv a/f b/g c || fail=1
59test -f a/f && fail=1
60test -f b/g && fail=1
61test -f c/f || fail=1
62test -f c/g || fail=1
63
64touch a/f b/f b/g
65returns_ 1 mv a/f b/f b/g c 2> /dev/null || fail=1
66test -f a/f && fail=1  # a/f should have been moved
67test -f b/f || fail=1  # b/f should remain
68test -f b/g && fail=1  # b/g should have been moved
69test -f c/f || fail=1
70test -f c/g || fail=1
71
72# Test ln -f.
73
74rm -f a/f b/f c/f
75echo a > a/f || framework_failure_
76echo b > b/f || framework_failure_
77returns_ 1 ln -f a/f b/f c 2> /dev/null || fail=1
78# a/f and c/f must be linked
79test $(stat --format %i a/f) = $(stat --format %i c/f) || fail=1
80# b/f and c/f must not be linked
81test $(stat --format %i b/f) = $(stat --format %i c/f) && fail=1
82
83Exit $fail
84