diff options
Diffstat (limited to 'tests/cp/perm')
-rwxr-xr-x | tests/cp/perm | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/tests/cp/perm b/tests/cp/perm new file mode 100755 index 0000000..502ce70 --- /dev/null +++ b/tests/cp/perm @@ -0,0 +1,98 @@ +#!/bin/sh +# Make sure the permission-preserving code in copy.c (mv, cp, install) works. + +# Copyright (C) 2000, 2002, 2004, 2005, 2006 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 2 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, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. + +. $srcdir/../very-expensive + +if test "$VERBOSE" = yes; then + set -x + cp --version + mv --version +fi + +. $srcdir/../envvar-check + +pwd=`pwd` +t0=`echo "$0"|sed 's,.*/,,'`.tmp;tmp=$t0/$$ +trap 'status=$?; cd "$pwd" && rm -rf $t0 && exit $status' 0 +trap '(exit $?); exit' 1 2 13 15 + +framework_failure=0 +mkdir -p $tmp || framework_failure=1 +cd $tmp || framework_failure=1 + +umask 037 + +if test $framework_failure = 1; then + echo 'failure in testing framework' + exit 1 +fi + +fail=0 + +# Now, try it with `mv', with combinations of --force, no-f and +# existing-destination and not. +for u in 31 37 2; do + echo umask: $u + umask $u + for cmd in mv 'cp -p' cp; do + for force in '' -f; do + for existing_dest in yes no; do + for g_perm in r w x rw wx xr rwx; do + for o_perm in r w x rw wx xr rwx; do + touch src || exit 1 + chmod u=r,g=rx,o= src || exit 1 + set _ `ls -l src` + shift + expected_perms=$1 + rm -f dest + test $existing_dest = yes && { + touch dest || exit 1 + chmod u=rw,g=$g_perm,o=$o_perm dest || exit 1 + } + $cmd $force src dest || exit 1 + test "$cmd" = mv && test -f src && exit 1 + test "$cmd" = cp && { test -f src || exit 1; } + set _ `ls -l dest` + shift + + case "$cmd:$force:$existing_dest" in + cp:*:yes) + _g_perm=`echo rwx|sed 's/[^'$g_perm']/-/g'` + _o_perm=`echo rwx|sed 's/[^'$o_perm']/-/g'` + expected_perms=-rw-$_g_perm$_o_perm + ;; + cp:*:no) + test $u = 37 && + expected_perms=`echo $expected_perms|sed 's/.....$/-----/'` + test $u = 31 && + expected_perms=`echo $expected_perms|sed 's/..\(..\).$/--\1-/'` + ;; + esac + test _$1 = _$expected_perms || exit 1 + # Perform only one iteration when there's no existing destination. + test $existing_dest = no && break 3 + done + done + done + done + done +done + +(exit $fail); exit $fail |