1# $NetBSD: t_magic_symlinks.sh,v 1.4 2023/04/03 21:35:59 gutteridge 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# 30tmpdir="/tmp/test-magic-symlink" 31 32init() { 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 45clean() { 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 57check() { 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# 77atf_test_case domainname cleanup 78domainname_head() { 79 atf_set "require.user" "root" 80 atf_set "descr" "Check that @domainname magic symlinks work" 81} 82 83domainname_body() { 84 check "$(domainname)" "@domainname" 85} 86 87domainname_cleanup() { 88 clean 89} 90 91# @hostname 92# 93atf_test_case hostname cleanup 94hostname_head() { 95 atf_set "require.user" "root" 96 atf_set "descr" "Check that @hostname magic symlinks work" 97} 98 99hostname_body() { 100 check "$(hostname)" "@hostname" 101} 102 103hostname_cleanup() { 104 clean 105} 106 107# @machine 108# 109atf_test_case machine cleanup 110machine_head() { 111 atf_set "require.user" "root" 112 atf_set "descr" "Check that @machine magic symlinks work" 113} 114 115machine_body() { 116 check "$(uname -m)" "@machine" 117} 118 119machine_cleanup() { 120 clean 121} 122 123# @machine_arch 124# 125atf_test_case machine_arch cleanup 126machine_arch_head() { 127 atf_set "require.user" "root" 128 atf_set "descr" "Check that @machine_arch magic symlinks work" 129} 130 131machine_arch_body() { 132 check "$(uname -p)" "@machine_arch" 133} 134 135machine_arch_cleanup() { 136 clean 137} 138 139# @ostype 140# 141atf_test_case ostype cleanup 142ostype_head() { 143 atf_set "require.user" "root" 144 atf_set "descr" "Check that @ostype magic symlinks work" 145} 146 147ostype_body() { 148 check "$(uname -s)" "@ostype" 149} 150 151ostype_cleanup() { 152 clean 153} 154 155# @ruid 156# 157atf_test_case ruid cleanup 158ruid_head() { 159 atf_set "require.user" "root" 160 atf_set "descr" "Check that @ruid magic symlinks work" 161} 162 163ruid_body() { 164 check "$(id -ru)" "@ruid" 165} 166 167ruid_cleanup() { 168 clean 169} 170 171# @uid 172# 173atf_test_case uid cleanup 174uid_head() { 175 atf_set "require.user" "root" 176 atf_set "descr" "Check that @uid magic symlinks work" 177} 178 179uid_body() { 180 check "$(id -u)" "@uid" 181} 182 183uid_cleanup() { 184 clean 185} 186 187# @rgid 188# 189atf_test_case rgid cleanup 190rgid_head() { 191 atf_set "require.user" "root" 192 atf_set "descr" "Check that @rgid magic symlinks work" 193} 194 195rgid_body() { 196 check "$(id -rg)" "@rgid" 197} 198 199rgid_cleanup() { 200 clean 201} 202 203# @gid 204# 205atf_test_case gid cleanup 206gid_head() { 207 atf_set "require.user" "root" 208 atf_set "descr" "Check that @gid magic symlinks work" 209} 210 211gid_body() { 212 check "$(id -g)" "@gid" 213} 214 215gid_cleanup() { 216 clean 217} 218 219# realpath(1) 220# 221atf_test_case realpath cleanup 222realpath_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 228realpath_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 239realpath_cleanup() { 240 clean 241} 242 243atf_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