1*c19afa1cSEnji Cooper# 2*c19afa1cSEnji Cooper# Copyright (c) 2017 Dell EMC 3*c19afa1cSEnji Cooper# All rights reserved. 4*c19afa1cSEnji Cooper# 5*c19afa1cSEnji Cooper# Redistribution and use in source and binary forms, with or without 6*c19afa1cSEnji Cooper# modification, are permitted provided that the following conditions 7*c19afa1cSEnji Cooper# are met: 8*c19afa1cSEnji Cooper# 1. Redistributions of source code must retain the above copyright 9*c19afa1cSEnji Cooper# notice, this list of conditions and the following disclaimer. 10*c19afa1cSEnji Cooper# 2. Redistributions in binary form must reproduce the above copyright 11*c19afa1cSEnji Cooper# notice, this list of conditions and the following disclaimer in the 12*c19afa1cSEnji Cooper# documentation and/or other materials provided with the distribution. 13*c19afa1cSEnji Cooper# 14*c19afa1cSEnji Cooper# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15*c19afa1cSEnji Cooper# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16*c19afa1cSEnji Cooper# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17*c19afa1cSEnji Cooper# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18*c19afa1cSEnji Cooper# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19*c19afa1cSEnji Cooper# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20*c19afa1cSEnji Cooper# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21*c19afa1cSEnji Cooper# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22*c19afa1cSEnji Cooper# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23*c19afa1cSEnji Cooper# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24*c19afa1cSEnji Cooper# SUCH DAMAGE. 25*c19afa1cSEnji Cooper# 26*c19afa1cSEnji Cooper# $FreeBSD$ 27*c19afa1cSEnji Cooper 28*c19afa1cSEnji Cooperatf_test_case RH_flag 29*c19afa1cSEnji CooperRH_flag_head() 30*c19afa1cSEnji Cooper{ 31*c19afa1cSEnji Cooper atf_set "descr" "Verify that setting ownership recursively via -R doesn't " \ 32*c19afa1cSEnji Cooper "affect symlinks specified via the arguments when -H " \ 33*c19afa1cSEnji Cooper "is specified" 34*c19afa1cSEnji Cooper atf_set "require.user" "root" 35*c19afa1cSEnji Cooper} 36*c19afa1cSEnji CooperRH_flag_body() 37*c19afa1cSEnji Cooper{ 38*c19afa1cSEnji Cooper atf_check mkdir -p A/B 39*c19afa1cSEnji Cooper atf_check ln -s B A/C 40*c19afa1cSEnji Cooper atf_check chown -h 42:42 A/C 41*c19afa1cSEnji Cooper atf_check -o inline:'0:0\n0:0\n42:42\n' stat -f '%u:%g' A A/B A/C 42*c19afa1cSEnji Cooper atf_check chown -RH 84:84 A 43*c19afa1cSEnji Cooper atf_check -o inline:'84:84\n84:84\n84:84\n' stat -f '%u:%g' A A/B A/C 44*c19afa1cSEnji Cooper atf_check chown -RH 126:126 A/C 45*c19afa1cSEnji Cooper atf_check -o inline:'84:84\n126:126\n84:84\n' stat -f '%u:%g' A A/B A/C 46*c19afa1cSEnji Cooper} 47*c19afa1cSEnji Cooper 48*c19afa1cSEnji Cooperatf_test_case RL_flag 49*c19afa1cSEnji CooperRL_flag_head() 50*c19afa1cSEnji Cooper{ 51*c19afa1cSEnji Cooper atf_set "descr" "Verify that setting ownership recursively via -R doesn't " \ 52*c19afa1cSEnji Cooper "affect symlinks specified via the arguments when -L " \ 53*c19afa1cSEnji Cooper "is specified" 54*c19afa1cSEnji Cooper atf_set "require.user" "root" 55*c19afa1cSEnji Cooper} 56*c19afa1cSEnji CooperRL_flag_body() 57*c19afa1cSEnji Cooper{ 58*c19afa1cSEnji Cooper atf_check mkdir -p A/B 59*c19afa1cSEnji Cooper atf_check ln -s B A/C 60*c19afa1cSEnji Cooper atf_check chown -h 42:42 A/C 61*c19afa1cSEnji Cooper atf_check -o inline:'0:0\n0:0\n42:42\n' stat -f '%u:%g' A A/B A/C 62*c19afa1cSEnji Cooper atf_check chown -RL 84:84 A 63*c19afa1cSEnji Cooper atf_check -o inline:'84:84\n84:84\n42:42\n' stat -f '%u:%g' A A/B A/C 64*c19afa1cSEnji Cooper atf_check chown -RL 126:126 A/C 65*c19afa1cSEnji Cooper atf_check -o inline:'84:84\n126:126\n42:42\n' stat -f '%u:%g' A A/B A/C 66*c19afa1cSEnji Cooper} 67*c19afa1cSEnji Cooper 68*c19afa1cSEnji Cooperatf_test_case RP_flag 69*c19afa1cSEnji CooperRP_flag_head() 70*c19afa1cSEnji Cooper{ 71*c19afa1cSEnji Cooper atf_set "descr" "Verify that setting ownership recursively via -R " \ 72*c19afa1cSEnji Cooper "doesn't affect symlinks specified via the arguments " \ 73*c19afa1cSEnji Cooper "when -P is specified" 74*c19afa1cSEnji Cooper atf_set "require.user" "root" 75*c19afa1cSEnji Cooper} 76*c19afa1cSEnji CooperRP_flag_body() 77*c19afa1cSEnji Cooper{ 78*c19afa1cSEnji Cooper atf_check mkdir -p A/B 79*c19afa1cSEnji Cooper atf_check ln -s B A/C 80*c19afa1cSEnji Cooper atf_check chown -h 42:42 A/C 81*c19afa1cSEnji Cooper atf_check -o inline:'0:0\n0:0\n42:42\n' stat -f '%u:%g' A A/B A/C 82*c19afa1cSEnji Cooper atf_check chown -RP 84:84 A 83*c19afa1cSEnji Cooper atf_check -o inline:'84:84\n84:84\n84:84\n' stat -f '%u:%g' A A/B A/C 84*c19afa1cSEnji Cooper atf_check chown -RP 126:126 A/C 85*c19afa1cSEnji Cooper atf_check -o inline:'84:84\n84:84\n126:126\n' stat -f '%u:%g' A A/B A/C 86*c19afa1cSEnji Cooper} 87*c19afa1cSEnji Cooper 88*c19afa1cSEnji Cooperatf_test_case f_flag cleanup 89*c19afa1cSEnji Cooperf_flag_head() 90*c19afa1cSEnji Cooper{ 91*c19afa1cSEnji Cooper atf_set "descr" "Verify that setting a mode for a file with -f " \ 92*c19afa1cSEnji Cooper "doesn't emit an error message/exit with a non-zero " \ 93*c19afa1cSEnji Cooper "code" 94*c19afa1cSEnji Cooper atf_set "require.user" "root" 95*c19afa1cSEnji Cooper} 96*c19afa1cSEnji Cooper 97*c19afa1cSEnji Cooperf_flag_body() 98*c19afa1cSEnji Cooper{ 99*c19afa1cSEnji Cooper atf_check truncate -s 0 foo bar 100*c19afa1cSEnji Cooper atf_check chown 0:0 foo bar 101*c19afa1cSEnji Cooper atf_check chflags uchg foo 102*c19afa1cSEnji Cooper atf_check -e not-empty -s not-exit:0 chown 42:42 foo bar 103*c19afa1cSEnji Cooper atf_check -o inline:'0:0\n42:42\n' stat -f '%u:%g' foo bar 104*c19afa1cSEnji Cooper atf_check -s exit:0 chown -f 84:84 foo bar 105*c19afa1cSEnji Cooper atf_check -o inline:'0:0\n84:84\n' stat -f '%u:%g' foo bar 106*c19afa1cSEnji Cooper} 107*c19afa1cSEnji Cooper 108*c19afa1cSEnji Cooperf_flag_cleanup() 109*c19afa1cSEnji Cooper{ 110*c19afa1cSEnji Cooper atf_check chflags 0 foo 111*c19afa1cSEnji Cooper} 112*c19afa1cSEnji Cooper 113*c19afa1cSEnji Cooperatf_test_case h_flag 114*c19afa1cSEnji Cooperh_flag_head() 115*c19afa1cSEnji Cooper{ 116*c19afa1cSEnji Cooper atf_set "descr" "Verify that setting a mode for a file with -f " \ 117*c19afa1cSEnji Cooper "doesn't emit an error message/exit with a non-zero " \ 118*c19afa1cSEnji Cooper "code" 119*c19afa1cSEnji Cooper atf_set "require.user" "root" 120*c19afa1cSEnji Cooper} 121*c19afa1cSEnji Cooper 122*c19afa1cSEnji Cooperh_flag_body() 123*c19afa1cSEnji Cooper{ 124*c19afa1cSEnji Cooper atf_check truncate -s 0 foo 125*c19afa1cSEnji Cooper atf_check -o inline:'0:0\n' stat -f '%u:%g' foo 126*c19afa1cSEnji Cooper atf_check ln -s foo bar 127*c19afa1cSEnji Cooper atf_check -o inline:'0:0\n0:0\n' stat -f '%u:%g' foo bar 128*c19afa1cSEnji Cooper atf_check chown -h 42:42 bar 129*c19afa1cSEnji Cooper atf_check -o inline:'0:0\n42:42\n' stat -f '%u:%g' foo bar 130*c19afa1cSEnji Cooper atf_check chown 84:84 bar 131*c19afa1cSEnji Cooper atf_check -o inline:'84:84\n42:42\n' stat -f '%u:%g' foo bar 132*c19afa1cSEnji Cooper} 133*c19afa1cSEnji Cooper 134*c19afa1cSEnji Cooperatf_test_case v_flag 135*c19afa1cSEnji Cooperv_flag_head() 136*c19afa1cSEnji Cooper{ 137*c19afa1cSEnji Cooper atf_set "descr" "Verify that setting ownership with -v emits the " \ 138*c19afa1cSEnji Cooper "file doesn't emit an error message/exit with a " \ 139*c19afa1cSEnji Cooper "non-zero code" 140*c19afa1cSEnji Cooper atf_set "require.user" "root" 141*c19afa1cSEnji Cooper} 142*c19afa1cSEnji Cooperv_flag_body() 143*c19afa1cSEnji Cooper{ 144*c19afa1cSEnji Cooper atf_check truncate -s 0 foo bar 145*c19afa1cSEnji Cooper atf_check chown 0:0 foo 146*c19afa1cSEnji Cooper atf_check chown 42:42 bar 147*c19afa1cSEnji Cooper atf_check -o 'inline:bar\n' chown -v 0:0 foo bar 148*c19afa1cSEnji Cooper atf_check chown -v 0:0 foo bar 149*c19afa1cSEnji Cooper for f in foo bar; do 150*c19afa1cSEnji Cooper echo "$f: 0:0 -> 84:84"; 151*c19afa1cSEnji Cooper done > output.txt 152*c19afa1cSEnji Cooper atf_check -o file:output.txt chown -vv 84:84 foo bar 153*c19afa1cSEnji Cooper atf_check chown -vv 84:84 foo bar 154*c19afa1cSEnji Cooper} 155*c19afa1cSEnji Cooper 156*c19afa1cSEnji Coopermd_file="md.out" 157*c19afa1cSEnji Cooperatf_test_case x_flag cleanup 158*c19afa1cSEnji Cooperx_flag_head() 159*c19afa1cSEnji Cooper{ 160*c19afa1cSEnji Cooper atf_set "descr" "Verify that setting a mode with -x doesn't set " \ 161*c19afa1cSEnji Cooper "ownership across mountpoints" 162*c19afa1cSEnji Cooper atf_set "require.user" "root" 163*c19afa1cSEnji Cooper} 164*c19afa1cSEnji Cooperx_flag_body() 165*c19afa1cSEnji Cooper{ 166*c19afa1cSEnji Cooper atf_check -o save:$md_file mdconfig -a -t malloc -s 20m 167*c19afa1cSEnji Cooper if ! md_device=$(cat $md_file); then 168*c19afa1cSEnji Cooper atf_fail "cat $md_file failed" 169*c19afa1cSEnji Cooper fi 170*c19afa1cSEnji Cooper atf_check -o not-empty newfs /dev/$md_device 171*c19afa1cSEnji Cooper atf_check mkdir mnt 172*c19afa1cSEnji Cooper atf_check mount /dev/$md_device mnt 173*c19afa1cSEnji Cooper atf_check truncate -s 0 foo bar mnt/bazbaz 174*c19afa1cSEnji Cooper atf_check ln -s bar mnt/barbaz 175*c19afa1cSEnji Cooper atf_check ln -s ../foo mnt/foobaz 176*c19afa1cSEnji Cooper cd mnt 177*c19afa1cSEnji Cooper test_files="../foo ../bar barbaz bazbaz foobaz" 178*c19afa1cSEnji Cooper atf_check -o inline:'0:0\n0:0\n0:0\n0:0\n0:0\n' \ 179*c19afa1cSEnji Cooper stat -f '%u:%g' $test_files 180*c19afa1cSEnji Cooper atf_check chown -Rx 42:42 . 181*c19afa1cSEnji Cooper atf_check -o inline:'0:0\n0:0\n42:42\n42:42\n42:42\n' \ 182*c19afa1cSEnji Cooper stat -f '%u:%g' $test_files 183*c19afa1cSEnji Cooper atf_check chown -R 84:84 . 184*c19afa1cSEnji Cooper atf_check -o inline:'0:0\n0:0\n84:84\n84:84\n84:84\n' \ 185*c19afa1cSEnji Cooper stat -f '%u:%g' $test_files 186*c19afa1cSEnji Cooper} 187*c19afa1cSEnji Cooperx_flag_cleanup() 188*c19afa1cSEnji Cooper{ 189*c19afa1cSEnji Cooper if ! md_device=$(cat $md_file) || [ -z "$md_device" ]; then 190*c19afa1cSEnji Cooper echo "Couldn't get device from $md_file" 191*c19afa1cSEnji Cooper exit 0 192*c19afa1cSEnji Cooper fi 193*c19afa1cSEnji Cooper umount mnt 194*c19afa1cSEnji Cooper mdconfig -d -u $md_device 195*c19afa1cSEnji Cooper} 196*c19afa1cSEnji Cooper 197*c19afa1cSEnji Cooperatf_init_test_cases() 198*c19afa1cSEnji Cooper{ 199*c19afa1cSEnji Cooper atf_add_test_case RH_flag 200*c19afa1cSEnji Cooper atf_add_test_case RL_flag 201*c19afa1cSEnji Cooper atf_add_test_case RP_flag 202*c19afa1cSEnji Cooper atf_add_test_case f_flag 203*c19afa1cSEnji Cooper atf_add_test_case h_flag 204*c19afa1cSEnji Cooper atf_add_test_case v_flag 205*c19afa1cSEnji Cooper atf_add_test_case x_flag 206*c19afa1cSEnji Cooper} 207