xref: /freebsd/contrib/pjdfstest/tests/chown/00.t (revision 531c2d7af3cd2e64eec94aa1b19c4b2f16fce515)
140a8ac8fSEnji Cooper#!/bin/sh
2*3416500aSEnji Cooper# vim: filetype=sh noexpandtab ts=8 sw=8
340a8ac8fSEnji Cooper# $FreeBSD: head/tools/regression/pjdfstest/tests/chown/00.t 228975 2011-12-30 00:04:11Z uqs $
440a8ac8fSEnji Cooper
540a8ac8fSEnji Cooperdesc="chown changes ownership"
640a8ac8fSEnji Cooper
740a8ac8fSEnji Cooperdir=`dirname $0`
840a8ac8fSEnji Cooper. ${dir}/../misc.sh
940a8ac8fSEnji Cooper
1040a8ac8fSEnji Cooperif supported lchmod; then
1140a8ac8fSEnji Cooper	echo "1..1349"
1240a8ac8fSEnji Cooperelse
1340a8ac8fSEnji Cooper	echo "1..1323"
1440a8ac8fSEnji Cooperfi
1540a8ac8fSEnji Cooper
1640a8ac8fSEnji Coopern0=`namegen`
1740a8ac8fSEnji Coopern1=`namegen`
1840a8ac8fSEnji Coopern2=`namegen`
1940a8ac8fSEnji Cooper
2040a8ac8fSEnji Cooperexpect 0 mkdir ${n2} 0755
2140a8ac8fSEnji Coopercdir=`pwd`
2240a8ac8fSEnji Coopercd ${n2}
2340a8ac8fSEnji Cooper
2440a8ac8fSEnji Cooper# super-user can always modify ownership
2540a8ac8fSEnji Cooperfor type in regular dir fifo block char socket symlink; do
2640a8ac8fSEnji Cooper	if [ "${type}" != "symlink" ]; then
2740a8ac8fSEnji Cooper		create_file ${type} ${n0}
2840a8ac8fSEnji Cooper
2940a8ac8fSEnji Cooper		expect 0 chown ${n0} 123 456
3040a8ac8fSEnji Cooper		expect 123,456 lstat ${n0} uid,gid
3140a8ac8fSEnji Cooper		expect 0 chown ${n0} 0 0
3240a8ac8fSEnji Cooper		expect 0,0 lstat ${n0} uid,gid
3340a8ac8fSEnji Cooper
3440a8ac8fSEnji Cooper		expect 0 symlink ${n0} ${n1}
3540a8ac8fSEnji Cooper		uidgid=`${fstest} lstat ${n1} uid,gid`
3640a8ac8fSEnji Cooper		expect 0 chown ${n1} 123 456
3740a8ac8fSEnji Cooper		expect 123,456 stat ${n1} uid,gid
3840a8ac8fSEnji Cooper		expect 123,456 stat ${n0} uid,gid
3940a8ac8fSEnji Cooper		expect ${uidgid} lstat ${n1} uid,gid
4040a8ac8fSEnji Cooper		expect 0 unlink ${n1}
4140a8ac8fSEnji Cooper
4240a8ac8fSEnji Cooper		if [ "${type}" = "dir" ]; then
4340a8ac8fSEnji Cooper			expect 0 rmdir ${n0}
4440a8ac8fSEnji Cooper		else
4540a8ac8fSEnji Cooper			expect 0 unlink ${n0}
4640a8ac8fSEnji Cooper		fi
4740a8ac8fSEnji Cooper	fi
4840a8ac8fSEnji Cooper
4940a8ac8fSEnji Cooper	create_file ${type} ${n0}
5040a8ac8fSEnji Cooper	expect 0 lchown ${n0} 123 456
5140a8ac8fSEnji Cooper	expect 123,456 lstat ${n0} uid,gid
5240a8ac8fSEnji Cooper	if [ "${type}" = "dir" ]; then
5340a8ac8fSEnji Cooper		expect 0 rmdir ${n0}
5440a8ac8fSEnji Cooper	else
5540a8ac8fSEnji Cooper		expect 0 unlink ${n0}
5640a8ac8fSEnji Cooper	fi
5740a8ac8fSEnji Cooperdone
5840a8ac8fSEnji Cooper
5940a8ac8fSEnji Cooper# non-super-user can modify file group if he is owner of a file and
6040a8ac8fSEnji Cooper# gid he is setting is in his groups list.
6140a8ac8fSEnji Cooperfor type in regular dir fifo block char socket symlink; do
6240a8ac8fSEnji Cooper	if [ "${type}" != "symlink" ]; then
6340a8ac8fSEnji Cooper		create_file ${type} ${n0}
6440a8ac8fSEnji Cooper
6540a8ac8fSEnji Cooper		expect 0 chown ${n0} 65534 65533
6640a8ac8fSEnji Cooper		expect 65534,65533 lstat ${n0} uid,gid
6740a8ac8fSEnji Cooper		expect 0 -u 65534 -g 65532,65531 -- chown ${n0} -1 65532
6840a8ac8fSEnji Cooper		expect 65534,65532 lstat ${n0} uid,gid
6940a8ac8fSEnji Cooper		expect 0 -u 65534 -g 65532,65531 chown ${n0} 65534 65531
7040a8ac8fSEnji Cooper		expect 65534,65531 lstat ${n0} uid,gid
7140a8ac8fSEnji Cooper
7240a8ac8fSEnji Cooper		expect 0 symlink ${n0} ${n1}
7340a8ac8fSEnji Cooper		uidgid=`${fstest} lstat ${n1} uid,gid`
7440a8ac8fSEnji Cooper		expect 0 chown ${n1} 65534 65533
7540a8ac8fSEnji Cooper		expect 65534,65533 stat ${n0} uid,gid
7640a8ac8fSEnji Cooper		expect 65534,65533 stat ${n1} uid,gid
7740a8ac8fSEnji Cooper		expect ${uidgid} lstat ${n1} uid,gid
7840a8ac8fSEnji Cooper		expect 0 -u 65534 -g 65532,65531 -- chown ${n1} -1 65532
7940a8ac8fSEnji Cooper		expect 65534,65532 stat ${n0} uid,gid
8040a8ac8fSEnji Cooper		expect 65534,65532 stat ${n1} uid,gid
8140a8ac8fSEnji Cooper		expect ${uidgid} lstat ${n1} uid,gid
8240a8ac8fSEnji Cooper		expect 0 -u 65534 -g 65532,65531 chown ${n1} 65534 65531
8340a8ac8fSEnji Cooper		expect 65534,65531 stat ${n0} uid,gid
8440a8ac8fSEnji Cooper		expect 65534,65531 stat ${n1} uid,gid
8540a8ac8fSEnji Cooper		expect ${uidgid} lstat ${n1} uid,gid
8640a8ac8fSEnji Cooper		expect 0 unlink ${n1}
8740a8ac8fSEnji Cooper
8840a8ac8fSEnji Cooper		if [ "${type}" = "dir" ]; then
8940a8ac8fSEnji Cooper			expect 0 rmdir ${n0}
9040a8ac8fSEnji Cooper		else
9140a8ac8fSEnji Cooper			expect 0 unlink ${n0}
9240a8ac8fSEnji Cooper		fi
9340a8ac8fSEnji Cooper	fi
9440a8ac8fSEnji Cooper
9540a8ac8fSEnji Cooper	create_file ${type} ${n0}
9640a8ac8fSEnji Cooper	expect 0 lchown ${n0} 65534 65533
9740a8ac8fSEnji Cooper	expect 65534,65533 lstat ${n0} uid,gid
9840a8ac8fSEnji Cooper	expect 0 -u 65534 -g 65532,65531 -- lchown ${n0} -1 65532
9940a8ac8fSEnji Cooper	expect 65534,65532 lstat ${n0} uid,gid
10040a8ac8fSEnji Cooper	expect 0 -u 65534 -g 65532,65531 lchown ${n0} 65534 65531
10140a8ac8fSEnji Cooper	expect 65534,65531 lstat ${n0} uid,gid
10240a8ac8fSEnji Cooper	if [ "${type}" = "dir" ]; then
10340a8ac8fSEnji Cooper		expect 0 rmdir ${n0}
10440a8ac8fSEnji Cooper	else
10540a8ac8fSEnji Cooper		expect 0 unlink ${n0}
10640a8ac8fSEnji Cooper	fi
10740a8ac8fSEnji Cooperdone
10840a8ac8fSEnji Cooper
10940a8ac8fSEnji Cooper# chown(2) return 0 if user is not owner of a file, but chown(2) is called
11040a8ac8fSEnji Cooper# with both uid and gid equal to -1.
11140a8ac8fSEnji Cooperfor type in regular dir fifo block char socket symlink; do
11240a8ac8fSEnji Cooper	if [ "${type}" != "symlink" ]; then
11340a8ac8fSEnji Cooper		create_file ${type} ${n0}
11440a8ac8fSEnji Cooper
11540a8ac8fSEnji Cooper		expect 0 chown ${n0} 65534 65533
11640a8ac8fSEnji Cooper		expect 0 -u 65532 -g 65531 -- chown ${n0} -1 -1
11740a8ac8fSEnji Cooper		expect 65534,65533 stat ${n0} uid,gid
11840a8ac8fSEnji Cooper
11940a8ac8fSEnji Cooper		expect 0 symlink ${n0} ${n1}
12040a8ac8fSEnji Cooper		uidgid=`${fstest} lstat ${n1} uid,gid`
12140a8ac8fSEnji Cooper		expect 0 chown ${n1} 65534 65533
12240a8ac8fSEnji Cooper		expect 65534,65533 stat ${n0} uid,gid
12340a8ac8fSEnji Cooper		expect 65534,65533 stat ${n1} uid,gid
12440a8ac8fSEnji Cooper		expect ${uidgid} lstat ${n1} uid,gid
12540a8ac8fSEnji Cooper		expect 0 -u 65532 -g 65531 -- chown ${n0} -1 -1
12640a8ac8fSEnji Cooper		expect 65534,65533 stat ${n0} uid,gid
12740a8ac8fSEnji Cooper		expect 65534,65533 stat ${n1} uid,gid
12840a8ac8fSEnji Cooper		expect ${uidgid} lstat ${n1} uid,gid
12940a8ac8fSEnji Cooper		expect 0 unlink ${n1}
13040a8ac8fSEnji Cooper
13140a8ac8fSEnji Cooper		if [ "${type}" = "dir" ]; then
13240a8ac8fSEnji Cooper			expect 0 rmdir ${n0}
13340a8ac8fSEnji Cooper		else
13440a8ac8fSEnji Cooper			expect 0 unlink ${n0}
13540a8ac8fSEnji Cooper		fi
13640a8ac8fSEnji Cooper	fi
13740a8ac8fSEnji Cooper
13840a8ac8fSEnji Cooper	create_file ${type} ${n0}
13940a8ac8fSEnji Cooper	expect 0 lchown ${n0} 65534 65533
14040a8ac8fSEnji Cooper	expect 0 -u 65532 -g 65531 -- lchown ${n0} -1 -1
14140a8ac8fSEnji Cooper	expect 65534,65533 lstat ${n0} uid,gid
14240a8ac8fSEnji Cooper	if [ "${type}" = "dir" ]; then
14340a8ac8fSEnji Cooper		expect 0 rmdir ${n0}
14440a8ac8fSEnji Cooper	else
14540a8ac8fSEnji Cooper		expect 0 unlink ${n0}
14640a8ac8fSEnji Cooper	fi
14740a8ac8fSEnji Cooperdone
14840a8ac8fSEnji Cooper
14940a8ac8fSEnji Cooper# when super-user calls chown(2), set-uid and set-gid bits may be removed.
15040a8ac8fSEnji Cooperfor type in regular dir fifo block char socket symlink; do
15140a8ac8fSEnji Cooper	if [ "${type}" != "symlink" ]; then
15240a8ac8fSEnji Cooper		create_file ${type} ${n0}
15340a8ac8fSEnji Cooper
15440a8ac8fSEnji Cooper		expect 0 chown ${n0} 65534 65533
15540a8ac8fSEnji Cooper		expect 0 chmod ${n0} 06555
15640a8ac8fSEnji Cooper		expect 06555,65534,65533 stat ${n0} mode,uid,gid
15740a8ac8fSEnji Cooper		expect 0 chown ${n0} 65532 65531
15840a8ac8fSEnji Cooper		expect "(06555|0555),65532,65531" stat ${n0} mode,uid,gid
15940a8ac8fSEnji Cooper		expect 0 chmod ${n0} 06555
16040a8ac8fSEnji Cooper		expect 06555,65532,65531 stat ${n0} mode,uid,gid
16140a8ac8fSEnji Cooper		expect 0 chown ${n0} 0 0
16240a8ac8fSEnji Cooper		expect "(06555|0555),0,0" stat ${n0} mode,uid,gid
16340a8ac8fSEnji Cooper
16440a8ac8fSEnji Cooper		expect 0 symlink ${n0} ${n1}
16540a8ac8fSEnji Cooper		expect 0 chown ${n1} 65534 65533
16640a8ac8fSEnji Cooper		expect 0 chmod ${n1} 06555
16740a8ac8fSEnji Cooper		expect 06555,65534,65533 stat ${n0} mode,uid,gid
16840a8ac8fSEnji Cooper		expect 06555,65534,65533 stat ${n1} mode,uid,gid
16940a8ac8fSEnji Cooper		expect 0 chown ${n1} 65532 65531
17040a8ac8fSEnji Cooper		expect "(06555|0555),65532,65531" stat ${n0} mode,uid,gid
17140a8ac8fSEnji Cooper		expect "(06555|0555),65532,65531" stat ${n1} mode,uid,gid
17240a8ac8fSEnji Cooper		expect 0 chmod ${n1} 06555
17340a8ac8fSEnji Cooper		expect 06555,65532,65531 stat ${n0} mode,uid,gid
17440a8ac8fSEnji Cooper		expect 06555,65532,65531 stat ${n1} mode,uid,gid
17540a8ac8fSEnji Cooper		expect 0 chown ${n1} 0 0
17640a8ac8fSEnji Cooper		expect "(06555|0555),0,0" stat ${n0} mode,uid,gid
17740a8ac8fSEnji Cooper		expect "(06555|0555),0,0" stat ${n1} mode,uid,gid
17840a8ac8fSEnji Cooper		expect 0 unlink ${n1}
17940a8ac8fSEnji Cooper
18040a8ac8fSEnji Cooper		if [ "${type}" = "dir" ]; then
18140a8ac8fSEnji Cooper			expect 0 rmdir ${n0}
18240a8ac8fSEnji Cooper		else
18340a8ac8fSEnji Cooper			expect 0 unlink ${n0}
18440a8ac8fSEnji Cooper		fi
18540a8ac8fSEnji Cooper	fi
18640a8ac8fSEnji Cooper
18740a8ac8fSEnji Cooper	if [ "${type}" != "symlink" ] || supported lchmod; then
18840a8ac8fSEnji Cooper		create_file ${type} ${n0}
18940a8ac8fSEnji Cooper		expect 0 lchown ${n0} 65534 65533
19040a8ac8fSEnji Cooper		if supported lchmod; then
19140a8ac8fSEnji Cooper			expect 0 lchmod ${n0} 06555
19240a8ac8fSEnji Cooper		else
19340a8ac8fSEnji Cooper			expect 0 chmod ${n0} 06555
19440a8ac8fSEnji Cooper		fi
19540a8ac8fSEnji Cooper		expect 06555,65534,65533 lstat ${n0} mode,uid,gid
19640a8ac8fSEnji Cooper		expect 0 lchown ${n0} 65532 65531
19740a8ac8fSEnji Cooper		expect "(06555|0555),65532,65531" lstat ${n0} mode,uid,gid
19840a8ac8fSEnji Cooper		if supported lchmod; then
19940a8ac8fSEnji Cooper			expect 0 lchmod ${n0} 06555
20040a8ac8fSEnji Cooper		else
20140a8ac8fSEnji Cooper			expect 0 chmod ${n0} 06555
20240a8ac8fSEnji Cooper		fi
20340a8ac8fSEnji Cooper		expect 06555,65532,65531 lstat ${n0} mode,uid,gid
20440a8ac8fSEnji Cooper		expect 0 lchown ${n0} 0 0
20540a8ac8fSEnji Cooper		expect "(06555|0555),0,0" lstat ${n0} mode,uid,gid
20640a8ac8fSEnji Cooper		if [ "${type}" = "dir" ]; then
20740a8ac8fSEnji Cooper			expect 0 rmdir ${n0}
20840a8ac8fSEnji Cooper		else
20940a8ac8fSEnji Cooper			expect 0 unlink ${n0}
21040a8ac8fSEnji Cooper		fi
21140a8ac8fSEnji Cooper	fi
21240a8ac8fSEnji Cooperdone
21340a8ac8fSEnji Cooper
21440a8ac8fSEnji Cooper# when non-super-user calls chown(2) successfully, set-uid and set-gid bits may
21540a8ac8fSEnji Cooper# be removed, except when both uid and gid are equal to -1.
21640a8ac8fSEnji Cooperfor type in regular dir fifo block char socket symlink; do
217*3416500aSEnji Cooper	#
218*3416500aSEnji Cooper	# Linux makes a destinction for behavior when an executable file vs a
219*3416500aSEnji Cooper	# non-executable file. From chmod(2):
220*3416500aSEnji Cooper	#
221*3416500aSEnji Cooper	#   When the owner or group of an executable file are changed by an
222*3416500aSEnji Cooper	#   unprivileged user the S_ISUID and S_ISGID mode bits are cleared.
223*3416500aSEnji Cooper	#
224*3416500aSEnji Cooper	# I believe in this particular case, the behavior's bugged.
225*3416500aSEnji Cooper	#
226*3416500aSEnji Cooper	if [ "${type}" = "dir" -a "${os}" = "Linux" ]; then
227*3416500aSEnji Cooper		_todo_msg="Linux doesn't clear the SGID/SUID bits for directories, despite the description noted"
228*3416500aSEnji Cooper	else
229*3416500aSEnji Cooper		_todo_msg=
230*3416500aSEnji Cooper	fi
23140a8ac8fSEnji Cooper	if [ "${type}" != "symlink" ]; then
23240a8ac8fSEnji Cooper		create_file ${type} ${n0}
23340a8ac8fSEnji Cooper
23440a8ac8fSEnji Cooper		expect 0 chown ${n0} 65534 65533
23540a8ac8fSEnji Cooper		expect 0 chmod ${n0} 06555
23640a8ac8fSEnji Cooper		expect 06555,65534,65533 stat ${n0} mode,uid,gid
23740a8ac8fSEnji Cooper		expect 0 -u 65534 -g 65533,65532 chown ${n0} 65534 65532
238*3416500aSEnji Cooper		[ -n "${_todo_msg}" ] && todo "Linux" "${_todo_msg}"
23940a8ac8fSEnji Cooper		expect 0555,65534,65532 stat ${n0} mode,uid,gid
24040a8ac8fSEnji Cooper		expect 0 chmod ${n0} 06555
24140a8ac8fSEnji Cooper		expect 06555,65534,65532 stat ${n0} mode,uid,gid
24240a8ac8fSEnji Cooper		expect 0 -u 65534 -g 65533,65532 -- chown ${n0} -1 65533
243*3416500aSEnji Cooper		[ -n "${_todo_msg}" ] && todo "Linux" "${_todo_msg}"
24440a8ac8fSEnji Cooper		expect 0555,65534,65533 stat ${n0} mode,uid,gid
24540a8ac8fSEnji Cooper		expect 0 chmod ${n0} 06555
24640a8ac8fSEnji Cooper		expect 06555,65534,65533 stat ${n0} mode,uid,gid
24740a8ac8fSEnji Cooper		expect 0 -u 65534 -g 65533,65532 -- chown ${n0} -1 -1
24840a8ac8fSEnji Cooper		expect "(06555|0555),65534,65533" stat ${n0} mode,uid,gid
24940a8ac8fSEnji Cooper
25040a8ac8fSEnji Cooper		expect 0 symlink ${n0} ${n1}
25140a8ac8fSEnji Cooper		expect 0 chown ${n1} 65534 65533
25240a8ac8fSEnji Cooper		expect 0 chmod ${n1} 06555
25340a8ac8fSEnji Cooper		expect 06555,65534,65533 stat ${n0} mode,uid,gid
25440a8ac8fSEnji Cooper		expect 06555,65534,65533 stat ${n1} mode,uid,gid
25540a8ac8fSEnji Cooper		expect 0 -u 65534 -g 65533,65532 chown ${n1} 65534 65532
256*3416500aSEnji Cooper		[ -n "${_todo_msg}" ] && todo "Linux" "${_todo_msg}"
25740a8ac8fSEnji Cooper		expect 0555,65534,65532 stat ${n0} mode,uid,gid
258*3416500aSEnji Cooper		[ -n "${_todo_msg}" ] && todo "Linux" "${_todo_msg}"
25940a8ac8fSEnji Cooper		expect 0555,65534,65532 stat ${n1} mode,uid,gid
26040a8ac8fSEnji Cooper		expect 0 chmod ${n1} 06555
26140a8ac8fSEnji Cooper		expect 06555,65534,65532 stat ${n0} mode,uid,gid
26240a8ac8fSEnji Cooper		expect 06555,65534,65532 stat ${n1} mode,uid,gid
26340a8ac8fSEnji Cooper		expect 0 -u 65534 -g 65533,65532 -- chown ${n1} -1 65533
264*3416500aSEnji Cooper		[ -n "${_todo_msg}" ] && todo "Linux" "${_todo_msg}"
26540a8ac8fSEnji Cooper		expect 0555,65534,65533 stat ${n0} mode,uid,gid
266*3416500aSEnji Cooper		[ -n "${_todo_msg}" ] && todo "Linux" "${_todo_msg}"
26740a8ac8fSEnji Cooper		expect 0555,65534,65533 stat ${n1} mode,uid,gid
26840a8ac8fSEnji Cooper		expect 0 chmod ${n1} 06555
26940a8ac8fSEnji Cooper		expect 06555,65534,65533 stat ${n0} mode,uid,gid
27040a8ac8fSEnji Cooper		expect 06555,65534,65533 stat ${n1} mode,uid,gid
27140a8ac8fSEnji Cooper		expect 0 -u 65534 -g 65533,65532 -- chown ${n1} -1 -1
27240a8ac8fSEnji Cooper		expect "(06555|0555),65534,65533" stat ${n0} mode,uid,gid
27340a8ac8fSEnji Cooper		expect "(06555|0555),65534,65533" stat ${n1} mode,uid,gid
27440a8ac8fSEnji Cooper		expect 0 unlink ${n1}
27540a8ac8fSEnji Cooper
27640a8ac8fSEnji Cooper		if [ "${type}" = "dir" ]; then
27740a8ac8fSEnji Cooper			expect 0 rmdir ${n0}
27840a8ac8fSEnji Cooper		else
27940a8ac8fSEnji Cooper			expect 0 unlink ${n0}
28040a8ac8fSEnji Cooper		fi
28140a8ac8fSEnji Cooper	fi
28240a8ac8fSEnji Cooper
28340a8ac8fSEnji Cooper	if [ "${type}" != "symlink" ] || supported lchmod; then
28440a8ac8fSEnji Cooper		create_file ${type} ${n0}
28540a8ac8fSEnji Cooper
28640a8ac8fSEnji Cooper		expect 0 lchown ${n0} 65534 65533
28740a8ac8fSEnji Cooper		if supported lchmod; then
28840a8ac8fSEnji Cooper			expect 0 lchmod ${n0} 06555
28940a8ac8fSEnji Cooper		else
29040a8ac8fSEnji Cooper			expect 0 chmod ${n0} 06555
29140a8ac8fSEnji Cooper		fi
29240a8ac8fSEnji Cooper		expect 06555,65534,65533 lstat ${n0} mode,uid,gid
29340a8ac8fSEnji Cooper		expect 0 -u 65534 -g 65533,65532 lchown ${n0} 65534 65532
294*3416500aSEnji Cooper		[ -n "${_todo_msg}" ] && todo "Linux" "${_todo_msg}"
29540a8ac8fSEnji Cooper		expect 0555,65534,65532 lstat ${n0} mode,uid,gid
29640a8ac8fSEnji Cooper		if supported lchmod; then
29740a8ac8fSEnji Cooper			expect 0 lchmod ${n0} 06555
29840a8ac8fSEnji Cooper		else
29940a8ac8fSEnji Cooper			expect 0 chmod ${n0} 06555
30040a8ac8fSEnji Cooper		fi
30140a8ac8fSEnji Cooper		expect 06555,65534,65532 lstat ${n0} mode,uid,gid
30240a8ac8fSEnji Cooper		expect 0 -u 65534 -g 65533,65532 -- lchown ${n0} -1 65533
303*3416500aSEnji Cooper		[ -n "${_todo_msg}" ] && todo "Linux" "${_todo_msg}"
30440a8ac8fSEnji Cooper		expect 0555,65534,65533 lstat ${n0} mode,uid,gid
30540a8ac8fSEnji Cooper		if supported lchmod; then
30640a8ac8fSEnji Cooper			expect 0 lchmod ${n0} 06555
30740a8ac8fSEnji Cooper		else
30840a8ac8fSEnji Cooper			expect 0 chmod ${n0} 06555
30940a8ac8fSEnji Cooper		fi
31040a8ac8fSEnji Cooper		expect 06555,65534,65533 lstat ${n0} mode,uid,gid
31140a8ac8fSEnji Cooper		expect 0 -u 65534 -g 65533,65532 -- lchown ${n0} -1 -1
31240a8ac8fSEnji Cooper		expect "(06555|0555),65534,65533" lstat ${n0} mode,uid,gid
31340a8ac8fSEnji Cooper
31440a8ac8fSEnji Cooper		if [ "${type}" = "dir" ]; then
31540a8ac8fSEnji Cooper			expect 0 rmdir ${n0}
31640a8ac8fSEnji Cooper		else
31740a8ac8fSEnji Cooper			expect 0 unlink ${n0}
31840a8ac8fSEnji Cooper		fi
31940a8ac8fSEnji Cooper	fi
32040a8ac8fSEnji Cooperdone
32140a8ac8fSEnji Cooper
32240a8ac8fSEnji Cooper# successful chown(2) call (except uid and gid equal to -1) updates ctime.
32340a8ac8fSEnji Cooperfor type in regular dir fifo block char socket symlink; do
32440a8ac8fSEnji Cooper	if [ "${type}" != "symlink" ]; then
32540a8ac8fSEnji Cooper		create_file ${type} ${n0}
32640a8ac8fSEnji Cooper
32740a8ac8fSEnji Cooper		ctime1=`${fstest} stat ${n0} ctime`
32840a8ac8fSEnji Cooper		sleep 1
32940a8ac8fSEnji Cooper		expect 0 chown ${n0} 65534 65533
33040a8ac8fSEnji Cooper		expect 65534,65533 stat ${n0} uid,gid
33140a8ac8fSEnji Cooper		ctime2=`${fstest} stat ${n0} ctime`
33240a8ac8fSEnji Cooper		test_check $ctime1 -lt $ctime2
33340a8ac8fSEnji Cooper		ctime1=`${fstest} stat ${n0} ctime`
33440a8ac8fSEnji Cooper		sleep 1
33540a8ac8fSEnji Cooper		expect 0 -u 65534 -g 65532 chown ${n0} 65534 65532
33640a8ac8fSEnji Cooper		expect 65534,65532 stat ${n0} uid,gid
33740a8ac8fSEnji Cooper		ctime2=`${fstest} stat ${n0} ctime`
33840a8ac8fSEnji Cooper		test_check $ctime1 -lt $ctime2
33940a8ac8fSEnji Cooper
34040a8ac8fSEnji Cooper		expect 0 symlink ${n0} ${n1}
34140a8ac8fSEnji Cooper		ctime1=`${fstest} stat ${n1} ctime`
34240a8ac8fSEnji Cooper		sleep 1
34340a8ac8fSEnji Cooper		expect 0 chown ${n1} 65533 65532
34440a8ac8fSEnji Cooper		expect 65533,65532 stat ${n1} uid,gid
34540a8ac8fSEnji Cooper		ctime2=`${fstest} stat ${n1} ctime`
34640a8ac8fSEnji Cooper		test_check $ctime1 -lt $ctime2
34740a8ac8fSEnji Cooper		ctime1=`${fstest} stat ${n1} ctime`
34840a8ac8fSEnji Cooper		sleep 1
34940a8ac8fSEnji Cooper		expect 0 -u 65533 -g 65531 chown ${n1} 65533 65531
35040a8ac8fSEnji Cooper		expect 65533,65531 stat ${n1} uid,gid
35140a8ac8fSEnji Cooper		ctime2=`${fstest} stat ${n1} ctime`
35240a8ac8fSEnji Cooper		test_check $ctime1 -lt $ctime2
35340a8ac8fSEnji Cooper		expect 0 unlink ${n1}
35440a8ac8fSEnji Cooper
35540a8ac8fSEnji Cooper		if [ "${type}" = "dir" ]; then
35640a8ac8fSEnji Cooper			expect 0 rmdir ${n0}
35740a8ac8fSEnji Cooper		else
35840a8ac8fSEnji Cooper			expect 0 unlink ${n0}
35940a8ac8fSEnji Cooper		fi
36040a8ac8fSEnji Cooper	fi
36140a8ac8fSEnji Cooper
36240a8ac8fSEnji Cooper	create_file ${type} ${n0}
36340a8ac8fSEnji Cooper
36440a8ac8fSEnji Cooper	ctime1=`${fstest} lstat ${n0} ctime`
36540a8ac8fSEnji Cooper	sleep 1
36640a8ac8fSEnji Cooper	expect 0 lchown ${n0} 65534 65533
36740a8ac8fSEnji Cooper	expect 65534,65533 lstat ${n0} uid,gid
36840a8ac8fSEnji Cooper	ctime2=`${fstest} lstat ${n0} ctime`
36940a8ac8fSEnji Cooper	test_check $ctime1 -lt $ctime2
37040a8ac8fSEnji Cooper	ctime1=`${fstest} lstat ${n0} ctime`
37140a8ac8fSEnji Cooper	sleep 1
37240a8ac8fSEnji Cooper	expect 0 -u 65534 -g 65532 lchown ${n0} 65534 65532
37340a8ac8fSEnji Cooper	expect 65534,65532 lstat ${n0} uid,gid
37440a8ac8fSEnji Cooper	ctime2=`${fstest} lstat ${n0} ctime`
37540a8ac8fSEnji Cooper	test_check $ctime1 -lt $ctime2
37640a8ac8fSEnji Cooper
37740a8ac8fSEnji Cooper	if [ "${type}" = "dir" ]; then
37840a8ac8fSEnji Cooper		expect 0 rmdir ${n0}
37940a8ac8fSEnji Cooper	else
38040a8ac8fSEnji Cooper		expect 0 unlink ${n0}
38140a8ac8fSEnji Cooper	fi
38240a8ac8fSEnji Cooperdone
38340a8ac8fSEnji Cooper
38440a8ac8fSEnji Cooperfor type in regular dir fifo block char socket symlink; do
38540a8ac8fSEnji Cooper	if [ "${type}" != "symlink" ]; then
38640a8ac8fSEnji Cooper		create_file ${type} ${n0}
38740a8ac8fSEnji Cooper
38840a8ac8fSEnji Cooper		ctime1=`${fstest} stat ${n0} ctime`
38940a8ac8fSEnji Cooper		sleep 1
39040a8ac8fSEnji Cooper		expect 0 -- chown ${n0} -1 -1
39140a8ac8fSEnji Cooper		ctime2=`${fstest} stat ${n0} ctime`
39240a8ac8fSEnji Cooper		todo Linux "According to POSIX: If both owner and group are -1, the times need not be updated."
39340a8ac8fSEnji Cooper		test_check $ctime1 -eq $ctime2
39440a8ac8fSEnji Cooper		expect 0,0 stat ${n0} uid,gid
39540a8ac8fSEnji Cooper
39640a8ac8fSEnji Cooper		expect 0 symlink ${n0} ${n1}
39740a8ac8fSEnji Cooper		ctime1=`${fstest} stat ${n1} ctime`
39840a8ac8fSEnji Cooper		sleep 1
39940a8ac8fSEnji Cooper		expect 0 -- chown ${n1} -1 -1
40040a8ac8fSEnji Cooper		ctime2=`${fstest} stat ${n1} ctime`
40140a8ac8fSEnji Cooper		todo Linux "According to POSIX: If both owner and group are -1, the times need not be updated."
40240a8ac8fSEnji Cooper		test_check $ctime1 -eq $ctime2
40340a8ac8fSEnji Cooper		expect 0,0 stat ${n1} uid,gid
40440a8ac8fSEnji Cooper		expect 0 unlink ${n1}
40540a8ac8fSEnji Cooper
40640a8ac8fSEnji Cooper		if [ "${type}" = "dir" ]; then
40740a8ac8fSEnji Cooper			expect 0 rmdir ${n0}
40840a8ac8fSEnji Cooper		else
40940a8ac8fSEnji Cooper			expect 0 unlink ${n0}
41040a8ac8fSEnji Cooper		fi
41140a8ac8fSEnji Cooper	fi
41240a8ac8fSEnji Cooper
41340a8ac8fSEnji Cooper	create_file ${type} ${n0}
41440a8ac8fSEnji Cooper
41540a8ac8fSEnji Cooper	ctime1=`${fstest} lstat ${n0} ctime`
41640a8ac8fSEnji Cooper	sleep 1
41740a8ac8fSEnji Cooper	expect 0 -- lchown ${n0} -1 -1
41840a8ac8fSEnji Cooper	ctime2=`${fstest} lstat ${n0} ctime`
41940a8ac8fSEnji Cooper	todo Linux "According to POSIX: If both owner and group are -1, the times need not be updated."
42040a8ac8fSEnji Cooper	test_check $ctime1 -eq $ctime2
42140a8ac8fSEnji Cooper	expect 0,0 lstat ${n0} uid,gid
42240a8ac8fSEnji Cooper
42340a8ac8fSEnji Cooper	if [ "${type}" = "dir" ]; then
42440a8ac8fSEnji Cooper		expect 0 rmdir ${n0}
42540a8ac8fSEnji Cooper	else
42640a8ac8fSEnji Cooper		expect 0 unlink ${n0}
42740a8ac8fSEnji Cooper	fi
42840a8ac8fSEnji Cooperdone
42940a8ac8fSEnji Cooper
43040a8ac8fSEnji Cooper# unsuccessful chown(2) does not update ctime.
43140a8ac8fSEnji Cooperfor type in regular dir fifo block char socket symlink; do
43240a8ac8fSEnji Cooper	if [ "${type}" != "symlink" ]; then
43340a8ac8fSEnji Cooper		create_file ${type} ${n0}
43440a8ac8fSEnji Cooper
43540a8ac8fSEnji Cooper		ctime1=`${fstest} stat ${n0} ctime`
43640a8ac8fSEnji Cooper		sleep 1
43740a8ac8fSEnji Cooper		expect EPERM -u 65534 -- chown ${n0} 65534 -1
43840a8ac8fSEnji Cooper		expect EPERM -u 65534 -g 65534 -- chown ${n0} -1 65534
43940a8ac8fSEnji Cooper		expect EPERM -u 65534 -g 65534 chown ${n0} 65534 65534
44040a8ac8fSEnji Cooper		ctime2=`${fstest} stat ${n0} ctime`
44140a8ac8fSEnji Cooper		test_check $ctime1 -eq $ctime2
44240a8ac8fSEnji Cooper		expect 0,0 stat ${n0} uid,gid
44340a8ac8fSEnji Cooper
44440a8ac8fSEnji Cooper		expect 0 symlink ${n0} ${n1}
44540a8ac8fSEnji Cooper		ctime1=`${fstest} stat ${n1} ctime`
44640a8ac8fSEnji Cooper		sleep 1
44740a8ac8fSEnji Cooper		expect EPERM -u 65534 -- chown ${n1} 65534 -1
44840a8ac8fSEnji Cooper		expect EPERM -u 65534 -g 65534 -- chown ${n1} -1 65534
44940a8ac8fSEnji Cooper		expect EPERM -u 65534 -g 65534 chown ${n1} 65534 65534
45040a8ac8fSEnji Cooper		ctime2=`${fstest} stat ${n1} ctime`
45140a8ac8fSEnji Cooper		test_check $ctime1 -eq $ctime2
45240a8ac8fSEnji Cooper		expect 0,0 stat ${n1} uid,gid
45340a8ac8fSEnji Cooper		expect 0 unlink ${n1}
45440a8ac8fSEnji Cooper
45540a8ac8fSEnji Cooper		if [ "${type}" = "dir" ]; then
45640a8ac8fSEnji Cooper			expect 0 rmdir ${n0}
45740a8ac8fSEnji Cooper		else
45840a8ac8fSEnji Cooper			expect 0 unlink ${n0}
45940a8ac8fSEnji Cooper		fi
46040a8ac8fSEnji Cooper	fi
46140a8ac8fSEnji Cooper
46240a8ac8fSEnji Cooper	create_file ${type} ${n0}
46340a8ac8fSEnji Cooper
46440a8ac8fSEnji Cooper	ctime1=`${fstest} lstat ${n0} ctime`
46540a8ac8fSEnji Cooper	sleep 1
46640a8ac8fSEnji Cooper	expect EPERM -u 65534 -- lchown ${n0} 65534 -1
46740a8ac8fSEnji Cooper	expect EPERM -u 65534 -g 65534 -- lchown ${n0} -1 65534
46840a8ac8fSEnji Cooper	expect EPERM -u 65534 -g 65534 lchown ${n0} 65534 65534
46940a8ac8fSEnji Cooper	ctime2=`${fstest} lstat ${n0} ctime`
47040a8ac8fSEnji Cooper	test_check $ctime1 -eq $ctime2
47140a8ac8fSEnji Cooper	expect 0,0 lstat ${n0} uid,gid
47240a8ac8fSEnji Cooper
47340a8ac8fSEnji Cooper	if [ "${type}" = "dir" ]; then
47440a8ac8fSEnji Cooper		expect 0 rmdir ${n0}
47540a8ac8fSEnji Cooper	else
47640a8ac8fSEnji Cooper		expect 0 unlink ${n0}
47740a8ac8fSEnji Cooper	fi
47840a8ac8fSEnji Cooperdone
47940a8ac8fSEnji Cooper
48040a8ac8fSEnji Coopercd ${cdir}
48140a8ac8fSEnji Cooperexpect 0 rmdir ${n2}
482