1*640235e2SEnji Cooper# $NetBSD: t_redircloexec.sh,v 1.3 2016/05/15 15:44:43 kre Exp $ 2*640235e2SEnji Cooper# 3*640235e2SEnji Cooper# Copyright (c) 2016 The NetBSD Foundation, Inc. 4*640235e2SEnji Cooper# All rights reserved. 5*640235e2SEnji Cooper# 6*640235e2SEnji Cooper# This code is derived from software contributed to The NetBSD Foundation 7*640235e2SEnji Cooper# by Christos Zoulas. 8*640235e2SEnji Cooper# 9*640235e2SEnji Cooper# Redistribution and use in source and binary forms, with or without 10*640235e2SEnji Cooper# modification, are permitted provided that the following conditions 11*640235e2SEnji Cooper# are met: 12*640235e2SEnji Cooper# 1. Redistributions of source code must retain the above copyright 13*640235e2SEnji Cooper# notice, this list of conditions and the following disclaimer. 14*640235e2SEnji Cooper# 2. Redistributions in binary form must reproduce the above copyright 15*640235e2SEnji Cooper# notice, this list of conditions and the following disclaimer in the 16*640235e2SEnji Cooper# documentation and/or other materials provided with the distribution. 17*640235e2SEnji Cooper# 18*640235e2SEnji Cooper# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 19*640235e2SEnji Cooper# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 20*640235e2SEnji Cooper# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 21*640235e2SEnji Cooper# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 22*640235e2SEnji Cooper# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23*640235e2SEnji Cooper# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24*640235e2SEnji Cooper# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25*640235e2SEnji Cooper# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26*640235e2SEnji Cooper# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27*640235e2SEnji Cooper# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28*640235e2SEnji Cooper# POSSIBILITY OF SUCH DAMAGE. 29*640235e2SEnji Cooper# 30*640235e2SEnji Cooper# the implementation of "sh" to test 31*640235e2SEnji Cooper: ${TEST_SH:="/bin/sh"} 32*640235e2SEnji Cooper 33*640235e2SEnji Coopermkhelper() { 34*640235e2SEnji Cooper name=$1 35*640235e2SEnji Cooper fd=$2 36*640235e2SEnji Cooper shift 2 37*640235e2SEnji Cooper 38*640235e2SEnji Cooper echo "$@" > ./"${name}1" 39*640235e2SEnji Cooper echo "echo ${name}2" ">&${fd}" > ./"${name}2" 40*640235e2SEnji Cooper} 41*640235e2SEnji Cooper 42*640235e2SEnji Cooperrunhelper() { 43*640235e2SEnji Cooper ${TEST_SH} "./${1}1" 44*640235e2SEnji Cooper} 45*640235e2SEnji Cooper 46*640235e2SEnji Coopercleanhelper() { 47*640235e2SEnji Cooper # not really needed, atf cleans up... 48*640235e2SEnji Cooper rm -f ./"${1}1" ./"${1}2" out 49*640235e2SEnji Cooper} 50*640235e2SEnji Cooper 51*640235e2SEnji Cooperatf_test_case exec_redir_closed 52*640235e2SEnji Cooperexec_redir_closed_head() { 53*640235e2SEnji Cooper atf_set "descr" "Tests that redirections created by exec are closed on exec" 54*640235e2SEnji Cooper} 55*640235e2SEnji Cooperexec_redir_closed_body() { 56*640235e2SEnji Cooper 57*640235e2SEnji Cooper mkhelper exec 6 \ 58*640235e2SEnji Cooper "exec 6> out; echo exec1 >&6; ${TEST_SH} exec2; exec 6>&-" 59*640235e2SEnji Cooper 60*640235e2SEnji Cooper atf_check -s exit:0 -o empty -e not-empty ${TEST_SH} ./exec1 61*640235e2SEnji Cooper atf_check -s not-exit:0 -o empty -e not-empty ${TEST_SH} -e ./exec1 62*640235e2SEnji Cooper 63*640235e2SEnji Cooper mkhelper exec 9 \ 64*640235e2SEnji Cooper "exec 9> out; echo exec1 >&9; ${TEST_SH} exec2" 65*640235e2SEnji Cooper 66*640235e2SEnji Cooper atf_check -s not-exit:0 -o empty -e not-empty ${TEST_SH} ./exec1 67*640235e2SEnji Cooper 68*640235e2SEnji Cooper mkhelper exec 8 \ 69*640235e2SEnji Cooper "exec 8> out; printf OK; echo exec1 >&8;" \ 70*640235e2SEnji Cooper "printf OK; ${TEST_SH} exec2; printf ERR" 71*640235e2SEnji Cooper 72*640235e2SEnji Cooper atf_check -s not-exit:0 -o match:OKOK -o not-match:ERR -e not-empty \ 73*640235e2SEnji Cooper ${TEST_SH} -e ./exec1 74*640235e2SEnji Cooper 75*640235e2SEnji Cooper mkhelper exec 7 \ 76*640235e2SEnji Cooper "exec 7> out; printf OK; echo exec1 >&7;" \ 77*640235e2SEnji Cooper "printf OK; ${TEST_SH} exec2 || printf ERR" 78*640235e2SEnji Cooper 79*640235e2SEnji Cooper atf_check -s exit:0 -o match:OKOKERR -e not-empty \ 80*640235e2SEnji Cooper ${TEST_SH} ./exec1 81*640235e2SEnji Cooper 82*640235e2SEnji Cooper cleanhelper exec 83*640235e2SEnji Cooper} 84*640235e2SEnji Cooper 85*640235e2SEnji Cooperatf_test_case exec_redir_open 86*640235e2SEnji Cooperexec_redir_open_head() { 87*640235e2SEnji Cooper atf_set "descr" "Tests that redirections created by exec can remain open" 88*640235e2SEnji Cooper} 89*640235e2SEnji Cooperexec_redir_open_body() { 90*640235e2SEnji Cooper 91*640235e2SEnji Cooper mkhelper exec 6 \ 92*640235e2SEnji Cooper "exec 6> out 6>&6; echo exec1 >&6; ${TEST_SH} exec2; exec 6>&-" 93*640235e2SEnji Cooper 94*640235e2SEnji Cooper atf_check -s exit:0 -o empty -e empty ${TEST_SH} ./exec1 95*640235e2SEnji Cooper atf_check -s exit:0 -o empty -e empty ${TEST_SH} -e ./exec1 96*640235e2SEnji Cooper 97*640235e2SEnji Cooper mkhelper exec 9 \ 98*640235e2SEnji Cooper "exec 9> out ; echo exec1 >&9; ${TEST_SH} exec2 9>&9" 99*640235e2SEnji Cooper 100*640235e2SEnji Cooper atf_check -s exit:0 -o empty -e empty ${TEST_SH} ./exec1 101*640235e2SEnji Cooper 102*640235e2SEnji Cooper mkhelper exec 8 \ 103*640235e2SEnji Cooper "exec 8> out; printf OK; exec 8>&8; echo exec1 >&8;" \ 104*640235e2SEnji Cooper "printf OK; ${TEST_SH} exec2; printf OK" 105*640235e2SEnji Cooper 106*640235e2SEnji Cooper atf_check -s exit:0 -o match:OKOKOK -e empty \ 107*640235e2SEnji Cooper ${TEST_SH} -e ./exec1 108*640235e2SEnji Cooper 109*640235e2SEnji Cooper mkhelper exec 7 \ 110*640235e2SEnji Cooper "exec 7> out; printf OK; echo exec1 >&7;" \ 111*640235e2SEnji Cooper "printf OK; ${TEST_SH} 7>&7 exec2; printf OK" 112*640235e2SEnji Cooper 113*640235e2SEnji Cooper atf_check -s exit:0 -o match:OKOKOK -e empty \ 114*640235e2SEnji Cooper ${TEST_SH} -e ./exec1 115*640235e2SEnji Cooper 116*640235e2SEnji Cooper cleanhelper exec 117*640235e2SEnji Cooper} 118*640235e2SEnji Cooper 119*640235e2SEnji Cooperatf_test_case loop_redir_open 120*640235e2SEnji Cooperloop_redir_open_head() { 121*640235e2SEnji Cooper atf_set "descr" "Tests that redirections in loops don't close on exec" 122*640235e2SEnji Cooper} 123*640235e2SEnji Cooperloop_redir_open_body() { 124*640235e2SEnji Cooper mkhelper for 3 "for x in x; do ${TEST_SH} ./for2; done 3>out" 125*640235e2SEnji Cooper atf_check -s exit:0 \ 126*640235e2SEnji Cooper -o empty \ 127*640235e2SEnji Cooper -e empty \ 128*640235e2SEnji Cooper ${TEST_SH} ./for1 129*640235e2SEnji Cooper cleanhelper for 130*640235e2SEnji Cooper} 131*640235e2SEnji Cooper 132*640235e2SEnji Cooperatf_test_case compound_redir_open 133*640235e2SEnji Coopercompound_redir_open_head() { 134*640235e2SEnji Cooper atf_set "descr" "Tests that redirections in compound statements don't close on exec" 135*640235e2SEnji Cooper} 136*640235e2SEnji Coopercompound_redir_open_body() { 137*640235e2SEnji Cooper mkhelper comp 3 "{ ${TEST_SH} ./comp2; } 3>out" 138*640235e2SEnji Cooper atf_check -s exit:0 \ 139*640235e2SEnji Cooper -o empty \ 140*640235e2SEnji Cooper -e empty \ 141*640235e2SEnji Cooper ${TEST_SH} ./comp1 142*640235e2SEnji Cooper cleanhelper comp 143*640235e2SEnji Cooper} 144*640235e2SEnji Cooper 145*640235e2SEnji Cooperatf_test_case simple_redir_open 146*640235e2SEnji Coopersimple_redir_open_head() { 147*640235e2SEnji Cooper atf_set "descr" "Tests that redirections in simple commands don't close on exec" 148*640235e2SEnji Cooper} 149*640235e2SEnji Coopersimple_redir_open_body() { 150*640235e2SEnji Cooper mkhelper simp 4 "${TEST_SH} ./simp2 4>out" 151*640235e2SEnji Cooper atf_check -s exit:0 \ 152*640235e2SEnji Cooper -o empty \ 153*640235e2SEnji Cooper -e empty \ 154*640235e2SEnji Cooper ${TEST_SH} ./simp1 155*640235e2SEnji Cooper cleanhelper simp 156*640235e2SEnji Cooper} 157*640235e2SEnji Cooper 158*640235e2SEnji Cooperatf_test_case subshell_redir_open 159*640235e2SEnji Coopersubshell_redir_open_head() { 160*640235e2SEnji Cooper atf_set "descr" "Tests that redirections on subshells don't close on exec" 161*640235e2SEnji Cooper} 162*640235e2SEnji Coopersubshell_redir_open_body() { 163*640235e2SEnji Cooper mkhelper comp 5 "( ${TEST_SH} ./comp2; ${TEST_SH} ./comp2 ) 5>out" 164*640235e2SEnji Cooper atf_check -s exit:0 \ 165*640235e2SEnji Cooper -o empty \ 166*640235e2SEnji Cooper -e empty \ 167*640235e2SEnji Cooper ${TEST_SH} ./comp1 168*640235e2SEnji Cooper cleanhelper comp 169*640235e2SEnji Cooper} 170*640235e2SEnji Cooper 171*640235e2SEnji Cooperatf_init_test_cases() { 172*640235e2SEnji Cooper atf_add_test_case exec_redir_closed 173*640235e2SEnji Cooper atf_add_test_case exec_redir_open 174*640235e2SEnji Cooper atf_add_test_case loop_redir_open 175*640235e2SEnji Cooper atf_add_test_case compound_redir_open 176*640235e2SEnji Cooper atf_add_test_case simple_redir_open 177*640235e2SEnji Cooper atf_add_test_case subshell_redir_open 178*640235e2SEnji Cooper} 179