140a8ac8fSEnji Cooper#!/bin/sh 2*3416500aSEnji Cooper# vim: filetype=sh noexpandtab ts=8 sw=8 340a8ac8fSEnji Cooper# $FreeBSD: head/tools/regression/pjdfstest/tests/chown/00.t 228975 2011-12-30 00:04:11Z uqs $ 440a8ac8fSEnji Cooper 540a8ac8fSEnji Cooperdesc="chown changes ownership" 640a8ac8fSEnji Cooper 740a8ac8fSEnji Cooperdir=`dirname $0` 840a8ac8fSEnji Cooper. ${dir}/../misc.sh 940a8ac8fSEnji Cooper 1040a8ac8fSEnji Cooperif supported lchmod; then 1140a8ac8fSEnji Cooper echo "1..1349" 1240a8ac8fSEnji Cooperelse 1340a8ac8fSEnji Cooper echo "1..1323" 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 Cooper# super-user can always modify ownership 2540a8ac8fSEnji Cooperfor type in regular dir fifo block char socket symlink; do 2640a8ac8fSEnji Cooper if [ "${type}" != "symlink" ]; then 2740a8ac8fSEnji Cooper create_file ${type} ${n0} 2840a8ac8fSEnji Cooper 2940a8ac8fSEnji Cooper expect 0 chown ${n0} 123 456 3040a8ac8fSEnji Cooper expect 123,456 lstat ${n0} uid,gid 3140a8ac8fSEnji Cooper expect 0 chown ${n0} 0 0 3240a8ac8fSEnji Cooper expect 0,0 lstat ${n0} uid,gid 3340a8ac8fSEnji Cooper 3440a8ac8fSEnji Cooper expect 0 symlink ${n0} ${n1} 3540a8ac8fSEnji Cooper uidgid=`${fstest} lstat ${n1} uid,gid` 3640a8ac8fSEnji Cooper expect 0 chown ${n1} 123 456 3740a8ac8fSEnji Cooper expect 123,456 stat ${n1} uid,gid 3840a8ac8fSEnji Cooper expect 123,456 stat ${n0} uid,gid 3940a8ac8fSEnji Cooper expect ${uidgid} lstat ${n1} uid,gid 4040a8ac8fSEnji Cooper expect 0 unlink ${n1} 4140a8ac8fSEnji Cooper 4240a8ac8fSEnji Cooper if [ "${type}" = "dir" ]; then 4340a8ac8fSEnji Cooper expect 0 rmdir ${n0} 4440a8ac8fSEnji Cooper else 4540a8ac8fSEnji Cooper expect 0 unlink ${n0} 4640a8ac8fSEnji Cooper fi 4740a8ac8fSEnji Cooper fi 4840a8ac8fSEnji Cooper 4940a8ac8fSEnji Cooper create_file ${type} ${n0} 5040a8ac8fSEnji Cooper expect 0 lchown ${n0} 123 456 5140a8ac8fSEnji Cooper expect 123,456 lstat ${n0} uid,gid 5240a8ac8fSEnji Cooper if [ "${type}" = "dir" ]; then 5340a8ac8fSEnji Cooper expect 0 rmdir ${n0} 5440a8ac8fSEnji Cooper else 5540a8ac8fSEnji Cooper expect 0 unlink ${n0} 5640a8ac8fSEnji Cooper fi 5740a8ac8fSEnji Cooperdone 5840a8ac8fSEnji Cooper 5940a8ac8fSEnji Cooper# non-super-user can modify file group if he is owner of a file and 6040a8ac8fSEnji Cooper# gid he is setting is in his groups list. 6140a8ac8fSEnji Cooperfor type in regular dir fifo block char socket symlink; do 6240a8ac8fSEnji Cooper if [ "${type}" != "symlink" ]; then 6340a8ac8fSEnji Cooper create_file ${type} ${n0} 6440a8ac8fSEnji Cooper 6540a8ac8fSEnji Cooper expect 0 chown ${n0} 65534 65533 6640a8ac8fSEnji Cooper expect 65534,65533 lstat ${n0} uid,gid 6740a8ac8fSEnji Cooper expect 0 -u 65534 -g 65532,65531 -- chown ${n0} -1 65532 6840a8ac8fSEnji Cooper expect 65534,65532 lstat ${n0} uid,gid 6940a8ac8fSEnji Cooper expect 0 -u 65534 -g 65532,65531 chown ${n0} 65534 65531 7040a8ac8fSEnji Cooper expect 65534,65531 lstat ${n0} uid,gid 7140a8ac8fSEnji Cooper 7240a8ac8fSEnji Cooper expect 0 symlink ${n0} ${n1} 7340a8ac8fSEnji Cooper uidgid=`${fstest} lstat ${n1} uid,gid` 7440a8ac8fSEnji Cooper expect 0 chown ${n1} 65534 65533 7540a8ac8fSEnji Cooper expect 65534,65533 stat ${n0} uid,gid 7640a8ac8fSEnji Cooper expect 65534,65533 stat ${n1} uid,gid 7740a8ac8fSEnji Cooper expect ${uidgid} lstat ${n1} uid,gid 7840a8ac8fSEnji Cooper expect 0 -u 65534 -g 65532,65531 -- chown ${n1} -1 65532 7940a8ac8fSEnji Cooper expect 65534,65532 stat ${n0} uid,gid 8040a8ac8fSEnji Cooper expect 65534,65532 stat ${n1} uid,gid 8140a8ac8fSEnji Cooper expect ${uidgid} lstat ${n1} uid,gid 8240a8ac8fSEnji Cooper expect 0 -u 65534 -g 65532,65531 chown ${n1} 65534 65531 8340a8ac8fSEnji Cooper expect 65534,65531 stat ${n0} uid,gid 8440a8ac8fSEnji Cooper expect 65534,65531 stat ${n1} uid,gid 8540a8ac8fSEnji Cooper expect ${uidgid} lstat ${n1} uid,gid 8640a8ac8fSEnji Cooper expect 0 unlink ${n1} 8740a8ac8fSEnji Cooper 8840a8ac8fSEnji Cooper if [ "${type}" = "dir" ]; then 8940a8ac8fSEnji Cooper expect 0 rmdir ${n0} 9040a8ac8fSEnji Cooper else 9140a8ac8fSEnji Cooper expect 0 unlink ${n0} 9240a8ac8fSEnji Cooper fi 9340a8ac8fSEnji Cooper fi 9440a8ac8fSEnji Cooper 9540a8ac8fSEnji Cooper create_file ${type} ${n0} 9640a8ac8fSEnji Cooper expect 0 lchown ${n0} 65534 65533 9740a8ac8fSEnji Cooper expect 65534,65533 lstat ${n0} uid,gid 9840a8ac8fSEnji Cooper expect 0 -u 65534 -g 65532,65531 -- lchown ${n0} -1 65532 9940a8ac8fSEnji Cooper expect 65534,65532 lstat ${n0} uid,gid 10040a8ac8fSEnji Cooper expect 0 -u 65534 -g 65532,65531 lchown ${n0} 65534 65531 10140a8ac8fSEnji Cooper expect 65534,65531 lstat ${n0} uid,gid 10240a8ac8fSEnji Cooper if [ "${type}" = "dir" ]; then 10340a8ac8fSEnji Cooper expect 0 rmdir ${n0} 10440a8ac8fSEnji Cooper else 10540a8ac8fSEnji Cooper expect 0 unlink ${n0} 10640a8ac8fSEnji Cooper fi 10740a8ac8fSEnji Cooperdone 10840a8ac8fSEnji Cooper 10940a8ac8fSEnji Cooper# chown(2) return 0 if user is not owner of a file, but chown(2) is called 11040a8ac8fSEnji Cooper# with both uid and gid equal to -1. 11140a8ac8fSEnji Cooperfor type in regular dir fifo block char socket symlink; do 11240a8ac8fSEnji Cooper if [ "${type}" != "symlink" ]; then 11340a8ac8fSEnji Cooper create_file ${type} ${n0} 11440a8ac8fSEnji Cooper 11540a8ac8fSEnji Cooper expect 0 chown ${n0} 65534 65533 11640a8ac8fSEnji Cooper expect 0 -u 65532 -g 65531 -- chown ${n0} -1 -1 11740a8ac8fSEnji Cooper expect 65534,65533 stat ${n0} uid,gid 11840a8ac8fSEnji Cooper 11940a8ac8fSEnji Cooper expect 0 symlink ${n0} ${n1} 12040a8ac8fSEnji Cooper uidgid=`${fstest} lstat ${n1} uid,gid` 12140a8ac8fSEnji Cooper expect 0 chown ${n1} 65534 65533 12240a8ac8fSEnji Cooper expect 65534,65533 stat ${n0} uid,gid 12340a8ac8fSEnji Cooper expect 65534,65533 stat ${n1} uid,gid 12440a8ac8fSEnji Cooper expect ${uidgid} lstat ${n1} uid,gid 12540a8ac8fSEnji Cooper expect 0 -u 65532 -g 65531 -- chown ${n0} -1 -1 12640a8ac8fSEnji Cooper expect 65534,65533 stat ${n0} uid,gid 12740a8ac8fSEnji Cooper expect 65534,65533 stat ${n1} uid,gid 12840a8ac8fSEnji Cooper expect ${uidgid} lstat ${n1} uid,gid 12940a8ac8fSEnji Cooper expect 0 unlink ${n1} 13040a8ac8fSEnji Cooper 13140a8ac8fSEnji Cooper if [ "${type}" = "dir" ]; then 13240a8ac8fSEnji Cooper expect 0 rmdir ${n0} 13340a8ac8fSEnji Cooper else 13440a8ac8fSEnji Cooper expect 0 unlink ${n0} 13540a8ac8fSEnji Cooper fi 13640a8ac8fSEnji Cooper fi 13740a8ac8fSEnji Cooper 13840a8ac8fSEnji Cooper create_file ${type} ${n0} 13940a8ac8fSEnji Cooper expect 0 lchown ${n0} 65534 65533 14040a8ac8fSEnji Cooper expect 0 -u 65532 -g 65531 -- lchown ${n0} -1 -1 14140a8ac8fSEnji Cooper expect 65534,65533 lstat ${n0} uid,gid 14240a8ac8fSEnji Cooper if [ "${type}" = "dir" ]; then 14340a8ac8fSEnji Cooper expect 0 rmdir ${n0} 14440a8ac8fSEnji Cooper else 14540a8ac8fSEnji Cooper expect 0 unlink ${n0} 14640a8ac8fSEnji Cooper fi 14740a8ac8fSEnji Cooperdone 14840a8ac8fSEnji Cooper 14940a8ac8fSEnji Cooper# when super-user calls chown(2), set-uid and set-gid bits may be removed. 15040a8ac8fSEnji Cooperfor type in regular dir fifo block char socket symlink; do 15140a8ac8fSEnji Cooper if [ "${type}" != "symlink" ]; then 15240a8ac8fSEnji Cooper create_file ${type} ${n0} 15340a8ac8fSEnji Cooper 15440a8ac8fSEnji Cooper expect 0 chown ${n0} 65534 65533 15540a8ac8fSEnji Cooper expect 0 chmod ${n0} 06555 15640a8ac8fSEnji Cooper expect 06555,65534,65533 stat ${n0} mode,uid,gid 15740a8ac8fSEnji Cooper expect 0 chown ${n0} 65532 65531 15840a8ac8fSEnji Cooper expect "(06555|0555),65532,65531" stat ${n0} mode,uid,gid 15940a8ac8fSEnji Cooper expect 0 chmod ${n0} 06555 16040a8ac8fSEnji Cooper expect 06555,65532,65531 stat ${n0} mode,uid,gid 16140a8ac8fSEnji Cooper expect 0 chown ${n0} 0 0 16240a8ac8fSEnji Cooper expect "(06555|0555),0,0" stat ${n0} mode,uid,gid 16340a8ac8fSEnji Cooper 16440a8ac8fSEnji Cooper expect 0 symlink ${n0} ${n1} 16540a8ac8fSEnji Cooper expect 0 chown ${n1} 65534 65533 16640a8ac8fSEnji Cooper expect 0 chmod ${n1} 06555 16740a8ac8fSEnji Cooper expect 06555,65534,65533 stat ${n0} mode,uid,gid 16840a8ac8fSEnji Cooper expect 06555,65534,65533 stat ${n1} mode,uid,gid 16940a8ac8fSEnji Cooper expect 0 chown ${n1} 65532 65531 17040a8ac8fSEnji Cooper expect "(06555|0555),65532,65531" stat ${n0} mode,uid,gid 17140a8ac8fSEnji Cooper expect "(06555|0555),65532,65531" stat ${n1} mode,uid,gid 17240a8ac8fSEnji Cooper expect 0 chmod ${n1} 06555 17340a8ac8fSEnji Cooper expect 06555,65532,65531 stat ${n0} mode,uid,gid 17440a8ac8fSEnji Cooper expect 06555,65532,65531 stat ${n1} mode,uid,gid 17540a8ac8fSEnji Cooper expect 0 chown ${n1} 0 0 17640a8ac8fSEnji Cooper expect "(06555|0555),0,0" stat ${n0} mode,uid,gid 17740a8ac8fSEnji Cooper expect "(06555|0555),0,0" stat ${n1} mode,uid,gid 17840a8ac8fSEnji Cooper expect 0 unlink ${n1} 17940a8ac8fSEnji Cooper 18040a8ac8fSEnji Cooper if [ "${type}" = "dir" ]; then 18140a8ac8fSEnji Cooper expect 0 rmdir ${n0} 18240a8ac8fSEnji Cooper else 18340a8ac8fSEnji Cooper expect 0 unlink ${n0} 18440a8ac8fSEnji Cooper fi 18540a8ac8fSEnji Cooper fi 18640a8ac8fSEnji Cooper 18740a8ac8fSEnji Cooper if [ "${type}" != "symlink" ] || supported lchmod; then 18840a8ac8fSEnji Cooper create_file ${type} ${n0} 18940a8ac8fSEnji Cooper expect 0 lchown ${n0} 65534 65533 19040a8ac8fSEnji Cooper if supported lchmod; then 19140a8ac8fSEnji Cooper expect 0 lchmod ${n0} 06555 19240a8ac8fSEnji Cooper else 19340a8ac8fSEnji Cooper expect 0 chmod ${n0} 06555 19440a8ac8fSEnji Cooper fi 19540a8ac8fSEnji Cooper expect 06555,65534,65533 lstat ${n0} mode,uid,gid 19640a8ac8fSEnji Cooper expect 0 lchown ${n0} 65532 65531 19740a8ac8fSEnji Cooper expect "(06555|0555),65532,65531" lstat ${n0} mode,uid,gid 19840a8ac8fSEnji Cooper if supported lchmod; then 19940a8ac8fSEnji Cooper expect 0 lchmod ${n0} 06555 20040a8ac8fSEnji Cooper else 20140a8ac8fSEnji Cooper expect 0 chmod ${n0} 06555 20240a8ac8fSEnji Cooper fi 20340a8ac8fSEnji Cooper expect 06555,65532,65531 lstat ${n0} mode,uid,gid 20440a8ac8fSEnji Cooper expect 0 lchown ${n0} 0 0 20540a8ac8fSEnji Cooper expect "(06555|0555),0,0" lstat ${n0} mode,uid,gid 20640a8ac8fSEnji Cooper if [ "${type}" = "dir" ]; then 20740a8ac8fSEnji Cooper expect 0 rmdir ${n0} 20840a8ac8fSEnji Cooper else 20940a8ac8fSEnji Cooper expect 0 unlink ${n0} 21040a8ac8fSEnji Cooper fi 21140a8ac8fSEnji Cooper fi 21240a8ac8fSEnji Cooperdone 21340a8ac8fSEnji Cooper 21440a8ac8fSEnji Cooper# when non-super-user calls chown(2) successfully, set-uid and set-gid bits may 21540a8ac8fSEnji Cooper# be removed, except when both uid and gid are equal to -1. 21640a8ac8fSEnji Cooperfor type in regular dir fifo block char socket symlink; do 217*3416500aSEnji Cooper # 218*3416500aSEnji Cooper # Linux makes a destinction for behavior when an executable file vs a 219*3416500aSEnji Cooper # non-executable file. From chmod(2): 220*3416500aSEnji Cooper # 221*3416500aSEnji Cooper # When the owner or group of an executable file are changed by an 222*3416500aSEnji Cooper # unprivileged user the S_ISUID and S_ISGID mode bits are cleared. 223*3416500aSEnji Cooper # 224*3416500aSEnji Cooper # I believe in this particular case, the behavior's bugged. 225*3416500aSEnji Cooper # 226*3416500aSEnji Cooper if [ "${type}" = "dir" -a "${os}" = "Linux" ]; then 227*3416500aSEnji Cooper _todo_msg="Linux doesn't clear the SGID/SUID bits for directories, despite the description noted" 228*3416500aSEnji Cooper else 229*3416500aSEnji Cooper _todo_msg= 230*3416500aSEnji Cooper fi 23140a8ac8fSEnji Cooper if [ "${type}" != "symlink" ]; then 23240a8ac8fSEnji Cooper create_file ${type} ${n0} 23340a8ac8fSEnji Cooper 23440a8ac8fSEnji Cooper expect 0 chown ${n0} 65534 65533 23540a8ac8fSEnji Cooper expect 0 chmod ${n0} 06555 23640a8ac8fSEnji Cooper expect 06555,65534,65533 stat ${n0} mode,uid,gid 23740a8ac8fSEnji Cooper expect 0 -u 65534 -g 65533,65532 chown ${n0} 65534 65532 238*3416500aSEnji Cooper [ -n "${_todo_msg}" ] && todo "Linux" "${_todo_msg}" 23940a8ac8fSEnji Cooper expect 0555,65534,65532 stat ${n0} mode,uid,gid 24040a8ac8fSEnji Cooper expect 0 chmod ${n0} 06555 24140a8ac8fSEnji Cooper expect 06555,65534,65532 stat ${n0} mode,uid,gid 24240a8ac8fSEnji Cooper expect 0 -u 65534 -g 65533,65532 -- chown ${n0} -1 65533 243*3416500aSEnji Cooper [ -n "${_todo_msg}" ] && todo "Linux" "${_todo_msg}" 24440a8ac8fSEnji Cooper expect 0555,65534,65533 stat ${n0} mode,uid,gid 24540a8ac8fSEnji Cooper expect 0 chmod ${n0} 06555 24640a8ac8fSEnji Cooper expect 06555,65534,65533 stat ${n0} mode,uid,gid 24740a8ac8fSEnji Cooper expect 0 -u 65534 -g 65533,65532 -- chown ${n0} -1 -1 24840a8ac8fSEnji Cooper expect "(06555|0555),65534,65533" stat ${n0} mode,uid,gid 24940a8ac8fSEnji Cooper 25040a8ac8fSEnji Cooper expect 0 symlink ${n0} ${n1} 25140a8ac8fSEnji Cooper expect 0 chown ${n1} 65534 65533 25240a8ac8fSEnji Cooper expect 0 chmod ${n1} 06555 25340a8ac8fSEnji Cooper expect 06555,65534,65533 stat ${n0} mode,uid,gid 25440a8ac8fSEnji Cooper expect 06555,65534,65533 stat ${n1} mode,uid,gid 25540a8ac8fSEnji Cooper expect 0 -u 65534 -g 65533,65532 chown ${n1} 65534 65532 256*3416500aSEnji Cooper [ -n "${_todo_msg}" ] && todo "Linux" "${_todo_msg}" 25740a8ac8fSEnji Cooper expect 0555,65534,65532 stat ${n0} mode,uid,gid 258*3416500aSEnji Cooper [ -n "${_todo_msg}" ] && todo "Linux" "${_todo_msg}" 25940a8ac8fSEnji Cooper expect 0555,65534,65532 stat ${n1} mode,uid,gid 26040a8ac8fSEnji Cooper expect 0 chmod ${n1} 06555 26140a8ac8fSEnji Cooper expect 06555,65534,65532 stat ${n0} mode,uid,gid 26240a8ac8fSEnji Cooper expect 06555,65534,65532 stat ${n1} mode,uid,gid 26340a8ac8fSEnji Cooper expect 0 -u 65534 -g 65533,65532 -- chown ${n1} -1 65533 264*3416500aSEnji Cooper [ -n "${_todo_msg}" ] && todo "Linux" "${_todo_msg}" 26540a8ac8fSEnji Cooper expect 0555,65534,65533 stat ${n0} mode,uid,gid 266*3416500aSEnji Cooper [ -n "${_todo_msg}" ] && todo "Linux" "${_todo_msg}" 26740a8ac8fSEnji Cooper expect 0555,65534,65533 stat ${n1} mode,uid,gid 26840a8ac8fSEnji Cooper expect 0 chmod ${n1} 06555 26940a8ac8fSEnji Cooper expect 06555,65534,65533 stat ${n0} mode,uid,gid 27040a8ac8fSEnji Cooper expect 06555,65534,65533 stat ${n1} mode,uid,gid 27140a8ac8fSEnji Cooper expect 0 -u 65534 -g 65533,65532 -- chown ${n1} -1 -1 27240a8ac8fSEnji Cooper expect "(06555|0555),65534,65533" stat ${n0} mode,uid,gid 27340a8ac8fSEnji Cooper expect "(06555|0555),65534,65533" stat ${n1} mode,uid,gid 27440a8ac8fSEnji Cooper expect 0 unlink ${n1} 27540a8ac8fSEnji Cooper 27640a8ac8fSEnji Cooper if [ "${type}" = "dir" ]; then 27740a8ac8fSEnji Cooper expect 0 rmdir ${n0} 27840a8ac8fSEnji Cooper else 27940a8ac8fSEnji Cooper expect 0 unlink ${n0} 28040a8ac8fSEnji Cooper fi 28140a8ac8fSEnji Cooper fi 28240a8ac8fSEnji Cooper 28340a8ac8fSEnji Cooper if [ "${type}" != "symlink" ] || supported lchmod; then 28440a8ac8fSEnji Cooper create_file ${type} ${n0} 28540a8ac8fSEnji Cooper 28640a8ac8fSEnji Cooper expect 0 lchown ${n0} 65534 65533 28740a8ac8fSEnji Cooper if supported lchmod; then 28840a8ac8fSEnji Cooper expect 0 lchmod ${n0} 06555 28940a8ac8fSEnji Cooper else 29040a8ac8fSEnji Cooper expect 0 chmod ${n0} 06555 29140a8ac8fSEnji Cooper fi 29240a8ac8fSEnji Cooper expect 06555,65534,65533 lstat ${n0} mode,uid,gid 29340a8ac8fSEnji Cooper expect 0 -u 65534 -g 65533,65532 lchown ${n0} 65534 65532 294*3416500aSEnji Cooper [ -n "${_todo_msg}" ] && todo "Linux" "${_todo_msg}" 29540a8ac8fSEnji Cooper expect 0555,65534,65532 lstat ${n0} mode,uid,gid 29640a8ac8fSEnji Cooper if supported lchmod; then 29740a8ac8fSEnji Cooper expect 0 lchmod ${n0} 06555 29840a8ac8fSEnji Cooper else 29940a8ac8fSEnji Cooper expect 0 chmod ${n0} 06555 30040a8ac8fSEnji Cooper fi 30140a8ac8fSEnji Cooper expect 06555,65534,65532 lstat ${n0} mode,uid,gid 30240a8ac8fSEnji Cooper expect 0 -u 65534 -g 65533,65532 -- lchown ${n0} -1 65533 303*3416500aSEnji Cooper [ -n "${_todo_msg}" ] && todo "Linux" "${_todo_msg}" 30440a8ac8fSEnji Cooper expect 0555,65534,65533 lstat ${n0} mode,uid,gid 30540a8ac8fSEnji Cooper if supported lchmod; then 30640a8ac8fSEnji Cooper expect 0 lchmod ${n0} 06555 30740a8ac8fSEnji Cooper else 30840a8ac8fSEnji Cooper expect 0 chmod ${n0} 06555 30940a8ac8fSEnji Cooper fi 31040a8ac8fSEnji Cooper expect 06555,65534,65533 lstat ${n0} mode,uid,gid 31140a8ac8fSEnji Cooper expect 0 -u 65534 -g 65533,65532 -- lchown ${n0} -1 -1 31240a8ac8fSEnji Cooper expect "(06555|0555),65534,65533" lstat ${n0} mode,uid,gid 31340a8ac8fSEnji Cooper 31440a8ac8fSEnji Cooper if [ "${type}" = "dir" ]; then 31540a8ac8fSEnji Cooper expect 0 rmdir ${n0} 31640a8ac8fSEnji Cooper else 31740a8ac8fSEnji Cooper expect 0 unlink ${n0} 31840a8ac8fSEnji Cooper fi 31940a8ac8fSEnji Cooper fi 32040a8ac8fSEnji Cooperdone 32140a8ac8fSEnji Cooper 32240a8ac8fSEnji Cooper# successful chown(2) call (except uid and gid equal to -1) updates ctime. 32340a8ac8fSEnji Cooperfor type in regular dir fifo block char socket symlink; do 32440a8ac8fSEnji Cooper if [ "${type}" != "symlink" ]; then 32540a8ac8fSEnji Cooper create_file ${type} ${n0} 32640a8ac8fSEnji Cooper 32740a8ac8fSEnji Cooper ctime1=`${fstest} stat ${n0} ctime` 32840a8ac8fSEnji Cooper sleep 1 32940a8ac8fSEnji Cooper expect 0 chown ${n0} 65534 65533 33040a8ac8fSEnji Cooper expect 65534,65533 stat ${n0} uid,gid 33140a8ac8fSEnji Cooper ctime2=`${fstest} stat ${n0} ctime` 33240a8ac8fSEnji Cooper test_check $ctime1 -lt $ctime2 33340a8ac8fSEnji Cooper ctime1=`${fstest} stat ${n0} ctime` 33440a8ac8fSEnji Cooper sleep 1 33540a8ac8fSEnji Cooper expect 0 -u 65534 -g 65532 chown ${n0} 65534 65532 33640a8ac8fSEnji Cooper expect 65534,65532 stat ${n0} uid,gid 33740a8ac8fSEnji Cooper ctime2=`${fstest} stat ${n0} ctime` 33840a8ac8fSEnji Cooper test_check $ctime1 -lt $ctime2 33940a8ac8fSEnji Cooper 34040a8ac8fSEnji Cooper expect 0 symlink ${n0} ${n1} 34140a8ac8fSEnji Cooper ctime1=`${fstest} stat ${n1} ctime` 34240a8ac8fSEnji Cooper sleep 1 34340a8ac8fSEnji Cooper expect 0 chown ${n1} 65533 65532 34440a8ac8fSEnji Cooper expect 65533,65532 stat ${n1} uid,gid 34540a8ac8fSEnji Cooper ctime2=`${fstest} stat ${n1} ctime` 34640a8ac8fSEnji Cooper test_check $ctime1 -lt $ctime2 34740a8ac8fSEnji Cooper ctime1=`${fstest} stat ${n1} ctime` 34840a8ac8fSEnji Cooper sleep 1 34940a8ac8fSEnji Cooper expect 0 -u 65533 -g 65531 chown ${n1} 65533 65531 35040a8ac8fSEnji Cooper expect 65533,65531 stat ${n1} uid,gid 35140a8ac8fSEnji Cooper ctime2=`${fstest} stat ${n1} ctime` 35240a8ac8fSEnji Cooper test_check $ctime1 -lt $ctime2 35340a8ac8fSEnji Cooper expect 0 unlink ${n1} 35440a8ac8fSEnji Cooper 35540a8ac8fSEnji Cooper if [ "${type}" = "dir" ]; then 35640a8ac8fSEnji Cooper expect 0 rmdir ${n0} 35740a8ac8fSEnji Cooper else 35840a8ac8fSEnji Cooper expect 0 unlink ${n0} 35940a8ac8fSEnji Cooper fi 36040a8ac8fSEnji Cooper fi 36140a8ac8fSEnji Cooper 36240a8ac8fSEnji Cooper create_file ${type} ${n0} 36340a8ac8fSEnji Cooper 36440a8ac8fSEnji Cooper ctime1=`${fstest} lstat ${n0} ctime` 36540a8ac8fSEnji Cooper sleep 1 36640a8ac8fSEnji Cooper expect 0 lchown ${n0} 65534 65533 36740a8ac8fSEnji Cooper expect 65534,65533 lstat ${n0} uid,gid 36840a8ac8fSEnji Cooper ctime2=`${fstest} lstat ${n0} ctime` 36940a8ac8fSEnji Cooper test_check $ctime1 -lt $ctime2 37040a8ac8fSEnji Cooper ctime1=`${fstest} lstat ${n0} ctime` 37140a8ac8fSEnji Cooper sleep 1 37240a8ac8fSEnji Cooper expect 0 -u 65534 -g 65532 lchown ${n0} 65534 65532 37340a8ac8fSEnji Cooper expect 65534,65532 lstat ${n0} uid,gid 37440a8ac8fSEnji Cooper ctime2=`${fstest} lstat ${n0} ctime` 37540a8ac8fSEnji Cooper test_check $ctime1 -lt $ctime2 37640a8ac8fSEnji Cooper 37740a8ac8fSEnji Cooper if [ "${type}" = "dir" ]; then 37840a8ac8fSEnji Cooper expect 0 rmdir ${n0} 37940a8ac8fSEnji Cooper else 38040a8ac8fSEnji Cooper expect 0 unlink ${n0} 38140a8ac8fSEnji Cooper fi 38240a8ac8fSEnji Cooperdone 38340a8ac8fSEnji Cooper 38440a8ac8fSEnji Cooperfor type in regular dir fifo block char socket symlink; do 38540a8ac8fSEnji Cooper if [ "${type}" != "symlink" ]; then 38640a8ac8fSEnji Cooper create_file ${type} ${n0} 38740a8ac8fSEnji Cooper 38840a8ac8fSEnji Cooper ctime1=`${fstest} stat ${n0} ctime` 38940a8ac8fSEnji Cooper sleep 1 39040a8ac8fSEnji Cooper expect 0 -- chown ${n0} -1 -1 39140a8ac8fSEnji Cooper ctime2=`${fstest} stat ${n0} ctime` 39240a8ac8fSEnji Cooper todo Linux "According to POSIX: If both owner and group are -1, the times need not be updated." 39340a8ac8fSEnji Cooper test_check $ctime1 -eq $ctime2 39440a8ac8fSEnji Cooper expect 0,0 stat ${n0} uid,gid 39540a8ac8fSEnji Cooper 39640a8ac8fSEnji Cooper expect 0 symlink ${n0} ${n1} 39740a8ac8fSEnji Cooper ctime1=`${fstest} stat ${n1} ctime` 39840a8ac8fSEnji Cooper sleep 1 39940a8ac8fSEnji Cooper expect 0 -- chown ${n1} -1 -1 40040a8ac8fSEnji Cooper ctime2=`${fstest} stat ${n1} ctime` 40140a8ac8fSEnji Cooper todo Linux "According to POSIX: If both owner and group are -1, the times need not be updated." 40240a8ac8fSEnji Cooper test_check $ctime1 -eq $ctime2 40340a8ac8fSEnji Cooper expect 0,0 stat ${n1} uid,gid 40440a8ac8fSEnji Cooper expect 0 unlink ${n1} 40540a8ac8fSEnji Cooper 40640a8ac8fSEnji Cooper if [ "${type}" = "dir" ]; then 40740a8ac8fSEnji Cooper expect 0 rmdir ${n0} 40840a8ac8fSEnji Cooper else 40940a8ac8fSEnji Cooper expect 0 unlink ${n0} 41040a8ac8fSEnji Cooper fi 41140a8ac8fSEnji Cooper fi 41240a8ac8fSEnji Cooper 41340a8ac8fSEnji Cooper create_file ${type} ${n0} 41440a8ac8fSEnji Cooper 41540a8ac8fSEnji Cooper ctime1=`${fstest} lstat ${n0} ctime` 41640a8ac8fSEnji Cooper sleep 1 41740a8ac8fSEnji Cooper expect 0 -- lchown ${n0} -1 -1 41840a8ac8fSEnji Cooper ctime2=`${fstest} lstat ${n0} ctime` 41940a8ac8fSEnji Cooper todo Linux "According to POSIX: If both owner and group are -1, the times need not be updated." 42040a8ac8fSEnji Cooper test_check $ctime1 -eq $ctime2 42140a8ac8fSEnji Cooper expect 0,0 lstat ${n0} uid,gid 42240a8ac8fSEnji Cooper 42340a8ac8fSEnji Cooper if [ "${type}" = "dir" ]; then 42440a8ac8fSEnji Cooper expect 0 rmdir ${n0} 42540a8ac8fSEnji Cooper else 42640a8ac8fSEnji Cooper expect 0 unlink ${n0} 42740a8ac8fSEnji Cooper fi 42840a8ac8fSEnji Cooperdone 42940a8ac8fSEnji Cooper 43040a8ac8fSEnji Cooper# unsuccessful chown(2) does not update ctime. 43140a8ac8fSEnji Cooperfor type in regular dir fifo block char socket symlink; do 43240a8ac8fSEnji Cooper if [ "${type}" != "symlink" ]; then 43340a8ac8fSEnji Cooper create_file ${type} ${n0} 43440a8ac8fSEnji Cooper 43540a8ac8fSEnji Cooper ctime1=`${fstest} stat ${n0} ctime` 43640a8ac8fSEnji Cooper sleep 1 43740a8ac8fSEnji Cooper expect EPERM -u 65534 -- chown ${n0} 65534 -1 43840a8ac8fSEnji Cooper expect EPERM -u 65534 -g 65534 -- chown ${n0} -1 65534 43940a8ac8fSEnji Cooper expect EPERM -u 65534 -g 65534 chown ${n0} 65534 65534 44040a8ac8fSEnji Cooper ctime2=`${fstest} stat ${n0} ctime` 44140a8ac8fSEnji Cooper test_check $ctime1 -eq $ctime2 44240a8ac8fSEnji Cooper expect 0,0 stat ${n0} uid,gid 44340a8ac8fSEnji Cooper 44440a8ac8fSEnji Cooper expect 0 symlink ${n0} ${n1} 44540a8ac8fSEnji Cooper ctime1=`${fstest} stat ${n1} ctime` 44640a8ac8fSEnji Cooper sleep 1 44740a8ac8fSEnji Cooper expect EPERM -u 65534 -- chown ${n1} 65534 -1 44840a8ac8fSEnji Cooper expect EPERM -u 65534 -g 65534 -- chown ${n1} -1 65534 44940a8ac8fSEnji Cooper expect EPERM -u 65534 -g 65534 chown ${n1} 65534 65534 45040a8ac8fSEnji Cooper ctime2=`${fstest} stat ${n1} ctime` 45140a8ac8fSEnji Cooper test_check $ctime1 -eq $ctime2 45240a8ac8fSEnji Cooper expect 0,0 stat ${n1} uid,gid 45340a8ac8fSEnji Cooper expect 0 unlink ${n1} 45440a8ac8fSEnji Cooper 45540a8ac8fSEnji Cooper if [ "${type}" = "dir" ]; then 45640a8ac8fSEnji Cooper expect 0 rmdir ${n0} 45740a8ac8fSEnji Cooper else 45840a8ac8fSEnji Cooper expect 0 unlink ${n0} 45940a8ac8fSEnji Cooper fi 46040a8ac8fSEnji Cooper fi 46140a8ac8fSEnji Cooper 46240a8ac8fSEnji Cooper create_file ${type} ${n0} 46340a8ac8fSEnji Cooper 46440a8ac8fSEnji Cooper ctime1=`${fstest} lstat ${n0} ctime` 46540a8ac8fSEnji Cooper sleep 1 46640a8ac8fSEnji Cooper expect EPERM -u 65534 -- lchown ${n0} 65534 -1 46740a8ac8fSEnji Cooper expect EPERM -u 65534 -g 65534 -- lchown ${n0} -1 65534 46840a8ac8fSEnji Cooper expect EPERM -u 65534 -g 65534 lchown ${n0} 65534 65534 46940a8ac8fSEnji Cooper ctime2=`${fstest} lstat ${n0} ctime` 47040a8ac8fSEnji Cooper test_check $ctime1 -eq $ctime2 47140a8ac8fSEnji Cooper expect 0,0 lstat ${n0} uid,gid 47240a8ac8fSEnji Cooper 47340a8ac8fSEnji Cooper if [ "${type}" = "dir" ]; then 47440a8ac8fSEnji Cooper expect 0 rmdir ${n0} 47540a8ac8fSEnji Cooper else 47640a8ac8fSEnji Cooper expect 0 unlink ${n0} 47740a8ac8fSEnji Cooper fi 47840a8ac8fSEnji Cooperdone 47940a8ac8fSEnji Cooper 48040a8ac8fSEnji Coopercd ${cdir} 48140a8ac8fSEnji Cooperexpect 0 rmdir ${n2} 482