1d583b39bSJohn Wren Kennedy#
2d583b39bSJohn Wren Kennedy# CDDL HEADER START
3d583b39bSJohn Wren Kennedy#
4d583b39bSJohn Wren Kennedy# The contents of this file are subject to the terms of the
5d583b39bSJohn Wren Kennedy# Common Development and Distribution License (the "License").
6d583b39bSJohn Wren Kennedy# You may not use this file except in compliance with the License.
7d583b39bSJohn Wren Kennedy#
8d583b39bSJohn Wren Kennedy# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9d583b39bSJohn Wren Kennedy# or http://www.opensolaris.org/os/licensing.
10d583b39bSJohn Wren Kennedy# See the License for the specific language governing permissions
11d583b39bSJohn Wren Kennedy# and limitations under the License.
12d583b39bSJohn Wren Kennedy#
13d583b39bSJohn Wren Kennedy# When distributing Covered Code, include this CDDL HEADER in each
14d583b39bSJohn Wren Kennedy# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15d583b39bSJohn Wren Kennedy# If applicable, add the following below this CDDL HEADER, with the
16d583b39bSJohn Wren Kennedy# fields enclosed by brackets "[]" replaced with your own identifying
17d583b39bSJohn Wren Kennedy# information: Portions Copyright [yyyy] [name of copyright owner]
18d583b39bSJohn Wren Kennedy#
19d583b39bSJohn Wren Kennedy# CDDL HEADER END
20d583b39bSJohn Wren Kennedy#
21d583b39bSJohn Wren Kennedy
22d583b39bSJohn Wren Kennedy#
23d583b39bSJohn Wren Kennedy# Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
24d583b39bSJohn Wren Kennedy# Use is subject to license terms.
25d583b39bSJohn Wren Kennedy#
26d583b39bSJohn Wren Kennedy
271d32ba66SJohn Wren Kennedy#
281d32ba66SJohn Wren Kennedy# Copyright (c) 2016 by Delphix. All rights reserved.
291d32ba66SJohn Wren Kennedy#
301d32ba66SJohn Wren Kennedy
31d583b39bSJohn Wren Kennedy. $STF_SUITE/tests/functional/acl/acl.cfg
32d583b39bSJohn Wren Kennedy. $STF_SUITE/include/libtest.shlib
33d583b39bSJohn Wren Kennedy
34d583b39bSJohn Wren Kennedy#
35d583b39bSJohn Wren Kennedy# Get the given file/directory access mode
36d583b39bSJohn Wren Kennedy#
37d583b39bSJohn Wren Kennedy# $1 object -- file or directroy
38d583b39bSJohn Wren Kennedy#
39d583b39bSJohn Wren Kennedyfunction get_mode #<obj>
40d583b39bSJohn Wren Kennedy{
41d583b39bSJohn Wren Kennedy	typeset obj=$1
42d583b39bSJohn Wren Kennedy	if (( ${#obj} == 0 )); then
43d583b39bSJohn Wren Kennedy		return 1
44d583b39bSJohn Wren Kennedy	fi
45d583b39bSJohn Wren Kennedy
461d32ba66SJohn Wren Kennedy	ls -ld $obj | awk '{print $1}'
47d583b39bSJohn Wren Kennedy}
48d583b39bSJohn Wren Kennedy
49d583b39bSJohn Wren Kennedy#
50d583b39bSJohn Wren Kennedy# Get the given file/directory ACL
51d583b39bSJohn Wren Kennedy#
52d583b39bSJohn Wren Kennedy# $1 object -- file or directroy
53d583b39bSJohn Wren Kennedy#
54d583b39bSJohn Wren Kennedyfunction get_acl #<obj>
55d583b39bSJohn Wren Kennedy{
56d583b39bSJohn Wren Kennedy        typeset obj=$1
57d583b39bSJohn Wren Kennedy	if (( ${#obj} == 0 )); then
58d583b39bSJohn Wren Kennedy		return 1
59d583b39bSJohn Wren Kennedy	fi
60d583b39bSJohn Wren Kennedy
611d32ba66SJohn Wren Kennedy	ls -vd $obj | nawk '(NR != 1) {print $0}'
62d583b39bSJohn Wren Kennedy}
63d583b39bSJohn Wren Kennedy
64d583b39bSJohn Wren Kennedy#
65d583b39bSJohn Wren Kennedy# Get the given file/directory ACL
66d583b39bSJohn Wren Kennedy#
67d583b39bSJohn Wren Kennedy# $1 object -- file or directroy
68d583b39bSJohn Wren Kennedy#
69d583b39bSJohn Wren Kennedyfunction get_compact_acl #<obj>
70d583b39bSJohn Wren Kennedy{
71d583b39bSJohn Wren Kennedy        typeset obj=$1
72d583b39bSJohn Wren Kennedy	if (( ${#obj} == 0 )); then
73d583b39bSJohn Wren Kennedy		return 1
74d583b39bSJohn Wren Kennedy	fi
75d583b39bSJohn Wren Kennedy
761d32ba66SJohn Wren Kennedy	ls -Vd $obj | nawk '(NR != 1) {print $0}'
77d583b39bSJohn Wren Kennedy}
78d583b39bSJohn Wren Kennedy
79d583b39bSJohn Wren Kennedy#
80d583b39bSJohn Wren Kennedy# Check the given two files/directories have the same ACLs
81d583b39bSJohn Wren Kennedy#
82d583b39bSJohn Wren Kennedy# Return 0, if source object acl is equal to target object acl.
83d583b39bSJohn Wren Kennedy#
84d583b39bSJohn Wren Kennedy# $1 source object
85d583b39bSJohn Wren Kennedy# $2 target object
86d583b39bSJohn Wren Kennedy#
87d583b39bSJohn Wren Kennedyfunction compare_acls #<src> <tgt>
88d583b39bSJohn Wren Kennedy{
89d583b39bSJohn Wren Kennedy        typeset src=$1
90d583b39bSJohn Wren Kennedy        typeset tgt=$2
91d583b39bSJohn Wren Kennedy
92d583b39bSJohn Wren Kennedy	(( ${#src} == 0 || ${#tgt} == 0 )) && return 1
93d583b39bSJohn Wren Kennedy	[[ $src == $tgt ]] && return 0
94d583b39bSJohn Wren Kennedy
95d583b39bSJohn Wren Kennedy	typeset tmpsrc=/tmp/compare_acls.src.$$
96d583b39bSJohn Wren Kennedy	typeset tmptgt=/tmp/compare_acls.tgt.$$
97d583b39bSJohn Wren Kennedy
98d583b39bSJohn Wren Kennedy	get_acl $src > $tmpsrc
99d583b39bSJohn Wren Kennedy	get_acl $tgt > $tmptgt
100d583b39bSJohn Wren Kennedy	typeset -i ret=0
1011d32ba66SJohn Wren Kennedy	diff $tmpsrc $tmptgt > /dev/null 2>&1
102d583b39bSJohn Wren Kennedy	ret=$?
1031d32ba66SJohn Wren Kennedy	rm -f $tmpsrc $tmptgt
104d583b39bSJohn Wren Kennedy
105d583b39bSJohn Wren Kennedy	if (( ret != 0 )); then
106d583b39bSJohn Wren Kennedy		return $ret
107d583b39bSJohn Wren Kennedy	fi
108d583b39bSJohn Wren Kennedy
109d583b39bSJohn Wren Kennedy	get_compact_acl $src > $tmpsrc
110d583b39bSJohn Wren Kennedy	get_compact_acl $tgt > $tmptgt
1111d32ba66SJohn Wren Kennedy	diff $tmpsrc $tmptgt > /dev/null 2>&1
112d583b39bSJohn Wren Kennedy	ret=$?
1131d32ba66SJohn Wren Kennedy	rm -f $tmpsrc $tmptgt
114d583b39bSJohn Wren Kennedy
115d583b39bSJohn Wren Kennedy	return $ret
116d583b39bSJohn Wren Kennedy}
117d583b39bSJohn Wren Kennedy
118d583b39bSJohn Wren Kennedy#
119d583b39bSJohn Wren Kennedy# Check that the given two objects have the same modes.
120d583b39bSJohn Wren Kennedy# Return 0, if their modes are equal with each other. Otherwise, return 1.
121d583b39bSJohn Wren Kennedy#
122d583b39bSJohn Wren Kennedy# $1 source object
123d583b39bSJohn Wren Kennedy# $2 target object
124d583b39bSJohn Wren Kennedy#
125d583b39bSJohn Wren Kennedyfunction compare_modes #<src> <tgt>
126d583b39bSJohn Wren Kennedy{
127d583b39bSJohn Wren Kennedy        typeset src=$1
128d583b39bSJohn Wren Kennedy        typeset tgt=$2
129d583b39bSJohn Wren Kennedy        typeset -i i=0
130d583b39bSJohn Wren Kennedy        set -A mode
131d583b39bSJohn Wren Kennedy
132d583b39bSJohn Wren Kennedy	(( ${#src} == 0 || ${#tgt} == 0 )) && return 1
133d583b39bSJohn Wren Kennedy	[[ $src == $tgt ]] && return 0
134d583b39bSJohn Wren Kennedy
135d583b39bSJohn Wren Kennedy	typeset obj
136d583b39bSJohn Wren Kennedy        for obj in $src $tgt
137d583b39bSJohn Wren Kennedy        do
138d583b39bSJohn Wren Kennedy                mode[i]=$(get_mode $obj)
139d583b39bSJohn Wren Kennedy
140d583b39bSJohn Wren Kennedy                (( i = i + 1 ))
141d583b39bSJohn Wren Kennedy        done
142d583b39bSJohn Wren Kennedy
143d583b39bSJohn Wren Kennedy        [[ ${mode[0]} != ${mode[1]} ]] && return 1
144d583b39bSJohn Wren Kennedy
145d583b39bSJohn Wren Kennedy        return 0
146d583b39bSJohn Wren Kennedy}
147d583b39bSJohn Wren Kennedy
148d583b39bSJohn Wren Kennedy#
149d583b39bSJohn Wren Kennedy# Check that the given two objects have the same xattrs.
150d583b39bSJohn Wren Kennedy# Return 0, if their xattrs are equal with each other. Otherwise, return 1.
151d583b39bSJohn Wren Kennedy#
152d583b39bSJohn Wren Kennedy# $1 source object
153d583b39bSJohn Wren Kennedy# $2 target object
154d583b39bSJohn Wren Kennedy#
155d583b39bSJohn Wren Kennedyfunction compare_xattrs #<src> <tgt>
156d583b39bSJohn Wren Kennedy{
157d583b39bSJohn Wren Kennedy        typeset src=$1
158d583b39bSJohn Wren Kennedy        typeset tgt=$2
159d583b39bSJohn Wren Kennedy
160d583b39bSJohn Wren Kennedy	(( ${#src} == 0 || ${#tgt} == 0 )) && return 1
161d583b39bSJohn Wren Kennedy	[[ $src == $tgt ]] && return 0
162d583b39bSJohn Wren Kennedy
163d583b39bSJohn Wren Kennedy	typeset tmpsrc=/tmp/compare_xattrs.src.$$
164d583b39bSJohn Wren Kennedy	typeset tmptgt=/tmp/compare_xattrs.tgt.$$
165d583b39bSJohn Wren Kennedy
166d583b39bSJohn Wren Kennedy	get_xattr $src > $tmpsrc
167d583b39bSJohn Wren Kennedy	get_xattr $tgt > $tmptgt
168d583b39bSJohn Wren Kennedy	typeset -i ret=0
1691d32ba66SJohn Wren Kennedy	diff $tmpsrc $tmptgt > /dev/null 2>&1
170d583b39bSJohn Wren Kennedy	ret=$?
1711d32ba66SJohn Wren Kennedy	rm -f $tmpsrc $tmptgt
172d583b39bSJohn Wren Kennedy
173d583b39bSJohn Wren Kennedy        return $ret
174d583b39bSJohn Wren Kennedy}
175d583b39bSJohn Wren Kennedy
176d583b39bSJohn Wren Kennedy#
177d583b39bSJohn Wren Kennedy# Check '+' is set for a given file/directory with 'ls [-l]' command
178d583b39bSJohn Wren Kennedy#
179d583b39bSJohn Wren Kennedy# $1 object -- file or directory.
180d583b39bSJohn Wren Kennedy#
181d583b39bSJohn Wren Kennedyfunction plus_sign_check_l #<obj>
182d583b39bSJohn Wren Kennedy{
183d583b39bSJohn Wren Kennedy	typeset obj=$1
184d583b39bSJohn Wren Kennedy	if (( ${#obj} == 0 )); then
185d583b39bSJohn Wren Kennedy		return 1
186d583b39bSJohn Wren Kennedy	fi
187d583b39bSJohn Wren Kennedy
1881d32ba66SJohn Wren Kennedy	ls -ld $obj | awk '{print $1}' | grep "+\>" > /dev/null
189d583b39bSJohn Wren Kennedy
190d583b39bSJohn Wren Kennedy        return $?
191d583b39bSJohn Wren Kennedy}
192d583b39bSJohn Wren Kennedy
193d583b39bSJohn Wren Kennedy#
194d583b39bSJohn Wren Kennedy# Check '+' is set for a given file/directory with 'ls [-v]' command
195d583b39bSJohn Wren Kennedy#
196d583b39bSJohn Wren Kennedy# $1 object -- file or directory.
197d583b39bSJohn Wren Kennedy#
198d583b39bSJohn Wren Kennedyfunction plus_sign_check_v #<obj>
199d583b39bSJohn Wren Kennedy{
200d583b39bSJohn Wren Kennedy	typeset obj=$1
201d583b39bSJohn Wren Kennedy	if (( ${#obj} == 0 )); then
202d583b39bSJohn Wren Kennedy		return 1
203d583b39bSJohn Wren Kennedy	fi
204d583b39bSJohn Wren Kennedy
2051d32ba66SJohn Wren Kennedy	ls -vd $obj | nawk '(NR == 1) {print $1}' | grep "+\>" > /dev/null
206d583b39bSJohn Wren Kennedy
207d583b39bSJohn Wren Kennedy        return $?
208d583b39bSJohn Wren Kennedy}
209d583b39bSJohn Wren Kennedy
210d583b39bSJohn Wren Kennedy#
211d583b39bSJohn Wren Kennedy# A wrapper function of c program
212d583b39bSJohn Wren Kennedy#
213d583b39bSJohn Wren Kennedy# $1 legal login name
214d583b39bSJohn Wren Kennedy# $2-n commands and options
215d583b39bSJohn Wren Kennedy#
216d583b39bSJohn Wren Kennedyfunction chgusr_exec #<login_name> <commands> [...]
217d583b39bSJohn Wren Kennedy{
2181d32ba66SJohn Wren Kennedy	chg_usr_exec $@
219d583b39bSJohn Wren Kennedy	return $?
220d583b39bSJohn Wren Kennedy}
221d583b39bSJohn Wren Kennedy
222d583b39bSJohn Wren Kennedy#
223d583b39bSJohn Wren Kennedy# Export the current user for the following usr_exec operating.
224d583b39bSJohn Wren Kennedy#
225d583b39bSJohn Wren Kennedy# $1 legal login name
226d583b39bSJohn Wren Kennedy#
227d583b39bSJohn Wren Kennedyfunction set_cur_usr #<login_name>
228d583b39bSJohn Wren Kennedy{
229d583b39bSJohn Wren Kennedy	export ZFS_ACL_CUR_USER=$1
230d583b39bSJohn Wren Kennedy}
231d583b39bSJohn Wren Kennedy
232d583b39bSJohn Wren Kennedy#
233d583b39bSJohn Wren Kennedy# Run commands by $ZFS_ACL_CUR_USER
234d583b39bSJohn Wren Kennedy#
235d583b39bSJohn Wren Kennedy# $1-n commands and options
236d583b39bSJohn Wren Kennedy#
237d583b39bSJohn Wren Kennedyfunction usr_exec #<commands> [...]
238d583b39bSJohn Wren Kennedy{
2391d32ba66SJohn Wren Kennedy	chg_usr_exec "$ZFS_ACL_CUR_USER" $@
240d583b39bSJohn Wren Kennedy	return $?
241d583b39bSJohn Wren Kennedy}
242d583b39bSJohn Wren Kennedy
243d583b39bSJohn Wren Kennedy#
244d583b39bSJohn Wren Kennedy# Count how many ACEs for the speficied file or directory.
245d583b39bSJohn Wren Kennedy#
246d583b39bSJohn Wren Kennedy# $1 file or directroy name
247d583b39bSJohn Wren Kennedy#
248d583b39bSJohn Wren Kennedyfunction count_ACE #<file or dir name>
249d583b39bSJohn Wren Kennedy{
250d583b39bSJohn Wren Kennedy	if [[ ! -e $1 ]]; then
251d583b39bSJohn Wren Kennedy		log_note "Need input file or directroy name."
252d583b39bSJohn Wren Kennedy		return 1
253d583b39bSJohn Wren Kennedy	fi
254d583b39bSJohn Wren Kennedy
2551d32ba66SJohn Wren Kennedy	ls -vd $1 | nawk 'BEGIN {count=0}
256d583b39bSJohn Wren Kennedy			(NR != 1)&&(/[0-9]:/) {count++}
257d583b39bSJohn Wren Kennedy			END {print count}'
258d583b39bSJohn Wren Kennedy
259d583b39bSJohn Wren Kennedy	return 0
260d583b39bSJohn Wren Kennedy}
261d583b39bSJohn Wren Kennedy
262d583b39bSJohn Wren Kennedy#
263d583b39bSJohn Wren Kennedy# Get specified number ACE content of specified file or directory.
264d583b39bSJohn Wren Kennedy#
265d583b39bSJohn Wren Kennedy# $1 file or directory name
266d583b39bSJohn Wren Kennedy# $2 specified number
267d583b39bSJohn Wren Kennedy#
268d583b39bSJohn Wren Kennedyfunction get_ACE #<file or dir name> <specified number> <verbose|compact>
269d583b39bSJohn Wren Kennedy{
270d583b39bSJohn Wren Kennedy	if [[ ! -e $1 || $2 -ge $(count_ACE $1) ]]; then
271d583b39bSJohn Wren Kennedy		return 1
272d583b39bSJohn Wren Kennedy	fi
273d583b39bSJohn Wren Kennedy
274d583b39bSJohn Wren Kennedy	typeset file=$1
275d583b39bSJohn Wren Kennedy	typeset -i num=$2
276d583b39bSJohn Wren Kennedy	typeset format=${3:-verbose}
277d583b39bSJohn Wren Kennedy	typeset -i next_num=-1
278d583b39bSJohn Wren Kennedy
279d583b39bSJohn Wren Kennedy        typeset tmpfile=/tmp/tmp_get_ACE.$$
280d583b39bSJohn Wren Kennedy        typeset line=""
281d583b39bSJohn Wren Kennedy	typeset args
282d583b39bSJohn Wren Kennedy
283d583b39bSJohn Wren Kennedy	case $format in
284d583b39bSJohn Wren Kennedy		verbose) args="-vd"
285d583b39bSJohn Wren Kennedy			;;
286d583b39bSJohn Wren Kennedy		compact) args="-Vd"
287d583b39bSJohn Wren Kennedy			;;
288d583b39bSJohn Wren Kennedy		*) log_fail "Invalid parameter as ($format), " \
289d583b39bSJohn Wren Kennedy			"only verbose|compact is supported."
290d583b39bSJohn Wren Kennedy			;;
291d583b39bSJohn Wren Kennedy	esac
292d583b39bSJohn Wren Kennedy
2931d32ba66SJohn Wren Kennedy	ls $args $file > $tmpfile
2941d32ba66SJohn Wren Kennedy	(( $? != 0 )) && log_fail "FAIL: ls $args $file > $tmpfile"
295d583b39bSJohn Wren Kennedy	while read line; do
296d583b39bSJohn Wren Kennedy		[[ -z $line ]] && continue
297d583b39bSJohn Wren Kennedy		if [[ $args == -vd ]]; then
298d583b39bSJohn Wren Kennedy			if [[ $line == "$num":* ]]; then
299d583b39bSJohn Wren Kennedy				(( next_num = num + 1 ))
300d583b39bSJohn Wren Kennedy			fi
301d583b39bSJohn Wren Kennedy			if [[ $line == "$next_num":* ]]; then
302d583b39bSJohn Wren Kennedy				break
303d583b39bSJohn Wren Kennedy			fi
304d583b39bSJohn Wren Kennedy			if (( next_num != -1 )); then
305d583b39bSJohn Wren Kennedy				print -n $line
306d583b39bSJohn Wren Kennedy			fi
307d583b39bSJohn Wren Kennedy		else
308d583b39bSJohn Wren Kennedy			if (( next_num == num )); then
309d583b39bSJohn Wren Kennedy				print -n $line
310d583b39bSJohn Wren Kennedy			fi
311d583b39bSJohn Wren Kennedy			(( next_num += 1 ))
312d583b39bSJohn Wren Kennedy		fi
313d583b39bSJohn Wren Kennedy	done < $tmpfile
314d583b39bSJohn Wren Kennedy
3151d32ba66SJohn Wren Kennedy	rm -f $tmpfile
3161d32ba66SJohn Wren Kennedy	(( $? != 0 )) && log_fail "FAIL: rm -f $tmpfile"
317d583b39bSJohn Wren Kennedy}
318d583b39bSJohn Wren Kennedy
319d583b39bSJohn Wren Kennedy#
320d583b39bSJohn Wren Kennedy# Cleanup exist user/group.
321d583b39bSJohn Wren Kennedy#
322d583b39bSJohn Wren Kennedyfunction cleanup_user_group
323d583b39bSJohn Wren Kennedy{
324d583b39bSJohn Wren Kennedy	del_user $ZFS_ACL_ADMIN
325d583b39bSJohn Wren Kennedy
326d583b39bSJohn Wren Kennedy	del_user $ZFS_ACL_STAFF1
327d583b39bSJohn Wren Kennedy	del_user $ZFS_ACL_STAFF2
328d583b39bSJohn Wren Kennedy	del_group $ZFS_ACL_STAFF_GROUP
329d583b39bSJohn Wren Kennedy
330d583b39bSJohn Wren Kennedy	del_user $ZFS_ACL_OTHER1
331d583b39bSJohn Wren Kennedy	del_user $ZFS_ACL_OTHER2
332d583b39bSJohn Wren Kennedy	del_group $ZFS_ACL_OTHER_GROUP
333d583b39bSJohn Wren Kennedy
334d583b39bSJohn Wren Kennedy	return 0
335d583b39bSJohn Wren Kennedy}
336d583b39bSJohn Wren Kennedy
337d583b39bSJohn Wren Kennedy#
338d583b39bSJohn Wren Kennedy# Clean up testfile and test directory
339d583b39bSJohn Wren Kennedy#
340d583b39bSJohn Wren Kennedyfunction cleanup
341d583b39bSJohn Wren Kennedy{
342d583b39bSJohn Wren Kennedy	if [[ -d $TESTDIR ]]; then
343d583b39bSJohn Wren Kennedy		cd $TESTDIR
3441d32ba66SJohn Wren Kennedy		rm -rf $TESTDIR/*
345d583b39bSJohn Wren Kennedy	fi
346d583b39bSJohn Wren Kennedy}
347d583b39bSJohn Wren Kennedy
348d583b39bSJohn Wren Kennedy#
349d583b39bSJohn Wren Kennedy# According to specified access or acl_spec, do relevant operating by using the
350d583b39bSJohn Wren Kennedy# specified user.
351d583b39bSJohn Wren Kennedy#
352d583b39bSJohn Wren Kennedy# $1 specified user
353d583b39bSJohn Wren Kennedy# $2 node
354d583b39bSJohn Wren Kennedy# $3 acl_spec or access
355d583b39bSJohn Wren Kennedy#
356d583b39bSJohn Wren Kennedyfunction rwx_node #user node acl_spec|access
357d583b39bSJohn Wren Kennedy{
358d583b39bSJohn Wren Kennedy	typeset user=$1
359d583b39bSJohn Wren Kennedy	typeset node=$2
360d583b39bSJohn Wren Kennedy	typeset acl_spec=$3
361d583b39bSJohn Wren Kennedy
362d583b39bSJohn Wren Kennedy	if [[ $user == "" || $node == "" || $acl_spec == "" ]]; then
363d583b39bSJohn Wren Kennedy		log_note "node or acl_spec are not defined."
364d583b39bSJohn Wren Kennedy		return 1
365d583b39bSJohn Wren Kennedy	fi
366d583b39bSJohn Wren Kennedy
367d583b39bSJohn Wren Kennedy	if [[ -d $node ]]; then
368d583b39bSJohn Wren Kennedy		case $acl_spec in
369d583b39bSJohn Wren Kennedy		*:read_data:*|read_data)
3701d32ba66SJohn Wren Kennedy			chgusr_exec $user ls -l $node > /dev/null 2>&1
371d583b39bSJohn Wren Kennedy			return $? ;;
372d583b39bSJohn Wren Kennedy		*:write_data:*|write_data)
373d583b39bSJohn Wren Kennedy			if [[ -f ${node}/tmpfile ]]; then
3741d32ba66SJohn Wren Kennedy				log_must rm -f ${node}/tmpfile
375d583b39bSJohn Wren Kennedy			fi
3761d32ba66SJohn Wren Kennedy			chgusr_exec $user touch ${node}/tmpfile > \
377d583b39bSJohn Wren Kennedy				/dev/null 2>&1
378d583b39bSJohn Wren Kennedy			return $? ;;
379d583b39bSJohn Wren Kennedy		*"execute:"*|execute)
3801d32ba66SJohn Wren Kennedy			chgusr_exec $user find $node > /dev/null 2>&1
381d583b39bSJohn Wren Kennedy			return $? ;;
382d583b39bSJohn Wren Kennedy		esac
383d583b39bSJohn Wren Kennedy	else
384d583b39bSJohn Wren Kennedy		case $acl_spec in
385d583b39bSJohn Wren Kennedy		*:read_data:*|read_data)
3861d32ba66SJohn Wren Kennedy			chgusr_exec $user cat $node > /dev/null 2>&1
387d583b39bSJohn Wren Kennedy			return $? ;;
388d583b39bSJohn Wren Kennedy		*:write_data:*|write_data)
3891d32ba66SJohn Wren Kennedy			chgusr_exec $user dd if=/usr/bin/ls of=$node > \
390d583b39bSJohn Wren Kennedy				/dev/null 2>&1
391d583b39bSJohn Wren Kennedy			return $? ;;
392d583b39bSJohn Wren Kennedy		*"execute:"*|execute)
393d583b39bSJohn Wren Kennedy			ZFS_ACL_ERR_STR=$(chgusr_exec $user $node 2>&1)
394d583b39bSJohn Wren Kennedy			return $? ;;
395d583b39bSJohn Wren Kennedy		esac
396d583b39bSJohn Wren Kennedy	fi
397d583b39bSJohn Wren Kennedy}
398d583b39bSJohn Wren Kennedy
399d583b39bSJohn Wren Kennedy#
400d583b39bSJohn Wren Kennedy# Get the given file/directory xattr
401d583b39bSJohn Wren Kennedy#
402d583b39bSJohn Wren Kennedy# $1 object -- file or directroy
403d583b39bSJohn Wren Kennedy#
404d583b39bSJohn Wren Kennedyfunction get_xattr #<obj>
405d583b39bSJohn Wren Kennedy{
406d583b39bSJohn Wren Kennedy        typeset obj=$1
407d583b39bSJohn Wren Kennedy	typeset xattr
408d583b39bSJohn Wren Kennedy	if (( ${#obj} == 0 )); then
409d583b39bSJohn Wren Kennedy		return 1
410d583b39bSJohn Wren Kennedy	fi
411d583b39bSJohn Wren Kennedy
4121d32ba66SJohn Wren Kennedy	for xattr in `runat $obj ls | \
413*d2d52addSAlexander Pyhalov		/usr/bin/egrep -v -e SUNWattr_ro -e SUNWattr_rw` ; do
4141d32ba66SJohn Wren Kennedy		runat $obj sum $xattr
415d583b39bSJohn Wren Kennedy	done
416d583b39bSJohn Wren Kennedy}
417d583b39bSJohn Wren Kennedy
418d583b39bSJohn Wren Kennedy#
419d583b39bSJohn Wren Kennedy# Get the owner of a file/directory
420d583b39bSJohn Wren Kennedy#
421d583b39bSJohn Wren Kennedyfunction get_owner #node
422d583b39bSJohn Wren Kennedy{
423d583b39bSJohn Wren Kennedy	typeset node=$1
424d583b39bSJohn Wren Kennedy	typeset value
425d583b39bSJohn Wren Kennedy
426d583b39bSJohn Wren Kennedy	if [[ -z $node ]]; then
427d583b39bSJohn Wren Kennedy		log_fail "node are not defined."
428d583b39bSJohn Wren Kennedy	fi
429d583b39bSJohn Wren Kennedy
430d583b39bSJohn Wren Kennedy	if [[ -d $node ]]; then
4311d32ba66SJohn Wren Kennedy		value=$(ls -dl $node | awk '{print $3}')
432d583b39bSJohn Wren Kennedy	elif [[ -e $node ]]; then
4331d32ba66SJohn Wren Kennedy		value=$(ls -l $node | awk '{print $3}')
434d583b39bSJohn Wren Kennedy	fi
435d583b39bSJohn Wren Kennedy
4361d32ba66SJohn Wren Kennedy	echo $value
437d583b39bSJohn Wren Kennedy}
438d583b39bSJohn Wren Kennedy
439d583b39bSJohn Wren Kennedy#
440d583b39bSJohn Wren Kennedy# Get the group of a file/directory
441d583b39bSJohn Wren Kennedy#
442d583b39bSJohn Wren Kennedyfunction get_group #node
443d583b39bSJohn Wren Kennedy{
444d583b39bSJohn Wren Kennedy	typeset node=$1
445d583b39bSJohn Wren Kennedy	typeset value
446d583b39bSJohn Wren Kennedy
447d583b39bSJohn Wren Kennedy	if [[ -z $node ]]; then
448d583b39bSJohn Wren Kennedy		log_fail "node are not defined."
449d583b39bSJohn Wren Kennedy	fi
450d583b39bSJohn Wren Kennedy
451d583b39bSJohn Wren Kennedy	if [[ -d $node ]]; then
4521d32ba66SJohn Wren Kennedy		value=$(ls -dl $node | awk '{print $4}')
453d583b39bSJohn Wren Kennedy	elif [[ -e $node ]]; then
4541d32ba66SJohn Wren Kennedy		value=$(ls -l $node | awk '{print $4}')
455d583b39bSJohn Wren Kennedy	fi
456d583b39bSJohn Wren Kennedy
4571d32ba66SJohn Wren Kennedy	echo $value
458d583b39bSJohn Wren Kennedy}
459d583b39bSJohn Wren Kennedy
460d583b39bSJohn Wren Kennedy
461d583b39bSJohn Wren Kennedy#
462d583b39bSJohn Wren Kennedy# Get the group name that a UID belongs to
463d583b39bSJohn Wren Kennedy#
464d583b39bSJohn Wren Kennedyfunction get_user_group #uid
465d583b39bSJohn Wren Kennedy{
466d583b39bSJohn Wren Kennedy	typeset uid=$1
467d583b39bSJohn Wren Kennedy	typeset value
468d583b39bSJohn Wren Kennedy
469d583b39bSJohn Wren Kennedy	if [[ -z $uid ]]; then
470d583b39bSJohn Wren Kennedy		log_fail "UID not defined."
471d583b39bSJohn Wren Kennedy	fi
472d583b39bSJohn Wren Kennedy
473d583b39bSJohn Wren Kennedy	value=$(id $uid)
474d583b39bSJohn Wren Kennedy
475d583b39bSJohn Wren Kennedy	if [[ $? -eq 0 ]]; then
476d583b39bSJohn Wren Kennedy		value=${value##*\(}
477d583b39bSJohn Wren Kennedy		value=${value%%\)*}
4781d32ba66SJohn Wren Kennedy		echo $value
479d583b39bSJohn Wren Kennedy	else
480d583b39bSJohn Wren Kennedy		log_fail "Invalid UID (uid)."
481d583b39bSJohn Wren Kennedy	fi
482d583b39bSJohn Wren Kennedy}
483d583b39bSJohn Wren Kennedy
484d583b39bSJohn Wren Kennedy#
485d583b39bSJohn Wren Kennedy# Get the specified item of the specified string
486d583b39bSJohn Wren Kennedy#
487d583b39bSJohn Wren Kennedy# $1:	Item number, count from 0.
488d583b39bSJohn Wren Kennedy# $2-n: strings
489d583b39bSJohn Wren Kennedy#
490d583b39bSJohn Wren Kennedyfunction getitem
491d583b39bSJohn Wren Kennedy{
492d583b39bSJohn Wren Kennedy	typeset -i n=$1
493d583b39bSJohn Wren Kennedy	shift
494d583b39bSJohn Wren Kennedy
495d583b39bSJohn Wren Kennedy	(( n += 1 ))
496d583b39bSJohn Wren Kennedy	eval echo \${$n}
497d583b39bSJohn Wren Kennedy}
498d583b39bSJohn Wren Kennedy
499d583b39bSJohn Wren Kennedy#
500d583b39bSJohn Wren Kennedy# This function calculate the specified directory files checksum and write
501d583b39bSJohn Wren Kennedy# to the specified array.
502d583b39bSJohn Wren Kennedy#
503d583b39bSJohn Wren Kennedy# $1 directory in which the files will be cksum.
504d583b39bSJohn Wren Kennedy# $2 file array name which was used to store file cksum information.
505d583b39bSJohn Wren Kennedy# $3 attribute array name which was used to store attribute information.
506d583b39bSJohn Wren Kennedy#
507d583b39bSJohn Wren Kennedyfunction cksum_files #<dir> <file_array_name> <attribute_array_name>
508d583b39bSJohn Wren Kennedy{
509d583b39bSJohn Wren Kennedy	typeset dir=$1
510d583b39bSJohn Wren Kennedy	typeset farr_name=$2
511d583b39bSJohn Wren Kennedy	typeset aarr_name=$3
512d583b39bSJohn Wren Kennedy
513d583b39bSJohn Wren Kennedy	[[ ! -d $dir ]] && return
514d583b39bSJohn Wren Kennedy	typeset oldpwd=$PWD
515d583b39bSJohn Wren Kennedy	cd $dir
5161d32ba66SJohn Wren Kennedy	typeset files=$(ls file*)
517d583b39bSJohn Wren Kennedy
518d583b39bSJohn Wren Kennedy	typeset -i i=0
519d583b39bSJohn Wren Kennedy	typeset -i n=0
520d583b39bSJohn Wren Kennedy	while (( i < NUM_FILE )); do
521d583b39bSJohn Wren Kennedy		typeset f=$(getitem $i $files)
5221d32ba66SJohn Wren Kennedy		eval $farr_name[$i]=\$\(\cksum $f\)
523d583b39bSJohn Wren Kennedy
524d583b39bSJohn Wren Kennedy		typeset -i j=0
525d583b39bSJohn Wren Kennedy		while (( j < NUM_ATTR )); do
5261d32ba66SJohn Wren Kennedy			eval $aarr_name[$n]=\$\(\runat \$f \cksum \
527d583b39bSJohn Wren Kennedy				attribute.$j\)
528d583b39bSJohn Wren Kennedy
529d583b39bSJohn Wren Kennedy			(( j += 1 ))
530d583b39bSJohn Wren Kennedy			(( n += 1 ))
531d583b39bSJohn Wren Kennedy		done
532d583b39bSJohn Wren Kennedy
533d583b39bSJohn Wren Kennedy		(( i += 1 ))
534d583b39bSJohn Wren Kennedy	done
535d583b39bSJohn Wren Kennedy
536d583b39bSJohn Wren Kennedy	cd $oldpwd
537d583b39bSJohn Wren Kennedy}
538d583b39bSJohn Wren Kennedy
539d583b39bSJohn Wren Kennedy#
540d583b39bSJohn Wren Kennedy# This function compare two cksum results array.
541d583b39bSJohn Wren Kennedy#
542d583b39bSJohn Wren Kennedy# $1 The array name which stored the cksum before operation.
543d583b39bSJohn Wren Kennedy# $2 The array name which stored the cksum after operation.
544d583b39bSJohn Wren Kennedy#
545d583b39bSJohn Wren Kennedyfunction compare_cksum #<array1> <array2>
546d583b39bSJohn Wren Kennedy{
547d583b39bSJohn Wren Kennedy	typeset before=$1
548d583b39bSJohn Wren Kennedy	typeset after=$2
549d583b39bSJohn Wren Kennedy	eval typeset -i count=\${#$before[@]}
550d583b39bSJohn Wren Kennedy
551d583b39bSJohn Wren Kennedy	typeset -i i=0
552d583b39bSJohn Wren Kennedy	while (( i < count )); do
553d583b39bSJohn Wren Kennedy		eval typeset var1=\${$before[$i]}
554d583b39bSJohn Wren Kennedy		eval typeset var2=\${$after[$i]}
555d583b39bSJohn Wren Kennedy
556d583b39bSJohn Wren Kennedy		if [[ $var1 != $var2 ]]; then
557d583b39bSJohn Wren Kennedy			return 1
558d583b39bSJohn Wren Kennedy		fi
559d583b39bSJohn Wren Kennedy
560d583b39bSJohn Wren Kennedy		(( i += 1 ))
561d583b39bSJohn Wren Kennedy	done
562d583b39bSJohn Wren Kennedy
563d583b39bSJohn Wren Kennedy	return 0
564d583b39bSJohn Wren Kennedy}
565d583b39bSJohn Wren Kennedy
566d583b39bSJohn Wren Kennedy#
567d583b39bSJohn Wren Kennedy# This function calculate all the files cksum information in current directory
568d583b39bSJohn Wren Kennedy# and output them to the specified file.
569d583b39bSJohn Wren Kennedy#
570d583b39bSJohn Wren Kennedy# $1 directory from which the files will be cksum.
571d583b39bSJohn Wren Kennedy# $2 cksum output file
572d583b39bSJohn Wren Kennedy#
573d583b39bSJohn Wren Kennedyfunction record_cksum #<outfile>
574d583b39bSJohn Wren Kennedy{
575d583b39bSJohn Wren Kennedy	typeset dir=$1
576d583b39bSJohn Wren Kennedy	typeset outfile=$2
577d583b39bSJohn Wren Kennedy
5781d32ba66SJohn Wren Kennedy	[[ ! -d ${outfile%/*} ]] && usr_exec mkdir -p ${outfile%/*}
579d583b39bSJohn Wren Kennedy
5801d32ba66SJohn Wren Kennedy	usr_exec cd $dir ; find . -depth -type f -exec cksum {} \\\; | \
5811d32ba66SJohn Wren Kennedy	    sort > $outfile
5821d32ba66SJohn Wren Kennedy	usr_exec cd $dir ; find . -depth -type f -xattr -exec runat {} \
5831d32ba66SJohn Wren Kennedy		cksum attribute* \\\; | sort >> $outfile
584d583b39bSJohn Wren Kennedy}
585d583b39bSJohn Wren Kennedy
586d583b39bSJohn Wren Kennedy#
587d583b39bSJohn Wren Kennedy# The function create_files creates the directories and files that the script
588d583b39bSJohn Wren Kennedy# will operate on to test extended attribute functionality.
589d583b39bSJohn Wren Kennedy#
590d583b39bSJohn Wren Kennedy# $1 The base directory in which to create directories and files.
591d583b39bSJohn Wren Kennedy#
592d583b39bSJohn Wren Kennedyfunction create_files #<directory>
593d583b39bSJohn Wren Kennedy{
594d583b39bSJohn Wren Kennedy	typeset basedir=$1
595d583b39bSJohn Wren Kennedy
5961d32ba66SJohn Wren Kennedy	[[ ! -d $basedir ]] && usr_exec mkdir -m 777 $basedir
5971d32ba66SJohn Wren Kennedy	[[ ! -d $RES_DIR  ]] && usr_exec mkdir -m 777 $RES_DIR
5981d32ba66SJohn Wren Kennedy	[[ ! -d $INI_DIR ]] && usr_exec mkdir -m 777 $INI_DIR
5991d32ba66SJohn Wren Kennedy	[[ ! -d $TST_DIR ]] && usr_exec mkdir -m 777 $TST_DIR
6001d32ba66SJohn Wren Kennedy	[[ ! -d $TMP_DIR  ]] && usr_exec mkdir -m 777 $TMP_DIR
601d583b39bSJohn Wren Kennedy
602d583b39bSJohn Wren Kennedy	#
603d583b39bSJohn Wren Kennedy	# Create the original file and its attribute files.
604d583b39bSJohn Wren Kennedy	#
605d583b39bSJohn Wren Kennedy	[[ ! -a $RES_DIR/file ]] && \
6061d32ba66SJohn Wren Kennedy		usr_exec file_write -o create -f $RES_DIR/file \
607d583b39bSJohn Wren Kennedy			-b 1024 -d 0 -c 1
608d583b39bSJohn Wren Kennedy	[[ ! -a $RES_DIR/attribute ]] && \
6091d32ba66SJohn Wren Kennedy		usr_exec cp $RES_DIR/file $RES_DIR/attribute
610d583b39bSJohn Wren Kennedy
611d583b39bSJohn Wren Kennedy	typeset oldpwd=$PWD
612d583b39bSJohn Wren Kennedy	cd $INI_DIR
613d583b39bSJohn Wren Kennedy
614d583b39bSJohn Wren Kennedy	typeset -i i=0
615d583b39bSJohn Wren Kennedy	while (( i < NUM_FILE )); do
616d583b39bSJohn Wren Kennedy		typeset dstfile=$INI_DIR/file.$$.$i
6171d32ba66SJohn Wren Kennedy		usr_exec cp $RES_DIR/file $dstfile
618d583b39bSJohn Wren Kennedy
619d583b39bSJohn Wren Kennedy		typeset -i j=0
620d583b39bSJohn Wren Kennedy		while (( j < NUM_ATTR )); do
6211d32ba66SJohn Wren Kennedy			usr_exec runat $dstfile \
6221d32ba66SJohn Wren Kennedy				cp $RES_DIR/attribute ./attribute.$j
623d583b39bSJohn Wren Kennedy			(( j += 1 ))
624d583b39bSJohn Wren Kennedy		done
625d583b39bSJohn Wren Kennedy
626d583b39bSJohn Wren Kennedy		(( i += 1 ))
627d583b39bSJohn Wren Kennedy	done
628d583b39bSJohn Wren Kennedy
629d583b39bSJohn Wren Kennedy	cd $oldpwd
630d583b39bSJohn Wren Kennedy}
631