xref: /freebsd/contrib/pjdfstest/tests/chmod/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/chmod/00.t 211352 2010-08-15 21:24:17Z pjd $
440a8ac8fSEnji Cooper
540a8ac8fSEnji Cooperdesc="chmod changes permission"
640a8ac8fSEnji Cooper
740a8ac8fSEnji Cooperdir=`dirname $0`
840a8ac8fSEnji Cooper. ${dir}/../misc.sh
940a8ac8fSEnji Cooper
1040a8ac8fSEnji Cooperif supported lchmod; then
1140a8ac8fSEnji Cooper	echo "1..203"
1240a8ac8fSEnji Cooperelse
1340a8ac8fSEnji Cooper	echo "1..119"
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 Cooperfor type in regular dir fifo block char socket symlink; do
2540a8ac8fSEnji Cooper	if [ "${type}" != "symlink" ]; then
2640a8ac8fSEnji Cooper		create_file ${type} ${n0}
2740a8ac8fSEnji Cooper		expect 0 chmod ${n0} 0111
2840a8ac8fSEnji Cooper		expect 0111 stat ${n0} mode
2940a8ac8fSEnji Cooper
3040a8ac8fSEnji Cooper		expect 0 symlink ${n0} ${n1}
3140a8ac8fSEnji Cooper		mode=`${fstest} lstat ${n1} mode`
3240a8ac8fSEnji Cooper		expect 0 chmod ${n1} 0222
3340a8ac8fSEnji Cooper		expect 0222 stat ${n1} mode
3440a8ac8fSEnji Cooper		expect 0222 stat ${n0} mode
3540a8ac8fSEnji Cooper		expect ${mode} lstat ${n1} mode
3640a8ac8fSEnji Cooper		expect 0 unlink ${n1}
3740a8ac8fSEnji Cooper
3840a8ac8fSEnji Cooper		if [ "${type}" = "dir" ]; then
3940a8ac8fSEnji Cooper			expect 0 rmdir ${n0}
4040a8ac8fSEnji Cooper		else
4140a8ac8fSEnji Cooper			expect 0 unlink ${n0}
4240a8ac8fSEnji Cooper		fi
4340a8ac8fSEnji Cooper	fi
4440a8ac8fSEnji Cooper
4540a8ac8fSEnji Cooper	if supported lchmod; then
4640a8ac8fSEnji Cooper		create_file ${type} ${n0}
4740a8ac8fSEnji Cooper		expect 0 lchmod ${n0} 0111
4840a8ac8fSEnji Cooper		expect 0111 lstat ${n0} mode
4940a8ac8fSEnji Cooper		if [ "${type}" = "dir" ]; then
5040a8ac8fSEnji Cooper			expect 0 rmdir ${n0}
5140a8ac8fSEnji Cooper		else
5240a8ac8fSEnji Cooper			expect 0 unlink ${n0}
5340a8ac8fSEnji Cooper		fi
5440a8ac8fSEnji Cooper	fi
5540a8ac8fSEnji Cooperdone
5640a8ac8fSEnji Cooper
5740a8ac8fSEnji Cooper# successful chmod(2) updates ctime.
5840a8ac8fSEnji Cooperfor type in regular dir fifo block char socket symlink; do
5940a8ac8fSEnji Cooper	if [ "${type}" != "symlink" ]; then
6040a8ac8fSEnji Cooper		create_file ${type} ${n0}
6140a8ac8fSEnji Cooper		ctime1=`${fstest} stat ${n0} ctime`
6240a8ac8fSEnji Cooper		sleep 1
6340a8ac8fSEnji Cooper		expect 0 chmod ${n0} 0111
6440a8ac8fSEnji Cooper		ctime2=`${fstest} stat ${n0} ctime`
6540a8ac8fSEnji Cooper		test_check $ctime1 -lt $ctime2
6640a8ac8fSEnji Cooper		if [ "${type}" = "dir" ]; then
6740a8ac8fSEnji Cooper			expect 0 rmdir ${n0}
6840a8ac8fSEnji Cooper		else
6940a8ac8fSEnji Cooper			expect 0 unlink ${n0}
7040a8ac8fSEnji Cooper		fi
7140a8ac8fSEnji Cooper	fi
7240a8ac8fSEnji Cooper
7340a8ac8fSEnji Cooper	if supported lchmod; then
7440a8ac8fSEnji Cooper		create_file ${type} ${n0}
7540a8ac8fSEnji Cooper		ctime1=`${fstest} lstat ${n0} ctime`
7640a8ac8fSEnji Cooper		sleep 1
7740a8ac8fSEnji Cooper		expect 0 lchmod ${n0} 0111
7840a8ac8fSEnji Cooper		ctime2=`${fstest} lstat ${n0} ctime`
7940a8ac8fSEnji Cooper		test_check $ctime1 -lt $ctime2
8040a8ac8fSEnji Cooper		if [ "${type}" = "dir" ]; then
8140a8ac8fSEnji Cooper			expect 0 rmdir ${n0}
8240a8ac8fSEnji Cooper		else
8340a8ac8fSEnji Cooper			expect 0 unlink ${n0}
8440a8ac8fSEnji Cooper		fi
8540a8ac8fSEnji Cooper	fi
8640a8ac8fSEnji Cooperdone
8740a8ac8fSEnji Cooper
8840a8ac8fSEnji Cooper# unsuccessful chmod(2) does not update ctime.
8940a8ac8fSEnji Cooperfor type in regular dir fifo block char socket symlink; do
9040a8ac8fSEnji Cooper	if [ "${type}" != "symlink" ]; then
9140a8ac8fSEnji Cooper		create_file ${type} ${n0}
9240a8ac8fSEnji Cooper		ctime1=`${fstest} stat ${n0} ctime`
9340a8ac8fSEnji Cooper		sleep 1
9440a8ac8fSEnji Cooper		expect EPERM -u 65534 chmod ${n0} 0111
9540a8ac8fSEnji Cooper		ctime2=`${fstest} stat ${n0} ctime`
9640a8ac8fSEnji Cooper		test_check $ctime1 -eq $ctime2
9740a8ac8fSEnji Cooper		if [ "${type}" = "dir" ]; then
9840a8ac8fSEnji Cooper			expect 0 rmdir ${n0}
9940a8ac8fSEnji Cooper		else
10040a8ac8fSEnji Cooper			expect 0 unlink ${n0}
10140a8ac8fSEnji Cooper		fi
10240a8ac8fSEnji Cooper	fi
10340a8ac8fSEnji Cooper
10440a8ac8fSEnji Cooper	if supported lchmod; then
10540a8ac8fSEnji Cooper		create_file ${type} ${n0}
10640a8ac8fSEnji Cooper		ctime1=`${fstest} lstat ${n0} ctime`
10740a8ac8fSEnji Cooper		sleep 1
10840a8ac8fSEnji Cooper		expect EPERM -u 65534 lchmod ${n0} 0321
10940a8ac8fSEnji Cooper		ctime2=`${fstest} lstat ${n0} ctime`
11040a8ac8fSEnji Cooper		test_check $ctime1 -eq $ctime2
11140a8ac8fSEnji Cooper		if [ "${type}" = "dir" ]; then
11240a8ac8fSEnji Cooper			expect 0 rmdir ${n0}
11340a8ac8fSEnji Cooper		else
11440a8ac8fSEnji Cooper			expect 0 unlink ${n0}
11540a8ac8fSEnji Cooper		fi
11640a8ac8fSEnji Cooper	fi
11740a8ac8fSEnji Cooperdone
11840a8ac8fSEnji Cooper
11940a8ac8fSEnji Cooper# POSIX: If the calling process does not have appropriate privileges, and if
12040a8ac8fSEnji Cooper# the group ID of the file does not match the effective group ID or one of the
12140a8ac8fSEnji Cooper# supplementary group IDs and if the file is a regular file, bit S_ISGID
12240a8ac8fSEnji Cooper# (set-group-ID on execution) in the file's mode shall be cleared upon
12340a8ac8fSEnji Cooper# successful return from chmod().
12440a8ac8fSEnji Cooper
12540a8ac8fSEnji Cooperexpect 0 create ${n0} 0755
12640a8ac8fSEnji Cooperexpect 0 chown ${n0} 65535 65535
12740a8ac8fSEnji Cooperexpect 0 -u 65535 -g 65535 chmod ${n0} 02755
12840a8ac8fSEnji Cooperexpect 02755 stat ${n0} mode
12940a8ac8fSEnji Cooperexpect 0 -u 65535 -g 65535 chmod ${n0} 0755
13040a8ac8fSEnji Cooperexpect 0755 stat ${n0} mode
13140a8ac8fSEnji Cooper
13240a8ac8fSEnji Coopertodo FreeBSD "S_ISGID should be removed and chmod(2) should success and FreeBSD returns EPERM."
13340a8ac8fSEnji Cooperexpect 0 -u 65535 -g 65534 chmod ${n0} 02755
13440a8ac8fSEnji Cooperexpect 0755 stat ${n0} mode
13540a8ac8fSEnji Cooper
13640a8ac8fSEnji Cooperexpect 0 unlink ${n0}
13740a8ac8fSEnji Cooper
13840a8ac8fSEnji Coopercd ${cdir}
13940a8ac8fSEnji Cooperexpect 0 rmdir ${n2}
140