t_magic_symlinks.sh revision 1.2 1 # $NetBSD: t_magic_symlinks.sh,v 1.2 2021/12/09 06:38:23 rillig Exp $
2 #
3 # Copyright (c) 2020 The NetBSD Foundation, Inc.
4 # All rights reserved.
5 #
6 # This code is derived from software contributed to The NetBSD Foundation
7 # by Jukka Ruohonen.
8 #
9 # Redistribution and use in source and binary forms, with or without
10 # modification, are permitted provided that the following conditions
11 # are met:
12 # 1. Redistributions of source code must retain the above copyright
13 # notice, this list of conditions and the following disclaimer.
14 # 2. Redistributions in binary form must reproduce the above copyright
15 # notice, this list of conditions and the following disclaimer in the
16 # documentation and/or other materials provided with the distribution.
17 #
18 # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
19 # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
20 # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
21 # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
22 # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28 # POSSIBILITY OF SUCH DAMAGE.
29 #
30 tmpdir="/tmp/test-magic-symlink"
31
32 init() {
33
34 enabled=$(sysctl vfs.generic.magiclinks | awk '{print $3}')
35
36 if [ $enabled -eq 0 ]; then
37 sysctl -w vfs.generic.magiclinks=1 >/dev/null 2>&1
38 echo "Initialized vfs.generic.magiclinks=1"
39 fi
40
41 mkdir "$tmpdir"
42 echo "$enabled" > "$tmpdir/enabled"
43 }
44
45 clean() {
46
47 enabled=$(cat "$tmpdir/enabled")
48
49 if [ $enabled -eq 0 ]; then
50 sysctl -w vfs.generic.magiclinks=$enabled >/dev/null 2>&1
51 echo "Restored vfs.generic.magiclinks=$enabled"
52 fi
53
54 rm -rf $tmpdir
55 }
56
57 check() {
58
59 init
60 cd "$tmpdir"
61 mkdir "$1"
62 echo 1 > "$1/magic"
63 ln -s "$2" "link"
64 cd "link"
65
66 if [ -z $(pwd | grep "$1") ]; then
67 atf_fail "kernel does not handle magic symlinks properly"
68 fi
69
70 if [ ! $(cat "magic") -eq 1 ]; then
71 atf_fail "kernel does not handle magic symlinks properly"
72 fi
73 }
74
75 # @domainname
76 #
77 atf_test_case domainname cleanup
78 domainname_head() {
79 atf_set "require.user" "root"
80 atf_set "descr" "Check that @domainname magic symlinks work"
81 }
82
83 domainname_body() {
84 check "$(domainname)" "@domainname"
85 }
86
87 domainname_cleanup() {
88 clean
89 }
90
91 # @hostname
92 #
93 atf_test_case hostname cleanup
94 hostname_head() {
95 atf_set "require.user" "root"
96 atf_set "descr" "Check that @hostname magic symlinks work"
97 }
98
99 hostname_body() {
100 check "$(hostname)" "@hostname"
101 }
102
103 hostname_cleanup() {
104 clean
105 }
106
107 # @machine
108 #
109 atf_test_case machine cleanup
110 machine_head() {
111 atf_set "require.user" "root"
112 atf_set "descr" "Check that @machine magic symlinks work"
113 }
114
115 machine_body() {
116 check "$(uname -m)" "@machine"
117 }
118
119 machine_cleanup() {
120 clean
121 }
122
123 # @machine_arch
124 #
125 atf_test_case machine_arch cleanup
126 machine_arch_head() {
127 atf_set "require.user" "root"
128 atf_set "descr" "Check that @machine_arch magic symlinks work"
129 }
130
131 machine_arch_body() {
132 check "$(uname -p)" "@machine_arch"
133 }
134
135 machine_arch_cleanup() {
136 clean
137 }
138
139 # @ostype
140 #
141 atf_test_case ostype cleanup
142 ostype_head() {
143 atf_set "require.user" "root"
144 atf_set "descr" "Check that @ostype magic symlinks work"
145 }
146
147 ostype_body() {
148 check "$(uname -s)" "@ostype"
149 }
150
151 ostype_cleanup() {
152 clean
153 }
154
155 # @ruid
156 #
157 atf_test_case ruid cleanup
158 ruid_head() {
159 atf_set "require.user" "root"
160 atf_set "descr" "Check that @ruid magic symlinks work"
161 }
162
163 ruid_body() {
164 check "$(id -ru)" "@ruid"
165 }
166
167 ruid_cleanup() {
168 clean
169 }
170
171 # @uid
172 #
173 atf_test_case uid cleanup
174 uid_head() {
175 atf_set "require.user" "root"
176 atf_set "descr" "Check that @uid magic symlinks work"
177 }
178
179 uid_body() {
180 check "$(id -u)" "@uid"
181 }
182
183 uid_cleanup() {
184 clean
185 }
186
187 # @rgid
188 #
189 atf_test_case rgid cleanup
190 rgid_head() {
191 atf_set "require.user" "root"
192 atf_set "descr" "Check that @rgid magic symlinks work"
193 }
194
195 rgid_body() {
196 check "$(id -rg)" "@rgid"
197 }
198
199 rgid_cleanup() {
200 clean
201 }
202
203 # @gid
204 #
205 atf_test_case gid cleanup
206 gid_head() {
207 atf_set "require.user" "root"
208 atf_set "descr" "Check that @gid magic symlinks work"
209 }
210
211 gid_body() {
212 check "$(id -g)" "@gid"
213 }
214
215 gid_cleanup() {
216 clean
217 }
218
219 # realpath(1)
220 #
221 atf_test_case realpath cleanup
222 nointerpreter_head() {
223 atf_set "require.user" "root"
224 atf_set "descr" "Check that realpath(1) agrees with the "
225 "kernel on magic symlink(7)'s (PR lib/55361)"
226 }
227
228 realpath_body() {
229
230 check "$(uname -r)" "@osrelease"
231 realpath "$tmpdir/link"
232
233 if [ ! $? -eq 0 ]; then
234 atf_expect_fail "PR lib/55361"
235 atf_fail "realpath does not handle magic symlinks properly"
236 fi
237 }
238
239 realpath_cleanup() {
240 clean
241 }
242
243 atf_init_test_cases() {
244 atf_add_test_case domainname
245 atf_add_test_case hostname
246 atf_add_test_case machine
247 atf_add_test_case machine_arch
248 atf_add_test_case ostype
249 atf_add_test_case ruid
250 atf_add_test_case uid
251 atf_add_test_case rgid
252 atf_add_test_case gid
253 atf_add_test_case realpath
254 }
255