1#!/bin/sh
2# $FreeBSD: src/tools/regression/fstest/tests/chown/00.t,v 1.1 2007/01/17 01:42:08 pjd Exp $
3
4desc="chown changes ownership"
5
6n0=`namegen`
7n1=`namegen`
8n2=`namegen`
9
10expect 0 mkdir ${n2} 0755
11cdir=`pwd`
12cd ${n2}
13
14# super-user can always modify ownership
15# 2
16expect 0 create ${n0} 0644
17expect 0 chown ${n0} 123 456
18expect 123,456 lstat ${n0} uid,gid
19expect 0 chown ${n0} 0 0
20expect 0,0 lstat ${n0} uid,gid
21expect 0 unlink ${n0}
22# 8
23expect 0 mkfifo ${n0} 0644
24expect 0 chown ${n0} 123 456
25expect 123,456 lstat ${n0} uid,gid
26expect 0 chown ${n0} 0 0
27expect 0,0 lstat ${n0} uid,gid
28expect 0 unlink ${n0}
29# 14
30expect 0 mkdir ${n0} 0755
31expect 0 chown ${n0} 123 456
32expect 123,456 lstat ${n0} uid,gid
33expect 0 chown ${n0} 0 0
34expect 0,0 lstat ${n0} uid,gid
35expect 0 rmdir ${n0}
36# 20
37expect 0 create ${n0} 0644
38expect 0 symlink ${n0} ${n1}
39expect 0 chown ${n1} 123 456
40expect 123,456 stat ${n1} uid,gid
41expect 123,456 stat ${n0} uid,gid
42expect 0 lchown ${n1} 135 579
43expect 135,579 lstat ${n1} uid,gid
44expect 123,456 stat ${n1} uid,gid
45expect 123,456 stat ${n0} uid,gid
46expect 0 unlink ${n0}
47expect 0 unlink ${n1}
48
49# non-super-user can modify file group if he is owner of a file and
50# gid he is setting is in his groups list.
51# 31
52expect 0 create ${n0} 0644
53expect 0 chown ${n0} 65534 65533
54expect 65534,65533 lstat ${n0} uid,gid
55expect 0 -u 65534 -g 65532,65531 chown ${n0} -1 65532
56expect 65534,65532 lstat ${n0} uid,gid
57expect 0 -u 65534 -g 65532,65531 chown ${n0} 65534 65531
58expect 65534,65531 lstat ${n0} uid,gid
59expect 0 unlink ${n0}
60
61# chown(2) return 0 if user is not owner of a file, but chown(2) is called
62# with both uid and gid equal to -1.
63# 39
64expect 0 create ${n0} 0644
65expect 0 chown ${n0} 65534 65533
66expect 0 -u 65532 -g 65531 chown ${n0} -1 -1
67expect 0 unlink ${n0}
68
69# when super-user calls chown(2), set-uid and set-gid bits are not removed.
70# 43
71expect 0 create ${n0} 0644
72expect 0 chown ${n0} 65534 65533
73expect 0 chmod ${n0} 06555
74expect 06555 lstat ${n0} mode
75expect 0 chown ${n0} 65532 65531
76expect 06555 lstat ${n0} mode
77expect 0 unlink ${n0}
78# 50
79expect 0 create ${n0} 0644
80expect 0 chown ${n0} 0 0
81expect 0 chmod ${n0} 06555
82expect 06555 lstat ${n0} mode
83expect 0 chown ${n0} 65534 65533
84expect 06555 lstat ${n0} mode
85expect 0 unlink ${n0}
86# 57
87expect 0 create ${n0} 0644
88expect 0 chown ${n0} 65534 65533
89expect 0 chmod ${n0} 06555
90expect 06555 lstat ${n0} mode
91expect 0 chown ${n0} 0 0
92expect 06555 lstat ${n0} mode
93expect 0 unlink ${n0}
94
95# when non-super-user calls chown(2) successfully, set-uid and set-gid bits are
96# removed, except when both uid and gid are equal to -1.
97# 64
98expect 0 create ${n0} 0644
99expect 0 chown ${n0} 65534 65533
100expect 0 chmod ${n0} 06555
101expect 06555 lstat ${n0} mode
102expect 0 -u 65534 -g 65533,65532 chown ${n0} 65534 65532
103expect 0555,65534,65532 lstat ${n0} mode,uid,gid
104expect 0 chmod ${n0} 06555
105expect 06555 lstat ${n0} mode
106expect 0 -u 65534 -g 65533,65532 chown ${n0} -1 65533
107expect 0555,65534,65533 lstat ${n0} mode,uid,gid
108expect 0 chmod ${n0} 06555
109expect 06555 lstat ${n0} mode
110expect 0 -u 65534 -g 65533,65532 chown ${n0} -1 -1
111expect 06555,65534,65533 lstat ${n0} mode,uid,gid
112expect 0 unlink ${n0}
113# 79
114expect 0 mkdir ${n0} 0755
115expect 0 chown ${n0} 65534 65533
116expect 0 chmod ${n0} 06555
117expect 06555 lstat ${n0} mode
118expect 0 -u 65534 -g 65533,65532 chown ${n0} 65534 65532
119expect 0555,65534,65532 lstat ${n0} mode,uid,gid
120expect 0 chmod ${n0} 06555
121expect 06555 lstat ${n0} mode
122expect 0 -u 65534 -g 65533,65532 chown ${n0} -1 65533
123expect 0555,65534,65533 lstat ${n0} mode,uid,gid
124expect 0 chmod ${n0} 06555
125expect 06555 lstat ${n0} mode
126expect 0 -u 65534 -g 65533,65532 chown ${n0} -1 -1
127expect 06555,65534,65533 lstat ${n0} mode,uid,gid
128expect 0 rmdir ${n0}
129
130# successful chown(2) call (except uid and gid equal to -1) updates ctime.
131# 109
132expect 0 create ${n0} 0644
133ctime1=`${FSTEST} stat ${n0} ctime`
134sleep 1
135expect 0 chown ${n0} 65534 65533
136expect 65534,65533 lstat ${n0} uid,gid
137ctime2=`${FSTEST} stat ${n0} ctime`
138test_check $ctime1 -lt $ctime2
139expect 0 unlink ${n0}
140# 114
141expect 0 mkdir ${n0} 0755
142ctime1=`${FSTEST} stat ${n0} ctime`
143sleep 1
144expect 0 chown ${n0} 65534 65533
145expect 65534,65533 lstat ${n0} uid,gid
146ctime2=`${FSTEST} stat ${n0} ctime`
147test_check $ctime1 -lt $ctime2
148expect 0 rmdir ${n0}
149# 119
150expect 0 mkfifo ${n0} 0644
151ctime1=`${FSTEST} stat ${n0} ctime`
152sleep 1
153expect 0 chown ${n0} 65534 65533
154expect 65534,65533 lstat ${n0} uid,gid
155ctime2=`${FSTEST} stat ${n0} ctime`
156test_check $ctime1 -lt $ctime2
157expect 0 unlink ${n0}
158# 124
159expect 0 symlink ${n1} ${n0}
160ctime1=`${FSTEST} lstat ${n0} ctime`
161sleep 1
162expect 0 lchown ${n0} 65534 65533
163expect 65534,65533 lstat ${n0} uid,gid
164ctime2=`${FSTEST} lstat ${n0} ctime`
165test_check $ctime1 -lt $ctime2
166expect 0 unlink ${n0}
167# 129
168expect 0 create ${n0} 0644
169expect 0 chown ${n0} 65534 65533
170ctime1=`${FSTEST} stat ${n0} ctime`
171sleep 1
172expect 0 -u 65534 -g 65532 chown ${n0} 65534 65532
173expect 65534,65532 lstat ${n0} uid,gid
174ctime2=`${FSTEST} stat ${n0} ctime`
175test_check $ctime1 -lt $ctime2
176expect 0 unlink ${n0}
177# 135
178expect 0 mkdir ${n0} 0755
179expect 0 chown ${n0} 65534 65533
180ctime1=`${FSTEST} stat ${n0} ctime`
181sleep 1
182expect 0 -u 65534 -g 65532 chown ${n0} 65534 65532
183expect 65534,65532 lstat ${n0} uid,gid
184ctime2=`${FSTEST} stat ${n0} ctime`
185test_check $ctime1 -lt $ctime2
186expect 0 rmdir ${n0}
187# 141
188expect 0 mkfifo ${n0} 0644
189expect 0 chown ${n0} 65534 65533
190ctime1=`${FSTEST} stat ${n0} ctime`
191sleep 1
192expect 0 chown ${n0} 65534 65533
193expect 0 -u 65534 -g 65532 chown ${n0} 65534 65532
194expect 65534,65532 lstat ${n0} uid,gid
195ctime2=`${FSTEST} stat ${n0} ctime`
196test_check $ctime1 -lt $ctime2
197expect 0 unlink ${n0}
198# 148
199expect 0 symlink ${n1} ${n0}
200expect 0 lchown ${n0} 65534 65533
201ctime1=`${FSTEST} lstat ${n0} ctime`
202sleep 1
203expect 0 -u 65534 -g 65532 lchown ${n0} 65534 65532
204expect 65534,65532 lstat ${n0} uid,gid
205ctime2=`${FSTEST} lstat ${n0} ctime`
206test_check $ctime1 -lt $ctime2
207expect 0 unlink ${n0}
208# 154
209expect 0 create ${n0} 0644
210ctime1=`${FSTEST} stat ${n0} ctime`
211sleep 1
212expect 0 chown ${n0} -1 -1
213ctime2=`${FSTEST} stat ${n0} ctime`
214test_check $ctime1 -eq $ctime2
215expect 0 unlink ${n0}
216# 158
217expect 0 mkdir ${n0} 0644
218ctime1=`${FSTEST} stat ${n0} ctime`
219sleep 1
220expect 0 chown ${n0} -1 -1
221ctime2=`${FSTEST} stat ${n0} ctime`
222test_check $ctime1 -eq $ctime2
223expect 0 rmdir ${n0}
224# 162
225expect 0 mkfifo ${n0} 0644
226ctime1=`${FSTEST} stat ${n0} ctime`
227sleep 1
228expect 0 chown ${n0} -1 -1
229ctime2=`${FSTEST} stat ${n0} ctime`
230test_check $ctime1 -eq $ctime2
231expect 0 unlink ${n0}
232# 166
233expect 0 symlink ${n1} ${n0}
234ctime1=`${FSTEST} lstat ${n0} ctime`
235sleep 1
236expect 0 lchown ${n0} -1 -1
237ctime2=`${FSTEST} lstat ${n0} ctime`
238test_check $ctime1 -eq $ctime2
239expect 0 unlink ${n0}
240
241# unsuccessful chown(2) does not update ctime.
242# 170
243expect 0 create ${n0} 0644
244ctime1=`${FSTEST} stat ${n0} ctime`
245sleep 1
246expect EPERM -u 65534 chown ${n0} 65534 -1
247ctime2=`${FSTEST} stat ${n0} ctime`
248test_check $ctime1 -eq $ctime2
249expect 0 unlink ${n0}
250# 174
251expect 0 mkdir ${n0} 0755
252ctime1=`${FSTEST} stat ${n0} ctime`
253sleep 1
254expect EPERM -u 65534 -g 65534 chown ${n0} -1 65534
255ctime2=`${FSTEST} stat ${n0} ctime`
256test_check $ctime1 -eq $ctime2
257expect 0 rmdir ${n0}
258# 178
259expect 0 mkfifo ${n0} 0644
260ctime1=`${FSTEST} stat ${n0} ctime`
261sleep 1
262expect EPERM -u 65534 -g 65534 chown ${n0} 65534 65534
263ctime2=`${FSTEST} stat ${n0} ctime`
264test_check $ctime1 -eq $ctime2
265expect 0 unlink ${n0}
266# 182
267expect 0 symlink ${n1} ${n0}
268ctime1=`${FSTEST} lstat ${n0} ctime`
269sleep 1
270expect EPERM -u 65534 -g 65534 lchown ${n0} 65534 65534
271ctime2=`${FSTEST} lstat ${n0} ctime`
272test_check $ctime1 -eq $ctime2
273expect 0 unlink ${n0}
274
275# 186
276cd ${cdir}
277expect 0 rmdir ${n2}
278