00.t revision 166065
1166065Spjd#!/bin/sh
2166065Spjd# $FreeBSD: head/tools/regression/fstest/tests/chmod/00.t 166065 2007-01-17 01:42:12Z pjd $
3166065Spjd
4166065Spjddesc="chmod changes permission"
5166065Spjd
6166065Spjddir=`dirname $0`
7166065Spjd. ${dir}/../misc.sh
8166065Spjd
9166065Spjdif supported lchmod; then
10166065Spjd	echo "1..77"
11166065Spjdelse
12166065Spjd	echo "1..58"
13166065Spjdfi
14166065Spjd
15166065Spjdn0=`namegen`
16166065Spjdn1=`namegen`
17166065Spjdn2=`namegen`
18166065Spjd
19166065Spjdexpect 0 mkdir ${n2} 0755
20166065Spjdcdir=`pwd`
21166065Spjdcd ${n2}
22166065Spjd
23166065Spjdexpect 0 create ${n0} 0644
24166065Spjdexpect 0644 stat ${n0} mode
25166065Spjdexpect 0 chmod ${n0} 0111
26166065Spjdexpect 0111 stat ${n0} mode
27166065Spjdexpect 0 unlink ${n0}
28166065Spjd
29166065Spjdexpect 0 mkdir ${n0} 0755
30166065Spjdexpect 0755 stat ${n0} mode
31166065Spjdexpect 0 chmod ${n0} 0753
32166065Spjdexpect 0753 stat ${n0} mode
33166065Spjdexpect 0 rmdir ${n0}
34166065Spjd
35166065Spjdexpect 0 mkfifo ${n0} 0644
36166065Spjdexpect 0644 stat ${n0} mode
37166065Spjdexpect 0 chmod ${n0} 0310
38166065Spjdexpect 0310 stat ${n0} mode
39166065Spjdexpect 0 unlink ${n0}
40166065Spjd
41166065Spjdexpect 0 create ${n0} 0644
42166065Spjdexpect 0 symlink ${n0} ${n1}
43166065Spjdexpect 0644 stat ${n1} mode
44166065Spjdexpect 0 chmod ${n1} 0321
45166065Spjdexpect 0321 stat ${n1} mode
46166065Spjdexpect 0321 lstat ${n0} mode
47166065Spjdexpect 0 unlink ${n0}
48166065Spjdexpect 0 unlink ${n1}
49166065Spjd
50166065Spjdif supported lchmod; then
51166065Spjd	expect 0 create ${n0} 0644
52166065Spjd	expect 0 symlink ${n0} ${n1}
53166065Spjd	expect 0644 stat ${n1} mode
54166065Spjd	expect 0 lchmod ${n1} 0321
55166065Spjd	expect 0321 lstat ${n1} mode
56166065Spjd	expect 0 lchmod ${n1} 0531
57166065Spjd	expect 0531 lstat ${n1} mode
58166065Spjd	expect 0644 stat ${n0} mode
59166065Spjd	expect 0644 stat ${n1} mode
60166065Spjd	expect 0 unlink ${n0}
61166065Spjd	expect 0 unlink ${n1}
62166065Spjdfi
63166065Spjd
64166065Spjd# successful chmod(2) updates ctime.
65166065Spjdexpect 0 create ${n0} 0644
66166065Spjdctime1=`${fstest} stat ${n0} ctime`
67166065Spjdsleep 1
68166065Spjdexpect 0 chmod ${n0} 0111
69166065Spjdctime2=`${fstest} stat ${n0} ctime`
70166065Spjdtest_check $ctime1 -lt $ctime2
71166065Spjdexpect 0 unlink ${n0}
72166065Spjd
73166065Spjdexpect 0 mkdir ${n0} 0755
74166065Spjdctime1=`${fstest} stat ${n0} ctime`
75166065Spjdsleep 1
76166065Spjdexpect 0 chmod ${n0} 0753
77166065Spjdctime2=`${fstest} stat ${n0} ctime`
78166065Spjdtest_check $ctime1 -lt $ctime2
79166065Spjdexpect 0 rmdir ${n0}
80166065Spjd
81166065Spjdexpect 0 mkfifo ${n0} 0644
82166065Spjdctime1=`${fstest} stat ${n0} ctime`
83166065Spjdsleep 1
84166065Spjdexpect 0 chmod ${n0} 0310
85166065Spjdctime2=`${fstest} stat ${n0} ctime`
86166065Spjdtest_check $ctime1 -lt $ctime2
87166065Spjdexpect 0 unlink ${n0}
88166065Spjd
89166065Spjdif supported lchmod; then
90166065Spjd	expect 0 symlink ${n1} ${n0}
91166065Spjd	ctime1=`${fstest} lstat ${n0} ctime`
92166065Spjd	sleep 1
93166065Spjd	expect 0 lchmod ${n0} 0321
94166065Spjd	ctime2=`${fstest} lstat ${n0} ctime`
95166065Spjd	test_check $ctime1 -lt $ctime2
96166065Spjd	expect 0 unlink ${n0}
97166065Spjdfi
98166065Spjd
99166065Spjd# unsuccessful chmod(2) does not update ctime.
100166065Spjdexpect 0 create ${n0} 0644
101166065Spjdctime1=`${fstest} stat ${n0} ctime`
102166065Spjdsleep 1
103166065Spjdexpect EPERM -u 65534 chmod ${n0} 0111
104166065Spjdctime2=`${fstest} stat ${n0} ctime`
105166065Spjdtest_check $ctime1 -eq $ctime2
106166065Spjdexpect 0 unlink ${n0}
107166065Spjd
108166065Spjdexpect 0 mkdir ${n0} 0755
109166065Spjdctime1=`${fstest} stat ${n0} ctime`
110166065Spjdsleep 1
111166065Spjdexpect EPERM -u 65534 chmod ${n0} 0753
112166065Spjdctime2=`${fstest} stat ${n0} ctime`
113166065Spjdtest_check $ctime1 -eq $ctime2
114166065Spjdexpect 0 rmdir ${n0}
115166065Spjd
116166065Spjdexpect 0 mkfifo ${n0} 0644
117166065Spjdctime1=`${fstest} stat ${n0} ctime`
118166065Spjdsleep 1
119166065Spjdexpect EPERM -u 65534 chmod ${n0} 0310
120166065Spjdctime2=`${fstest} stat ${n0} ctime`
121166065Spjdtest_check $ctime1 -eq $ctime2
122166065Spjdexpect 0 unlink ${n0}
123166065Spjd
124166065Spjdif supported lchmod; then
125166065Spjd	expect 0 symlink ${n1} ${n0}
126166065Spjd	ctime1=`${fstest} lstat ${n0} ctime`
127166065Spjd	sleep 1
128166065Spjd	expect EPERM -u 65534 lchmod ${n0} 0321
129166065Spjd	ctime2=`${fstest} lstat ${n0} ctime`
130166065Spjd	test_check $ctime1 -eq $ctime2
131166065Spjd	expect 0 unlink ${n0}
132166065Spjdfi
133166065Spjd
134166065Spjd# POSIX: If the calling process does not have appropriate privileges, and if
135166065Spjd# the group ID of the file does not match the effective group ID or one of the
136166065Spjd# supplementary group IDs and if the file is a regular file, bit S_ISGID
137166065Spjd# (set-group-ID on execution) in the file's mode shall be cleared upon
138166065Spjd# successful return from chmod().
139166065Spjd
140166065Spjdexpect 0 create ${n0} 0755
141166065Spjdexpect 0 chown ${n0} 65535 65535
142166065Spjdexpect 0 -u 65535 -g 65535 chmod ${n0} 02755
143166065Spjdexpect 02755 stat ${n0} mode
144166065Spjdexpect 0 -u 65535 -g 65535 chmod ${n0} 0755
145166065Spjdexpect 0755 stat ${n0} mode
146166065Spjd
147166065Spjd# Unfortunately FreeBSD doesn't clear set-gid bit, but returns EPERM instead.
148166065Spjdcase "${os}:${fs}" in
149166065SpjdFreeBSD:UFS)
150166065Spjd	expect EPERM -u 65535 -g 65534 chmod ${n0} 02755
151166065Spjd	expect 0755 stat ${n0} mode
152166065Spjd	;;
153166065Spjd*)
154166065Spjd	expect 0 -u 65535 -g 65534 chmod ${n0} 02755
155166065Spjd	expect 0755 stat ${n0} mode
156166065Spjd	;;
157166065Spjdesac
158166065Spjdexpect 0 unlink ${n0}
159166065Spjd
160166065Spjdcd ${cdir}
161166065Spjdexpect 0 rmdir ${n2}
162