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