07.t revision 211156
1#!/bin/sh
2# $FreeBSD: head/tools/regression/fstest/tests/rename/07.t 211156 2010-08-10 22:57:43Z pjd $
3
4desc="rename returns EPERM if the parent directory of the file pointed at by the 'from' argument has its immutable or append-only flag set"
5
6dir=`dirname $0`
7. ${dir}/../misc.sh
8
9require chflags
10
11case "${os}:${fs}" in
12FreeBSD:ZFS)
13	flags1="SF_IMMUTABLE SF_APPEND"
14	flags2="SF_NOUNLINK"
15	echo "1..128"
16	;;
17FreeBSD:UFS)
18	flags1="SF_IMMUTABLE SF_APPEND UF_IMMUTABLE UF_APPEND"
19	flags2="SF_NOUNLINK UF_NOUNLINK"
20	echo "1..212"
21	;;
22*)
23	quick_exit
24esac
25
26n0=`namegen`
27n1=`namegen`
28n2=`namegen`
29
30expect 0 mkdir ${n0} 0755
31
32expect 0 create ${n0}/${n1} 0644
33for flag in ${flags1}; do
34	expect 0 chflags ${n0} ${flag}
35	expect ${flag} stat ${n0} flags
36	[ "${flag}" = "SF_APPEND" ] && todo FreeBSD:ZFS "Renaming a file protected by SF_APPEND should return EPERM."
37	expect EPERM rename ${n0}/${n1} ${n2}
38	[ "${flag}" = "SF_APPEND" ] && todo FreeBSD:ZFS "Renaming a file protected by SF_APPEND should return EPERM."
39	expect ENOENT rename ${n2} ${n0}/${n1}
40done
41expect 0 chflags ${n0} none
42expect 0 unlink ${n0}/${n1}
43
44expect 0 mkdir ${n0}/${n1} 0755
45for flag in ${flags1}; do
46	expect 0 chflags ${n0} ${flag}
47	expect ${flag} stat ${n0} flags
48	[ "${flag}" = "SF_APPEND" ] && todo FreeBSD:ZFS "Renaming a file protected by SF_APPEND should return EPERM."
49	expect EPERM rename ${n0}/${n1} ${n2}
50	[ "${flag}" = "SF_APPEND" ] && todo FreeBSD:ZFS "Renaming a file protected by SF_APPEND should return EPERM."
51	expect ENOENT rename ${n2} ${n0}/${n1}
52done
53expect 0 chflags ${n0} none
54expect 0 rmdir ${n0}/${n1}
55
56expect 0 mkfifo ${n0}/${n1} 0644
57for flag in ${flags1}; do
58	expect 0 chflags ${n0} ${flag}
59	expect ${flag} stat ${n0} flags
60	[ "${flag}" = "SF_APPEND" ] && todo FreeBSD:ZFS "Renaming a file protected by SF_APPEND should return EPERM."
61	expect EPERM rename ${n0}/${n1} ${n2}
62	[ "${flag}" = "SF_APPEND" ] && todo FreeBSD:ZFS "Renaming a file protected by SF_APPEND should return EPERM."
63	expect ENOENT rename ${n2} ${n0}/${n1}
64done
65expect 0 chflags ${n0} none
66expect 0 unlink ${n0}/${n1}
67
68expect 0 mknod ${n0}/${n1} b 0644 1 2
69for flag in ${flags1}; do
70	expect 0 chflags ${n0} ${flag}
71	expect ${flag} stat ${n0} flags
72	[ "${flag}" = "SF_APPEND" ] && todo FreeBSD:ZFS "Renaming a file protected by SF_APPEND should return EPERM."
73	expect EPERM rename ${n0}/${n1} ${n2}
74	[ "${flag}" = "SF_APPEND" ] && todo FreeBSD:ZFS "Renaming a file protected by SF_APPEND should return EPERM."
75	expect ENOENT rename ${n2} ${n0}/${n1}
76done
77expect 0 chflags ${n0} none
78expect 0 unlink ${n0}/${n1}
79
80expect 0 mknod ${n0}/${n1} c 0644 1 2
81for flag in ${flags1}; do
82	expect 0 chflags ${n0} ${flag}
83	expect ${flag} stat ${n0} flags
84	[ "${flag}" = "SF_APPEND" ] && todo FreeBSD:ZFS "Renaming a file protected by SF_APPEND should return EPERM."
85	expect EPERM rename ${n0}/${n1} ${n2}
86	[ "${flag}" = "SF_APPEND" ] && todo FreeBSD:ZFS "Renaming a file protected by SF_APPEND should return EPERM."
87	expect ENOENT rename ${n2} ${n0}/${n1}
88done
89expect 0 chflags ${n0} none
90expect 0 unlink ${n0}/${n1}
91
92expect 0 bind ${n0}/${n1}
93for flag in ${flags1}; do
94	expect 0 chflags ${n0} ${flag}
95	expect ${flag} stat ${n0} flags
96	[ "${flag}" = "SF_APPEND" ] && todo FreeBSD:ZFS "Renaming a file protected by SF_APPEND should return EPERM."
97	expect EPERM rename ${n0}/${n1} ${n2}
98	[ "${flag}" = "SF_APPEND" ] && todo FreeBSD:ZFS "Renaming a file protected by SF_APPEND should return EPERM."
99	expect ENOENT rename ${n2} ${n0}/${n1}
100done
101expect 0 chflags ${n0} none
102expect 0 unlink ${n0}/${n1}
103
104expect 0 symlink ${n2} ${n0}/${n1}
105for flag in ${flags1}; do
106	expect 0 chflags ${n0} ${flag}
107	expect ${flag} stat ${n0} flags
108	[ "${flag}" = "SF_APPEND" ] && todo FreeBSD:ZFS "Renaming a file protected by SF_APPEND should return EPERM."
109	expect EPERM rename ${n0}/${n1} ${n2}
110	[ "${flag}" = "SF_APPEND" ] && todo FreeBSD:ZFS "Renaming a file protected by SF_APPEND should return EPERM."
111	expect ENOENT rename ${n2} ${n0}/${n1}
112done
113expect 0 chflags ${n0} none
114expect 0 unlink ${n0}/${n1}
115
116expect 0 create ${n0}/${n1} 0644
117for flag in ${flags2}; do
118	expect 0 chflags ${n0} ${flag}
119	expect ${flag} stat ${n0} flags
120	expect 0 rename ${n0}/${n1} ${n2}
121	expect 0 rename ${n2} ${n0}/${n1}
122done
123expect 0 chflags ${n0} none
124expect 0 unlink ${n0}/${n1}
125
126expect 0 mkdir ${n0}/${n1} 0755
127for flag in ${flags2}; do
128	expect 0 chflags ${n0} ${flag}
129	expect ${flag} stat ${n0} flags
130	expect 0 rename ${n0}/${n1} ${n2}
131	expect 0 rename ${n2} ${n0}/${n1}
132done
133expect 0 chflags ${n0} none
134expect 0 rmdir ${n0}/${n1}
135
136expect 0 mkfifo ${n0}/${n1} 0644
137for flag in ${flags2}; do
138	expect 0 chflags ${n0} ${flag}
139	expect ${flag} stat ${n0} flags
140	expect 0 rename ${n0}/${n1} ${n2}
141	expect 0 rename ${n2} ${n0}/${n1}
142done
143expect 0 chflags ${n0} none
144expect 0 unlink ${n0}/${n1}
145
146expect 0 mknod ${n0}/${n1} b 0644 1 2
147for flag in ${flags2}; do
148	expect 0 chflags ${n0} ${flag}
149	expect ${flag} stat ${n0} flags
150	expect 0 rename ${n0}/${n1} ${n2}
151	expect 0 rename ${n2} ${n0}/${n1}
152done
153expect 0 chflags ${n0} none
154expect 0 unlink ${n0}/${n1}
155
156expect 0 mknod ${n0}/${n1} c 0644 1 2
157for flag in ${flags2}; do
158	expect 0 chflags ${n0} ${flag}
159	expect ${flag} stat ${n0} flags
160	expect 0 rename ${n0}/${n1} ${n2}
161	expect 0 rename ${n2} ${n0}/${n1}
162done
163expect 0 chflags ${n0} none
164expect 0 unlink ${n0}/${n1}
165
166expect 0 bind ${n0}/${n1}
167for flag in ${flags2}; do
168	expect 0 chflags ${n0} ${flag}
169	expect ${flag} stat ${n0} flags
170	expect 0 rename ${n0}/${n1} ${n2}
171	expect 0 rename ${n2} ${n0}/${n1}
172done
173expect 0 chflags ${n0} none
174expect 0 unlink ${n0}/${n1}
175
176expect 0 symlink ${n2} ${n0}/${n1}
177for flag in ${flags2}; do
178	expect 0 chflags ${n0} ${flag}
179	expect ${flag} stat ${n0} flags
180	expect 0 rename ${n0}/${n1} ${n2}
181	expect 0 rename ${n2} ${n0}/${n1}
182done
183expect 0 chflags ${n0} none
184expect 0 unlink ${n0}/${n1}
185
186expect 0 rmdir ${n0}
187