xref: /freebsd/contrib/pjdfstest/tests/chflags/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/chflags/00.t 211352 2010-08-15 21:24:17Z pjd $
440a8ac8fSEnji Cooper
540a8ac8fSEnji Cooperdesc="chflags changes flags"
640a8ac8fSEnji Cooper
740a8ac8fSEnji Cooperdir=`dirname $0`
840a8ac8fSEnji Cooper. ${dir}/../misc.sh
940a8ac8fSEnji Cooper
1040a8ac8fSEnji Cooperrequire chflags
1140a8ac8fSEnji Cooper
1240a8ac8fSEnji Coopercase "${os}:${fs}" in
1340a8ac8fSEnji CooperFreeBSD:UFS)
1440a8ac8fSEnji Cooper	allflags="UF_NODUMP,UF_IMMUTABLE,UF_APPEND,UF_NOUNLINK,UF_OPAQUE,SF_ARCHIVED,SF_IMMUTABLE,SF_APPEND,SF_NOUNLINK"
1540a8ac8fSEnji Cooper	userflags="UF_NODUMP,UF_IMMUTABLE,UF_APPEND,UF_NOUNLINK,UF_OPAQUE"
1640a8ac8fSEnji Cooper	systemflags="SF_ARCHIVED,SF_IMMUTABLE,SF_APPEND,SF_NOUNLINK"
1740a8ac8fSEnji Cooper
1840a8ac8fSEnji Cooper	echo "1..742"
1940a8ac8fSEnji Cooper	;;
2040a8ac8fSEnji CooperFreeBSD:ZFS)
2140a8ac8fSEnji Cooper	allflags="UF_NODUMP,SF_IMMUTABLE,SF_APPEND,SF_NOUNLINK"
2240a8ac8fSEnji Cooper	userflags="UF_NODUMP"
2340a8ac8fSEnji Cooper	systemflags="SF_IMMUTABLE,SF_APPEND,SF_NOUNLINK"
2440a8ac8fSEnji Cooper
2540a8ac8fSEnji Cooper	echo "1..482"
2640a8ac8fSEnji Cooper	;;
2740a8ac8fSEnji Cooper*)
2840a8ac8fSEnji Cooper	quick_exit
2940a8ac8fSEnji Cooper	;;
3040a8ac8fSEnji Cooperesac
3140a8ac8fSEnji Cooper
3240a8ac8fSEnji Coopern0=`namegen`
3340a8ac8fSEnji Coopern1=`namegen`
3440a8ac8fSEnji Coopern2=`namegen`
3540a8ac8fSEnji Cooper
3640a8ac8fSEnji Cooperexpect 0 mkdir ${n2} 0755
3740a8ac8fSEnji Coopercdir=`pwd`
3840a8ac8fSEnji Coopercd ${n2}
3940a8ac8fSEnji Cooper
4040a8ac8fSEnji Cooperfor type in regular dir fifo block char socket; do
4140a8ac8fSEnji Cooper	create_file ${type} ${n0}
4240a8ac8fSEnji Cooper	expect none stat ${n0} flags
4340a8ac8fSEnji Cooper	expect 0 chflags ${n0} ${allflags}
4440a8ac8fSEnji Cooper	expect ${allflags} stat ${n0} flags
4540a8ac8fSEnji Cooper	expect 0 chflags ${n0} ${userflags}
4640a8ac8fSEnji Cooper	expect ${userflags} stat ${n0} flags
4740a8ac8fSEnji Cooper	expect 0 chflags ${n0} ${systemflags}
4840a8ac8fSEnji Cooper	expect ${systemflags} stat ${n0} flags
4940a8ac8fSEnji Cooper	expect 0 chflags ${n0} none
5040a8ac8fSEnji Cooper	expect none stat ${n0} flags
5140a8ac8fSEnji Cooper	if [ "${type}" = "dir" ]; then
5240a8ac8fSEnji Cooper		expect 0 rmdir ${n0}
5340a8ac8fSEnji Cooper	else
5440a8ac8fSEnji Cooper		expect 0 unlink ${n0}
5540a8ac8fSEnji Cooper	fi
5640a8ac8fSEnji Cooper
5740a8ac8fSEnji Cooper	create_file ${type} ${n0}
5840a8ac8fSEnji Cooper	expect none stat ${n0} flags
5940a8ac8fSEnji Cooper	expect 0 lchflags ${n0} ${allflags}
6040a8ac8fSEnji Cooper	expect ${allflags} stat ${n0} flags
6140a8ac8fSEnji Cooper	expect 0 lchflags ${n0} ${userflags}
6240a8ac8fSEnji Cooper	expect ${userflags} stat ${n0} flags
6340a8ac8fSEnji Cooper	expect 0 lchflags ${n0} ${systemflags}
6440a8ac8fSEnji Cooper	expect ${systemflags} stat ${n0} flags
6540a8ac8fSEnji Cooper	expect 0 lchflags ${n0} none
6640a8ac8fSEnji Cooper	expect none stat ${n0} flags
6740a8ac8fSEnji Cooper	if [ "${type}" = "dir" ]; then
6840a8ac8fSEnji Cooper		expect 0 rmdir ${n0}
6940a8ac8fSEnji Cooper	else
7040a8ac8fSEnji Cooper		expect 0 unlink ${n0}
7140a8ac8fSEnji Cooper	fi
7240a8ac8fSEnji Cooperdone
7340a8ac8fSEnji Cooper
7440a8ac8fSEnji Cooperexpect 0 create ${n0} 0644
7540a8ac8fSEnji Cooperexpect 0 symlink ${n0} ${n1}
7640a8ac8fSEnji Cooperexpect none stat ${n1} flags
7740a8ac8fSEnji Cooperexpect none lstat ${n1} flags
7840a8ac8fSEnji Cooperexpect 0 chflags ${n1} ${allflags}
7940a8ac8fSEnji Cooperexpect ${allflags} stat ${n1} flags
8040a8ac8fSEnji Cooperexpect none lstat ${n1} flags
8140a8ac8fSEnji Cooperexpect 0 chflags ${n1} ${userflags}
8240a8ac8fSEnji Cooperexpect ${userflags} stat ${n1} flags
8340a8ac8fSEnji Cooperexpect none lstat ${n1} flags
8440a8ac8fSEnji Cooperexpect 0 chflags ${n1} ${systemflags}
8540a8ac8fSEnji Cooperexpect ${systemflags} stat ${n1} flags
8640a8ac8fSEnji Cooperexpect none lstat ${n1} flags
8740a8ac8fSEnji Cooperexpect 0 chflags ${n1} none
8840a8ac8fSEnji Cooperexpect none stat ${n1} flags
8940a8ac8fSEnji Cooperexpect none lstat ${n1} flags
9040a8ac8fSEnji Cooperexpect 0 unlink ${n1}
9140a8ac8fSEnji Cooperexpect 0 unlink ${n0}
9240a8ac8fSEnji Cooper
9340a8ac8fSEnji Cooperexpect 0 create ${n0} 0644
9440a8ac8fSEnji Cooperexpect 0 symlink ${n0} ${n1}
9540a8ac8fSEnji Cooperexpect none stat ${n1} flags
9640a8ac8fSEnji Cooperexpect none lstat ${n1} flags
9740a8ac8fSEnji Cooperexpect 0 lchflags ${n1} ${allflags}
9840a8ac8fSEnji Cooperexpect ${allflags} lstat ${n1} flags
9940a8ac8fSEnji Cooperexpect none stat ${n1} flags
10040a8ac8fSEnji Cooperexpect 0 lchflags ${n1} ${userflags}
10140a8ac8fSEnji Cooperexpect ${userflags} lstat ${n1} flags
10240a8ac8fSEnji Cooperexpect none stat ${n1} flags
10340a8ac8fSEnji Cooperexpect 0 lchflags ${n1} ${systemflags}
10440a8ac8fSEnji Cooperexpect ${systemflags} lstat ${n1} flags
10540a8ac8fSEnji Cooperexpect none stat ${n1} flags
10640a8ac8fSEnji Cooperexpect 0 lchflags ${n1} none
10740a8ac8fSEnji Cooperexpect none lstat ${n1} flags
10840a8ac8fSEnji Cooperexpect none stat ${n1} flags
10940a8ac8fSEnji Cooperexpect 0 unlink ${n1}
11040a8ac8fSEnji Cooperexpect 0 unlink ${n0}
11140a8ac8fSEnji Cooper
11240a8ac8fSEnji Cooper# successful chflags(2) updates ctime.
11340a8ac8fSEnji Cooperfor type in regular dir fifo block char socket symlink; do
11440a8ac8fSEnji Cooper	if [ "${type}" != "symlink" ]; then
11540a8ac8fSEnji Cooper		create_file ${type} ${n0}
11640a8ac8fSEnji Cooper		for flag in `echo ${allflags},none | tr ',' ' '`; do
11740a8ac8fSEnji Cooper			ctime1=`${fstest} stat ${n0} ctime`
11840a8ac8fSEnji Cooper			sleep 1
11940a8ac8fSEnji Cooper			expect 0 chflags ${n0} ${flag}
12040a8ac8fSEnji Cooper			ctime2=`${fstest} stat ${n0} ctime`
12140a8ac8fSEnji Cooper			test_check $ctime1 -lt $ctime2
12240a8ac8fSEnji Cooper		done
12340a8ac8fSEnji Cooper		if [ "${type}" = "dir" ]; then
12440a8ac8fSEnji Cooper			expect 0 rmdir ${n0}
12540a8ac8fSEnji Cooper		else
12640a8ac8fSEnji Cooper			expect 0 unlink ${n0}
12740a8ac8fSEnji Cooper		fi
12840a8ac8fSEnji Cooper	fi
12940a8ac8fSEnji Cooper
13040a8ac8fSEnji Cooper	create_file ${type} ${n0}
13140a8ac8fSEnji Cooper	for flag in `echo ${allflags},none | tr ',' ' '`; do
13240a8ac8fSEnji Cooper		ctime1=`${fstest} lstat ${n0} ctime`
13340a8ac8fSEnji Cooper		sleep 1
13440a8ac8fSEnji Cooper		expect 0 lchflags ${n0} ${flag}
13540a8ac8fSEnji Cooper		ctime2=`${fstest} lstat ${n0} ctime`
13640a8ac8fSEnji Cooper		test_check $ctime1 -lt $ctime2
13740a8ac8fSEnji Cooper	done
13840a8ac8fSEnji Cooper	if [ "${type}" = "dir" ]; then
13940a8ac8fSEnji Cooper		expect 0 rmdir ${n0}
14040a8ac8fSEnji Cooper	else
14140a8ac8fSEnji Cooper		expect 0 unlink ${n0}
14240a8ac8fSEnji Cooper	fi
14340a8ac8fSEnji Cooperdone
14440a8ac8fSEnji Cooper
14540a8ac8fSEnji Cooper# unsuccessful chflags(2) does not update ctime.
14640a8ac8fSEnji Cooperfor type in regular dir fifo block char socket symlink; do
14740a8ac8fSEnji Cooper	if [ "${type}" != "symlink" ]; then
14840a8ac8fSEnji Cooper		create_file ${type} ${n0}
14940a8ac8fSEnji Cooper		for flag in `echo ${allflags},none | tr ',' ' '`; do
15040a8ac8fSEnji Cooper			ctime1=`${fstest} stat ${n0} ctime`
15140a8ac8fSEnji Cooper			sleep 1
15240a8ac8fSEnji Cooper			expect EPERM -u 65534 chflags ${n0} ${flag}
15340a8ac8fSEnji Cooper			ctime2=`${fstest} stat ${n0} ctime`
15440a8ac8fSEnji Cooper			test_check $ctime1 -eq $ctime2
15540a8ac8fSEnji Cooper		done
15640a8ac8fSEnji Cooper		if [ "${type}" = "dir" ]; then
15740a8ac8fSEnji Cooper			expect 0 rmdir ${n0}
15840a8ac8fSEnji Cooper		else
15940a8ac8fSEnji Cooper			expect 0 unlink ${n0}
16040a8ac8fSEnji Cooper		fi
16140a8ac8fSEnji Cooper	fi
16240a8ac8fSEnji Cooper
16340a8ac8fSEnji Cooper	create_file ${type} ${n0}
16440a8ac8fSEnji Cooper	for flag in `echo ${allflags},none | tr ',' ' '`; do
16540a8ac8fSEnji Cooper		ctime1=`${fstest} lstat ${n0} ctime`
16640a8ac8fSEnji Cooper		sleep 1
16740a8ac8fSEnji Cooper		expect EPERM -u 65534 lchflags ${n0} ${flag}
16840a8ac8fSEnji Cooper		ctime2=`${fstest} lstat ${n0} ctime`
16940a8ac8fSEnji Cooper		test_check $ctime1 -eq $ctime2
17040a8ac8fSEnji Cooper	done
17140a8ac8fSEnji Cooper	if [ "${type}" = "dir" ]; then
17240a8ac8fSEnji Cooper		expect 0 rmdir ${n0}
17340a8ac8fSEnji Cooper	else
17440a8ac8fSEnji Cooper		expect 0 unlink ${n0}
17540a8ac8fSEnji Cooper	fi
17640a8ac8fSEnji Cooperdone
17740a8ac8fSEnji Cooper
17840a8ac8fSEnji Coopercd ${cdir}
17940a8ac8fSEnji Cooperexpect 0 rmdir ${n2}
180