1#!/bin/sh
2# $FreeBSD: src/tools/regression/fstest/tests/chmod/00.t,v 1.2 2007/01/25 20:48:14 pjd Exp $
3
4desc="chmod changes permission"
5
6n0=`namegen`
7n1=`namegen`
8n2=`namegen`
9
10expect 0 mkdir ${n2} 0755
11cdir=`pwd`
12cd ${n2}
13
14expect 0 create ${n0} 0644
15expect 0644 stat ${n0} mode
16expect 0 chmod ${n0} 0111
17expect 0111 stat ${n0} mode
18expect 0 unlink ${n0}
19
20expect 0 mkdir ${n0} 0755
21expect 0755 stat ${n0} mode
22expect 0 chmod ${n0} 0753
23expect 0753 stat ${n0} mode
24expect 0 rmdir ${n0}
25
26expect 0 mkfifo ${n0} 0644
27expect 0644 stat ${n0} mode
28expect 0 chmod ${n0} 0310
29expect 0310 stat ${n0} mode
30expect 0 unlink ${n0}
31
32expect 0 create ${n0} 0644
33expect 0 symlink ${n0} ${n1}
34expect 0644 stat ${n1} mode
35expect 0 chmod ${n1} 0321
36expect 0321 stat ${n1} mode
37expect 0321 lstat ${n0} mode
38expect 0 unlink ${n0}
39expect 0 unlink ${n1}
40
41# successful chmod(2) updates ctime.
42expect 0 create ${n0} 0644
43ctime1=`${FSTEST} stat ${n0} ctime`
44sleep 1
45expect 0 chmod ${n0} 0111
46ctime2=`${FSTEST} stat ${n0} ctime`
47test_check $ctime1 -lt $ctime2
48expect 0 unlink ${n0}
49
50expect 0 mkdir ${n0} 0755
51ctime1=`${FSTEST} stat ${n0} ctime`
52sleep 1
53expect 0 chmod ${n0} 0753
54ctime2=`${FSTEST} stat ${n0} ctime`
55test_check $ctime1 -lt $ctime2
56expect 0 rmdir ${n0}
57
58expect 0 mkfifo ${n0} 0644
59ctime1=`${FSTEST} stat ${n0} ctime`
60sleep 1
61expect 0 chmod ${n0} 0310
62ctime2=`${FSTEST} stat ${n0} ctime`
63test_check $ctime1 -lt $ctime2
64expect 0 unlink ${n0}
65
66# unsuccessful chmod(2) does not update ctime.
67expect 0 create ${n0} 0644
68ctime1=`${FSTEST} stat ${n0} ctime`
69sleep 1
70expect EPERM -u 65534 chmod ${n0} 0111
71ctime2=`${FSTEST} stat ${n0} ctime`
72test_check $ctime1 -eq $ctime2
73expect 0 unlink ${n0}
74
75expect 0 mkdir ${n0} 0755
76ctime1=`${FSTEST} stat ${n0} ctime`
77sleep 1
78expect EPERM -u 65534 chmod ${n0} 0753
79ctime2=`${FSTEST} stat ${n0} ctime`
80test_check $ctime1 -eq $ctime2
81expect 0 rmdir ${n0}
82
83expect 0 mkfifo ${n0} 0644
84ctime1=`${FSTEST} stat ${n0} ctime`
85sleep 1
86expect EPERM -u 65534 chmod ${n0} 0310
87ctime2=`${FSTEST} stat ${n0} ctime`
88test_check $ctime1 -eq $ctime2
89expect 0 unlink ${n0}
90
91# POSIX: If the calling process does not have appropriate privileges, and if
92# the group ID of the file does not match the effective group ID or one of the
93# supplementary group IDs and if the file is a regular file, bit S_ISGID
94# (set-group-ID on execution) in the file's mode shall be cleared upon
95# successful return from chmod().
96
97expect 0 create ${n0} 0755
98expect 0 chown ${n0} 65535 65535
99expect 0 -u 65535 -g 65535 chmod ${n0} 02755
100expect 02755 stat ${n0} mode
101expect 0 -u 65535 -g 65535 chmod ${n0} 0755
102expect 0755 stat ${n0} mode
103
104# XXX
105# Unfortunately FreeBSD doesn't clear set-gid bit, but returns EPERM instead.
106#case "${os}" in
107#FreeBSD)
108	expect EPERM -u 65535 -g 65534 chmod ${n0} 02755
109	expect 0755 stat ${n0} mode
110#	;;
111#*)
112#	expect 0 -u 65535 -g 65534 chmod ${n0} 02755
113#	expect 0755 stat ${n0} mode
114#	;;
115#esac
116expect 0 unlink ${n0}
117
118cd ${cdir}
119expect 0 rmdir ${n2}
120