xref: /freebsd-src/contrib/netbsd-tests/bin/sh/t_redircloexec.sh (revision c22165b4f1f5d38b681921797a44b3ba8c13b7e0)
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