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