1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
|
#!/bin/sh
# Ensure that cp --preserve=xattr, cp --preserve=all and mv preserve extended
# attributes and install does not preserve extended attributes.
# cp -a should preserve xattr, error diagnostics should not be displayed
# Copyright (C) 2009-2011 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 3 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, see <http://www.gnu.org/licenses/>.
. "${srcdir=.}/init.sh"; path_prepend_ ../src
print_ver_ cp mv ginstall
# Skip this test if cp was built without xattr support:
touch src dest || framework_failure_
cp --preserve=xattr -n src dest \
|| skip_ "coreutils built without xattr support"
# this code was taken from test mv/backup-is-src
cleanup_() { rm -rf "$other_partition_tmpdir"; }
. "$abs_srcdir/other-fs-tmpdir"
b_other="$other_partition_tmpdir/b"
rm -f "$b_other" || framework_failure_
# testing xattr name-value pair
xattr_name="user.foo"
xattr_value="bar"
xattr_pair="$xattr_name=\"$xattr_value\""
# create new file and check its xattrs
touch a || framework_failure_
getfattr -d a >out_a || skip_ "failed to get xattr of file"
grep -F "$xattr_pair" out_a && framework_failure_
# try to set user xattr on file
setfattr -n "$xattr_name" -v "$xattr_value" a >out_a \
|| skip_ "failed to set xattr of file"
getfattr -d a >out_a || skip_ "failed to get xattr of file"
grep -F "$xattr_pair" out_a \
|| skip_ "failed to set xattr of file"
# cp should not preserve xattr by default
cp a b || fail=1
getfattr -d b >out_b || skip_ "failed to get xattr of file"
grep -F "$xattr_pair" out_b && fail=1
# test if --preserve=xattr option works
cp --preserve=xattr a b || fail=1
getfattr -d b >out_b || skip_ "failed to get xattr of file"
grep -F "$xattr_pair" out_b || fail=1
# test if --preserve=all option works
cp --preserve=all a c || fail=1
getfattr -d c >out_c || skip_ "failed to get xattr of file"
grep -F "$xattr_pair" out_c || fail=1
# cp's -a option must produce no diagnostics.
cp -a a d 2>err && test -s err && fail=1
getfattr -d d >out_d || skip_ "failed to get xattr of file"
grep -F "$xattr_pair" out_d || fail=1
# test if --preserve=xattr works even for files without write access
chmod a-w a || framework_failure_
rm -f e
cp --preserve=xattr a e || fail=1
getfattr -d e >out_e || skip_ "failed to get xattr of file"
grep -F "$xattr_pair" out_e || fail=1
# Ensure that permission bits are preserved, too.
src_perm=$(stat --format=%a a)
dst_perm=$(stat --format=%a e)
test "$dst_perm" = "$src_perm" || fail=1
chmod u+w a || framework_failure_
rm b || framework_failure_
# install should never preserve xattr
ginstall a b || fail=1
getfattr -d b >out_b || skip_ "failed to get xattr of file"
grep -F "$xattr_pair" out_b && fail=1
# mv should preserve xattr when renaming within a file system.
# This is implicitly done by rename () and doesn't need explicit
# xattr support in mv.
mv a b || fail=1
getfattr -d b >out_b || skip_ "failed to get xattr of file"
grep -F "$xattr_pair" out_b || cat >&2 <<EOF
=================================================================
$0: WARNING!!!
rename () does not preserve extended attributes
=================================================================
EOF
# try to set user xattr on file on other partition
test_mv=1
touch "$b_other" || framework_failure_
setfattr -n "$xattr_name" -v "$xattr_value" "$b_other" >out_a \
|| test_mv=0
getfattr -d "$b_other" >out_b || test_mv=0
grep -F "$xattr_pair" out_b || test_mv=0
rm -f "$b_other" || framework_failure_
if test $test_mv -eq 1; then
# mv should preserve xattr when copying content from one partition to another
mv b "$b_other" || fail=1
getfattr -d "$b_other" >out_b ||
skip_ "failed to get xattr of file"
grep -F "$xattr_pair" out_b || fail=1
else
cat >&2 <<EOF
=================================================================
$0: WARNING!!!
failed to set xattr of file $b_other
=================================================================
EOF
fi
Exit $fail
|