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