1#!/bin/sh 2# Make sure the permission-preserving code in copy.c (mv, cp, install) works. 3 4# Copyright (C) 2000-2023 Free Software Foundation, Inc. 5 6# This program is free software: you can redistribute it and/or modify 7# it under the terms of the GNU General Public License as published by 8# the Free Software Foundation, either version 3 of the License, or 9# (at your option) any later version. 10 11# This program is distributed in the hope that it will be useful, 12# but WITHOUT ANY WARRANTY; without even the implied warranty of 13# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14# GNU General Public License for more details. 15 16# You should have received a copy of the GNU General Public License 17# along with this program. If not, see <https://www.gnu.org/licenses/>. 18 19. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src 20print_ver_ cp mv 21 22very_expensive_ 23 24umask 037 25 26 27# Now, try it with 'mv', with combinations of --force, no-f and 28# existing-destination and not. 29for u in 31 37 2; do 30 echo umask: $u 31 umask $u 32 for cmd in mv 'cp -p' cp; do 33 for force in '' -f; do 34 for existing_dest in yes no; do 35 for g_perm in r w x rw wx xr rwx; do 36 for o_perm in r w x rw wx xr rwx; do 37 touch src || exit 1 38 chmod u=r,g=rx,o= src || exit 1 39 expected_perms=$(stat --format=%A src) 40 rm -f dest 41 test $existing_dest = yes && { 42 touch dest || exit 1 43 chmod u=rw,g=$g_perm,o=$o_perm dest || exit 1 44 } 45 $cmd $force src dest || exit 1 46 test "$cmd" = mv && test -f src && exit 1 47 test "$cmd" = cp && { test -f src || exit 1; } 48 actual_perms=$(stat --format=%A dest) 49 50 case "$cmd:$force:$existing_dest" in 51 cp:*:yes) 52 _g_perm=$(echo rwx|sed 's/[^'$g_perm']/-/g') 53 _o_perm=$(echo rwx|sed 's/[^'$o_perm']/-/g') 54 expected_perms=-rw-$_g_perm$_o_perm 55 ;; 56 cp:*:no) 57 test $u = 37 && 58 expected_perms=$( 59 echo $expected_perms | sed 's/.....$/-----/' 60 ) 61 test $u = 31 && 62 expected_perms=$( 63 echo $expected_perms | sed 's/..\(..\).$/--\1-/' 64 ) 65 ;; 66 esac 67 test _$actual_perms = _$expected_perms || exit 1 68 # Perform only one iteration when there's no existing destination. 69 test $existing_dest = no && break 3 70 done 71 done 72 done 73 done 74 done 75done 76 77Exit $fail 78