00.t revision 272057
1145479Smp#!/bin/sh
259243Sobrien# $FreeBSD: head/tools/regression/pjdfstest/tests/chmod/00.t 211352 2010-08-15 21:24:17Z pjd $
359243Sobrien
459243Sobriendesc="chmod changes permission"
559243Sobrien
659243Sobriendir=`dirname $0`
759243Sobrien. ${dir}/../misc.sh
859243Sobrien
959243Sobrienif supported lchmod; then
1059243Sobrien	echo "1..203"
1159243Sobrienelse
1259243Sobrien	echo "1..119"
1359243Sobrienfi
1459243Sobrien
1559243Sobrienn0=`namegen`
1659243Sobrienn1=`namegen`
17100616Smpn2=`namegen`
1859243Sobrien
1959243Sobrienexpect 0 mkdir ${n2} 0755
2059243Sobriencdir=`pwd`
2159243Sobriencd ${n2}
2259243Sobrien
2359243Sobrienfor type in regular dir fifo block char socket symlink; do
2459243Sobrien	if [ "${type}" != "symlink" ]; then
2559243Sobrien		create_file ${type} ${n0}
2659243Sobrien		expect 0 chmod ${n0} 0111
2759243Sobrien		expect 0111 stat ${n0} mode
2859243Sobrien
2959243Sobrien		expect 0 symlink ${n0} ${n1}
3059243Sobrien		mode=`${fstest} lstat ${n1} mode`
3159243Sobrien		expect 0 chmod ${n1} 0222
3259243Sobrien		expect 0222 stat ${n1} mode
3359243Sobrien		expect 0222 stat ${n0} mode
3459243Sobrien		expect ${mode} lstat ${n1} mode
35145479Smp		expect 0 unlink ${n1}
3659243Sobrien
3759243Sobrien		if [ "${type}" = "dir" ]; then
3859243Sobrien			expect 0 rmdir ${n0}
3959243Sobrien		else
4059243Sobrien			expect 0 unlink ${n0}
4159243Sobrien		fi
4259243Sobrien	fi
4359243Sobrien
4459243Sobrien	if supported lchmod; then
4559243Sobrien		create_file ${type} ${n0}
4659243Sobrien		expect 0 lchmod ${n0} 0111
4759243Sobrien		expect 0111 lstat ${n0} mode
4859243Sobrien		if [ "${type}" = "dir" ]; then
4959243Sobrien			expect 0 rmdir ${n0}
5059243Sobrien		else
5159243Sobrien			expect 0 unlink ${n0}
5259243Sobrien		fi
53145479Smp	fi
5459243Sobriendone
5559243Sobrien
5659243Sobrien# successful chmod(2) updates ctime.
5759243Sobrienfor type in regular dir fifo block char socket symlink; do
5859243Sobrien	if [ "${type}" != "symlink" ]; then
5959243Sobrien		create_file ${type} ${n0}
6059243Sobrien		ctime1=`${fstest} stat ${n0} ctime`
6159243Sobrien		sleep 1
6259243Sobrien		expect 0 chmod ${n0} 0111
6359243Sobrien		ctime2=`${fstest} stat ${n0} ctime`
6459243Sobrien		test_check $ctime1 -lt $ctime2
6559243Sobrien		if [ "${type}" = "dir" ]; then
6659243Sobrien			expect 0 rmdir ${n0}
6759243Sobrien		else
6859243Sobrien			expect 0 unlink ${n0}
6959243Sobrien		fi
7059243Sobrien	fi
7159243Sobrien
7259243Sobrien	if supported lchmod; then
7359243Sobrien		create_file ${type} ${n0}
7459243Sobrien		ctime1=`${fstest} lstat ${n0} ctime`
7559243Sobrien		sleep 1
7659243Sobrien		expect 0 lchmod ${n0} 0111
7759243Sobrien		ctime2=`${fstest} lstat ${n0} ctime`
7859243Sobrien		test_check $ctime1 -lt $ctime2
7959243Sobrien		if [ "${type}" = "dir" ]; then
8059243Sobrien			expect 0 rmdir ${n0}
8159243Sobrien		else
8259243Sobrien			expect 0 unlink ${n0}
8359243Sobrien		fi
8459243Sobrien	fi
8559243Sobriendone
8659243Sobrien
8759243Sobrien# unsuccessful chmod(2) does not update ctime.
8859243Sobrienfor type in regular dir fifo block char socket symlink; do
8959243Sobrien	if [ "${type}" != "symlink" ]; then
9059243Sobrien		create_file ${type} ${n0}
9159243Sobrien		ctime1=`${fstest} stat ${n0} ctime`
9259243Sobrien		sleep 1
9359243Sobrien		expect EPERM -u 65534 chmod ${n0} 0111
9459243Sobrien		ctime2=`${fstest} stat ${n0} ctime`
9559243Sobrien		test_check $ctime1 -eq $ctime2
9659243Sobrien		if [ "${type}" = "dir" ]; then
9759243Sobrien			expect 0 rmdir ${n0}
9859243Sobrien		else
9959243Sobrien			expect 0 unlink ${n0}
10059243Sobrien		fi
10159243Sobrien	fi
10259243Sobrien
10359243Sobrien	if supported lchmod; then
10459243Sobrien		create_file ${type} ${n0}
10559243Sobrien		ctime1=`${fstest} lstat ${n0} ctime`
10659243Sobrien		sleep 1
10759243Sobrien		expect EPERM -u 65534 lchmod ${n0} 0321
10859243Sobrien		ctime2=`${fstest} lstat ${n0} ctime`
10959243Sobrien		test_check $ctime1 -eq $ctime2
11059243Sobrien		if [ "${type}" = "dir" ]; then
11159243Sobrien			expect 0 rmdir ${n0}
11259243Sobrien		else
11359243Sobrien			expect 0 unlink ${n0}
11459243Sobrien		fi
11559243Sobrien	fi
11659243Sobriendone
11759243Sobrien
11859243Sobrien# POSIX: If the calling process does not have appropriate privileges, and if
11959243Sobrien# the group ID of the file does not match the effective group ID or one of the
12059243Sobrien# supplementary group IDs and if the file is a regular file, bit S_ISGID
12159243Sobrien# (set-group-ID on execution) in the file's mode shall be cleared upon
12259243Sobrien# successful return from chmod().
12359243Sobrien
12459243Sobrienexpect 0 create ${n0} 0755
12559243Sobrienexpect 0 chown ${n0} 65535 65535
12659243Sobrienexpect 0 -u 65535 -g 65535 chmod ${n0} 02755
12759243Sobrienexpect 02755 stat ${n0} mode
12859243Sobrienexpect 0 -u 65535 -g 65535 chmod ${n0} 0755
129145479Smpexpect 0755 stat ${n0} mode
13059243Sobrien
13159243Sobrientodo FreeBSD "S_ISGID should be removed and chmod(2) should success and FreeBSD returns EPERM."
132145479Smpexpect 0 -u 65535 -g 65534 chmod ${n0} 02755
13359243Sobrienexpect 0755 stat ${n0} mode
13459243Sobrien
13559243Sobrienexpect 0 unlink ${n0}
13659243Sobrien
13759415Sobriencd ${cdir}
13859243Sobrienexpect 0 rmdir ${n2}
13959243Sobrien