1#!/bin/ksh -p
2#
3# CDDL HEADER START
4#
5# The contents of this file are subject to the terms of the
6# Common Development and Distribution License (the "License").
7# You may not use this file except in compliance with the License.
8#
9# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10# or https://opensource.org/licenses/CDDL-1.0.
11# See the License for the specific language governing permissions
12# and limitations under the License.
13#
14# When distributing Covered Code, include this CDDL HEADER in each
15# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16# If applicable, add the following below this CDDL HEADER, with the
17# fields enclosed by brackets "[]" replaced with your own identifying
18# information: Portions Copyright [yyyy] [name of copyright owner]
19#
20# CDDL HEADER END
21#
22# Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
23# Use is subject to license terms.
24#
25
26#
27# Copyright (c) 2012, 2016 by Delphix. All rights reserved.
28#
29
30#
31# Copyright (c) 2013, 2016 by Delphix. All rights reserved.
32#
33
34. $STF_SUITE/include/libtest.shlib
35. $STF_SUITE/tests/functional/xattr/xattr_common.kshlib
36
37#
38# DESCRIPTION:
39#
40# Basic applications work with xattrs: cpio cp find mv pax tar
41#
42# STRATEGY:
43#	1. For each application
44#       2. Create an xattr and archive/move/copy/find files with xattr support
45#	3. Also check that when appropriate flag is not used, the xattr
46#	   doesn't get copied
47#
48
49function cleanup {
50
51	log_must rm $TESTDIR/myfile.$$
52}
53
54log_assert "Basic applications work with xattrs: cpio cp find mv pax tar"
55log_onexit cleanup
56
57# Create a file, and set an xattr on it. This file is used in several of the
58# test scenarios below.
59log_must touch $TESTDIR/myfile.$$
60create_xattr $TESTDIR/myfile.$$ passwd /etc/passwd
61
62
63# For the archive applications below (tar, cpio, pax)
64# we create two archives, one with xattrs, one without
65# and try various cpio options extracting the archives
66# with and without xattr support, checking for correct behaviour
67
68if is_illumos; then
69	log_note "Checking cpio"
70	log_must touch $TESTDIR/cpio.$$
71	create_xattr $TESTDIR/cpio.$$ passwd /etc/passwd
72	echo $TESTDIR/cpio.$$ | cpio -o@ > $TEST_BASE_DIR/xattr.$$.cpio
73	echo $TESTDIR/cpio.$$ | cpio -o > $TEST_BASE_DIR/noxattr.$$.cpio
74
75	# we should have no xattr here
76	log_must cpio -iu < $TEST_BASE_DIR/xattr.$$.cpio
77	log_mustnot eval "runat $TESTDIR/cpio.$$ cat passwd > /dev/null 2>&1"
78
79	# we should have an xattr here
80	log_must cpio -iu@ < $TEST_BASE_DIR/xattr.$$.cpio
81	log_must eval "runat $TESTDIR/cpio.$$ cat passwd > /dev/null 2>&1"
82
83	# we should have no xattr here
84	log_must cpio -iu < $TEST_BASE_DIR/noxattr.$$.cpio
85	log_mustnot eval "runat $TESTDIR/cpio.$$ cat passwd > /dev/null 2>&1"
86
87	# we should have no xattr here
88	log_must cpio -iu@ < $TEST_BASE_DIR/noxattr.$$.cpio
89	log_mustnot eval "runat $TESTDIR/cpio.$$ cat passwd > /dev/null 2>&1"
90	log_must rm $TESTDIR/cpio.$$ $TEST_BASE_DIR/xattr.$$.cpio $TEST_BASE_DIR/noxattr.$$.cpio
91else
92	log_note "Checking cpio - unsupported"
93fi
94
95# check that with the right flag, the xattr is preserved
96if is_freebsd; then
97	log_note "Checking cp - unsupported"
98elif is_linux; then
99	log_note "Checking cp"
100	log_must cp -a $TESTDIR/myfile.$$ $TESTDIR/myfile2.$$
101
102	compare_xattrs $TESTDIR/myfile.$$ $TESTDIR/myfile2.$$ passwd
103	log_must rm $TESTDIR/myfile2.$$
104
105	# without the right flag, there should be no xattr
106	log_must cp $TESTDIR/myfile.$$ $TESTDIR/myfile2.$$
107	log_mustnot get_xattr passwd $TESTDIR/myfile2.$$
108	log_must rm $TESTDIR/myfile2.$$
109else
110	log_note "Checking cp"
111	log_must cp -@ $TESTDIR/myfile.$$ $TESTDIR/myfile2.$$
112
113	compare_xattrs $TESTDIR/myfile.$$ $TESTDIR/myfile2.$$ passwd
114	log_must rm $TESTDIR/myfile2.$$
115
116	# without the right flag, there should be no xattr
117	log_must cp $TESTDIR/myfile.$$ $TESTDIR/myfile2.$$
118	log_mustnot eval "runat $TESTDIR/myfile2.$$ ls passwd > /dev/null 2>&1"
119	log_must rm $TESTDIR/myfile2.$$
120fi
121
122# create a file without xattrs, and check that find -xattr only finds
123# our test file that has an xattr.
124if is_illumos; then
125	log_note "Checking find"
126	log_must mkdir $TESTDIR/noxattrs
127	log_must touch $TESTDIR/noxattrs/no-xattr
128
129	log_must eval "find $TESTDIR -xattr | grep -q myfile.$$"
130	log_mustnot eval "find $TESTDIR -xattr | grep -q no-xattr"
131	log_must rm -rf $TESTDIR/noxattrs
132else
133	log_note "Checking find - unsupported"
134fi
135
136log_note "Checking mv"
137# mv doesn't have any flags to preserve/omit xattrs - they're
138# always moved.
139log_must touch $TESTDIR/mvfile.$$
140create_xattr $TESTDIR/mvfile.$$ passwd /etc/passwd
141log_must mv $TESTDIR/mvfile.$$ $TESTDIR/mvfile2.$$
142verify_xattr $TESTDIR/mvfile2.$$ passwd /etc/passwd
143log_must rm $TESTDIR/mvfile2.$$
144
145if is_illumos; then
146	log_note "Checking pax"
147	log_must touch $TESTDIR/pax.$$
148	create_xattr $TESTDIR/pax.$$ passwd /etc/passwd
149	log_must pax -w -f $TESTDIR/noxattr.pax $TESTDIR/pax.$$
150	log_must pax -w@ -f $TESTDIR/xattr.pax $TESTDIR/pax.$$
151	log_must rm $TESTDIR/pax.$$
152
153	# we should have no xattr here
154	log_must pax -r -f $TESTDIR/noxattr.pax
155	log_mustnot eval "runat $TESTDIR/pax.$$ cat passwd > /dev/null 2>&1"
156	log_must rm $TESTDIR/pax.$$
157
158	# we should have no xattr here
159	log_must pax -r@ -f $TESTDIR/noxattr.pax
160	log_mustnot eval "runat $TESTDIR/pax.$$ cat passwd > /dev/null 2>&1"
161	log_must rm $TESTDIR/pax.$$
162
163	# we should have an xattr here
164	log_must pax -r@ -f $TESTDIR/xattr.pax
165	verify_xattr $TESTDIR/pax.$$ passwd /etc/passwd
166	log_must rm $TESTDIR/pax.$$
167
168	# we should have no xattr here
169	log_must pax -r -f $TESTDIR/xattr.pax $TESTDIR
170	log_mustnot eval "runat $TESTDIR/pax.$$ cat passwd > /dev/null 2>&1"
171	log_must rm $TESTDIR/pax.$$ $TESTDIR/noxattr.pax $TESTDIR/xattr.pax
172else
173	log_note "Checking pax - unsupported"
174fi
175
176log_note "Checking tar"
177if is_illumos; then
178	log_must touch $TESTDIR/tar.$$
179	create_xattr $TESTDIR/tar.$$ passwd /etc/passwd
180
181	log_must cd $TESTDIR
182
183	log_must tar cf noxattr.tar tar.$$
184	log_must tar c@f xattr.tar tar.$$
185	log_must rm $TESTDIR/tar.$$
186
187	# we should have no xattr here
188	log_must tar xf xattr.tar
189	log_mustnot eval "runat $TESTDIR/tar.$$ cat passwd > /dev/null 2>&1"
190	log_must rm $TESTDIR/tar.$$
191
192	# we should have an xattr here
193	log_must tar x@f xattr.tar
194	verify_xattr tar.$$ passwd /etc/passwd
195	log_must rm $TESTDIR/tar.$$
196
197	# we should have no xattr here
198	log_must tar xf $TESTDIR/noxattr.tar
199	log_mustnot eval "runat $TESTDIR/tar.$$ cat passwd > /dev/null 2>&1"
200	log_must rm $TESTDIR/tar.$$
201
202	# we should have no xattr here
203	log_must tar x@f $TESTDIR/noxattr.tar
204	log_mustnot eval "runat $TESTDIR/tar.$$ cat passwd > /dev/null 2>&1"
205	log_must rm $TESTDIR/tar.$$ $TESTDIR/noxattr.tar $TESTDIR/xattr.tar
206else
207	log_must touch $TESTDIR/tar.$$
208	create_xattr $TESTDIR/tar.$$ passwd /etc/passwd
209
210	log_must cd $TESTDIR
211
212	log_must tar --no-xattrs -cf noxattr.tar tar.$$
213	log_must tar --xattrs -cf xattr.tar tar.$$
214	log_must rm $TESTDIR/tar.$$
215
216	# we should have no xattr here
217	log_must tar --no-xattrs -xf xattr.tar
218	log_mustnot get_xattr passwd $TESTDIR/tar.$$
219	log_must rm $TESTDIR/tar.$$
220
221	# we should have an xattr here
222	log_must tar --xattrs -xf xattr.tar
223	verify_xattr tar.$$ passwd /etc/passwd
224	log_must rm $TESTDIR/tar.$$
225
226	# we should have no xattr here
227	log_must tar --no-xattrs -xf $TESTDIR/noxattr.tar
228	log_mustnot get_xattr passwd $TESTDIR/tar.$$
229	log_must rm $TESTDIR/tar.$$
230
231	# we should have no xattr here
232	log_must tar --xattrs -xf $TESTDIR/noxattr.tar
233	log_mustnot get_xattr passwd $TESTDIR/tar.$$
234	log_must rm $TESTDIR/tar.$$ $TESTDIR/noxattr.tar $TESTDIR/xattr.tar
235fi
236
237log_assert "Basic applications work with xattrs: cpio cp find mv pax tar"
238