1#!/bin/sh
2# $FreeBSD$
3
4desc="chflags changes flags"
5
6dir=`dirname $0`
7. ${dir}/../misc.sh
8
9require chflags
10
11case "${os}:${fs}" in
12FreeBSD:UFS)
13	allflags="UF_NODUMP,UF_IMMUTABLE,UF_APPEND,UF_NOUNLINK,UF_OPAQUE,SF_ARCHIVED,SF_IMMUTABLE,SF_APPEND,SF_NOUNLINK"
14	userflags="UF_NODUMP,UF_IMMUTABLE,UF_APPEND,UF_NOUNLINK,UF_OPAQUE"
15	systemflags="SF_ARCHIVED,SF_IMMUTABLE,SF_APPEND,SF_NOUNLINK"
16
17	echo "1..742"
18	;;
19FreeBSD:ZFS)
20	allflags="UF_NODUMP,SF_IMMUTABLE,SF_APPEND,SF_NOUNLINK"
21	userflags="UF_NODUMP"
22	systemflags="SF_IMMUTABLE,SF_APPEND,SF_NOUNLINK"
23
24	echo "1..482"
25	;;
26*)
27	quick_exit
28	;;
29esac
30
31n0=`namegen`
32n1=`namegen`
33n2=`namegen`
34
35expect 0 mkdir ${n2} 0755
36cdir=`pwd`
37cd ${n2}
38
39for type in regular dir fifo block char socket; do
40	create_file ${type} ${n0}
41	expect none stat ${n0} flags
42	expect 0 chflags ${n0} ${allflags}
43	expect ${allflags} stat ${n0} flags
44	expect 0 chflags ${n0} ${userflags}
45	expect ${userflags} stat ${n0} flags
46	expect 0 chflags ${n0} ${systemflags}
47	expect ${systemflags} stat ${n0} flags
48	expect 0 chflags ${n0} none
49	expect none stat ${n0} flags
50	if [ "${type}" = "dir" ]; then
51		expect 0 rmdir ${n0}
52	else
53		expect 0 unlink ${n0}
54	fi
55
56	create_file ${type} ${n0}
57	expect none stat ${n0} flags
58	expect 0 lchflags ${n0} ${allflags}
59	expect ${allflags} stat ${n0} flags
60	expect 0 lchflags ${n0} ${userflags}
61	expect ${userflags} stat ${n0} flags
62	expect 0 lchflags ${n0} ${systemflags}
63	expect ${systemflags} stat ${n0} flags
64	expect 0 lchflags ${n0} none
65	expect none stat ${n0} flags
66	if [ "${type}" = "dir" ]; then
67		expect 0 rmdir ${n0}
68	else
69		expect 0 unlink ${n0}
70	fi
71done
72
73expect 0 create ${n0} 0644
74expect 0 symlink ${n0} ${n1}
75expect none stat ${n1} flags
76expect none lstat ${n1} flags
77expect 0 chflags ${n1} ${allflags}
78expect ${allflags} stat ${n1} flags
79expect none lstat ${n1} flags
80expect 0 chflags ${n1} ${userflags}
81expect ${userflags} stat ${n1} flags
82expect none lstat ${n1} flags
83expect 0 chflags ${n1} ${systemflags}
84expect ${systemflags} stat ${n1} flags
85expect none lstat ${n1} flags
86expect 0 chflags ${n1} none
87expect none stat ${n1} flags
88expect none lstat ${n1} flags
89expect 0 unlink ${n1}
90expect 0 unlink ${n0}
91
92expect 0 create ${n0} 0644
93expect 0 symlink ${n0} ${n1}
94expect none stat ${n1} flags
95expect none lstat ${n1} flags
96expect 0 lchflags ${n1} ${allflags}
97expect ${allflags} lstat ${n1} flags
98expect none stat ${n1} flags
99expect 0 lchflags ${n1} ${userflags}
100expect ${userflags} lstat ${n1} flags
101expect none stat ${n1} flags
102expect 0 lchflags ${n1} ${systemflags}
103expect ${systemflags} lstat ${n1} flags
104expect none stat ${n1} flags
105expect 0 lchflags ${n1} none
106expect none lstat ${n1} flags
107expect none stat ${n1} flags
108expect 0 unlink ${n1}
109expect 0 unlink ${n0}
110
111# successful chflags(2) updates ctime.
112for type in regular dir fifo block char socket symlink; do
113	if [ "${type}" != "symlink" ]; then
114		create_file ${type} ${n0}
115		for flag in `echo ${allflags},none | tr ',' ' '`; do
116			ctime1=`${fstest} stat ${n0} ctime`
117			sleep 1
118			expect 0 chflags ${n0} ${flag}
119			ctime2=`${fstest} stat ${n0} ctime`
120			test_check $ctime1 -lt $ctime2
121		done
122		if [ "${type}" = "dir" ]; then
123			expect 0 rmdir ${n0}
124		else
125			expect 0 unlink ${n0}
126		fi
127	fi
128
129	create_file ${type} ${n0}
130	for flag in `echo ${allflags},none | tr ',' ' '`; do
131		ctime1=`${fstest} lstat ${n0} ctime`
132		sleep 1
133		expect 0 lchflags ${n0} ${flag}
134		ctime2=`${fstest} lstat ${n0} ctime`
135		test_check $ctime1 -lt $ctime2
136	done
137	if [ "${type}" = "dir" ]; then
138		expect 0 rmdir ${n0}
139	else
140		expect 0 unlink ${n0}
141	fi
142done
143
144# unsuccessful chflags(2) does not update ctime.
145for type in regular dir fifo block char socket symlink; do
146	if [ "${type}" != "symlink" ]; then
147		create_file ${type} ${n0}
148		for flag in `echo ${allflags},none | tr ',' ' '`; do
149			ctime1=`${fstest} stat ${n0} ctime`
150			sleep 1
151			expect EPERM -u 65534 chflags ${n0} ${flag}
152			ctime2=`${fstest} stat ${n0} ctime`
153			test_check $ctime1 -eq $ctime2
154		done
155		if [ "${type}" = "dir" ]; then
156			expect 0 rmdir ${n0}
157		else
158			expect 0 unlink ${n0}
159		fi
160	fi
161
162	create_file ${type} ${n0}
163	for flag in `echo ${allflags},none | tr ',' ' '`; do
164		ctime1=`${fstest} lstat ${n0} ctime`
165		sleep 1
166		expect EPERM -u 65534 lchflags ${n0} ${flag}
167		ctime2=`${fstest} lstat ${n0} ctime`
168		test_check $ctime1 -eq $ctime2
169	done
170	if [ "${type}" = "dir" ]; then
171		expect 0 rmdir ${n0}
172	else
173		expect 0 unlink ${n0}
174	fi
175done
176
177cd ${cdir}
178expect 0 rmdir ${n2}
179