summaryrefslogtreecommitdiffstats
path: root/tests/misc/xattr.sh
blob: e901a0555ed6c4de5b98c746c3e991ca6b1ab4be (plain)
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-2022 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 <https://www.gnu.org/licenses/>.

. "${srcdir=.}/tests/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/tests/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 && { compare /dev/null 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