xref: /freebsd/lib/libc/tests/gen/wordexp_test.c (revision 559a218c9b257775fb249b67945fe4a05b7a6b9f)
1*fbf5b9f8SEnji Cooper /*-
2*fbf5b9f8SEnji Cooper  * Copyright (c) 2003 Tim J. Robbins
3*fbf5b9f8SEnji Cooper  * All rights reserved.
4*fbf5b9f8SEnji Cooper  *
5*fbf5b9f8SEnji Cooper  * Redistribution and use in source and binary forms, with or without
6*fbf5b9f8SEnji Cooper  * modification, are permitted provided that the following conditions
7*fbf5b9f8SEnji Cooper  * are met:
8*fbf5b9f8SEnji Cooper  * 1. Redistributions of source code must retain the above copyright
9*fbf5b9f8SEnji Cooper  *    notice, this list of conditions and the following disclaimer.
10*fbf5b9f8SEnji Cooper  * 2. Redistributions in binary form must reproduce the above copyright
11*fbf5b9f8SEnji Cooper  *    notice, this list of conditions and the following disclaimer in the
12*fbf5b9f8SEnji Cooper  *    documentation and/or other materials provided with the distribution.
13*fbf5b9f8SEnji Cooper  *
14*fbf5b9f8SEnji Cooper  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15*fbf5b9f8SEnji Cooper  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16*fbf5b9f8SEnji Cooper  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17*fbf5b9f8SEnji Cooper  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18*fbf5b9f8SEnji Cooper  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19*fbf5b9f8SEnji Cooper  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20*fbf5b9f8SEnji Cooper  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21*fbf5b9f8SEnji Cooper  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22*fbf5b9f8SEnji Cooper  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23*fbf5b9f8SEnji Cooper  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24*fbf5b9f8SEnji Cooper  * SUCH DAMAGE.
25*fbf5b9f8SEnji Cooper  */
26*fbf5b9f8SEnji Cooper 
27*fbf5b9f8SEnji Cooper /*
28*fbf5b9f8SEnji Cooper  * Test program for wordexp() and wordfree() as specified by
29*fbf5b9f8SEnji Cooper  * IEEE Std. 1003.1-2001.
30*fbf5b9f8SEnji Cooper  */
31*fbf5b9f8SEnji Cooper 
32*fbf5b9f8SEnji Cooper #include <sys/wait.h>
33*fbf5b9f8SEnji Cooper #include <errno.h>
34*fbf5b9f8SEnji Cooper #include <signal.h>
35*fbf5b9f8SEnji Cooper #include <stdio.h>
36*fbf5b9f8SEnji Cooper #include <stdlib.h>
37*fbf5b9f8SEnji Cooper #include <string.h>
38*fbf5b9f8SEnji Cooper #include <wordexp.h>
39*fbf5b9f8SEnji Cooper 
40*fbf5b9f8SEnji Cooper #include <atf-c.h>
41*fbf5b9f8SEnji Cooper 
42*fbf5b9f8SEnji Cooper static void
chld_handler(int x)43*fbf5b9f8SEnji Cooper chld_handler(int x)
44*fbf5b9f8SEnji Cooper {
45*fbf5b9f8SEnji Cooper 	int status, serrno;
46*fbf5b9f8SEnji Cooper 
47*fbf5b9f8SEnji Cooper 	(void)x;
48*fbf5b9f8SEnji Cooper 	serrno = errno;
49*fbf5b9f8SEnji Cooper 	while (waitpid(-1, &status, WNOHANG) > 0)
50*fbf5b9f8SEnji Cooper 		;
51*fbf5b9f8SEnji Cooper 	errno = serrno;
52*fbf5b9f8SEnji Cooper }
53*fbf5b9f8SEnji Cooper 
54*fbf5b9f8SEnji Cooper ATF_TC_WITHOUT_HEAD(simple_test);
ATF_TC_BODY(simple_test,tc)55*fbf5b9f8SEnji Cooper ATF_TC_BODY(simple_test, tc)
56*fbf5b9f8SEnji Cooper {
57*fbf5b9f8SEnji Cooper 	wordexp_t we;
58*fbf5b9f8SEnji Cooper 	int r;
59*fbf5b9f8SEnji Cooper 
60*fbf5b9f8SEnji Cooper 	/* Test that the macros are there. */
61*fbf5b9f8SEnji Cooper 	(void)(WRDE_APPEND + WRDE_DOOFFS + WRDE_NOCMD + WRDE_REUSE +
62*fbf5b9f8SEnji Cooper 	    WRDE_SHOWERR + WRDE_UNDEF);
63*fbf5b9f8SEnji Cooper 	(void)(WRDE_BADCHAR + WRDE_BADVAL + WRDE_CMDSUB + WRDE_NOSPACE +
64*fbf5b9f8SEnji Cooper 	    WRDE_SYNTAX);
65*fbf5b9f8SEnji Cooper 
66*fbf5b9f8SEnji Cooper 	/* Simple test. */
67*fbf5b9f8SEnji Cooper 	r = wordexp("hello world", &we, 0);
68*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(r == 0);
69*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(we.we_wordc == 2);
70*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(strcmp(we.we_wordv[0], "hello") == 0);
71*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(strcmp(we.we_wordv[1], "world") == 0);
72*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(we.we_wordv[2] == NULL);
73*fbf5b9f8SEnji Cooper 	wordfree(&we);
74*fbf5b9f8SEnji Cooper }
75*fbf5b9f8SEnji Cooper 
76*fbf5b9f8SEnji Cooper ATF_TC_WITHOUT_HEAD(long_output_test);
ATF_TC_BODY(long_output_test,tc)77*fbf5b9f8SEnji Cooper ATF_TC_BODY(long_output_test, tc)
78*fbf5b9f8SEnji Cooper {
79*fbf5b9f8SEnji Cooper 	char longdata[6 * 10000 + 1];
80*fbf5b9f8SEnji Cooper 	wordexp_t we;
81*fbf5b9f8SEnji Cooper 	int i, r;
82*fbf5b9f8SEnji Cooper 
83*fbf5b9f8SEnji Cooper 	/* Long output. */
84*fbf5b9f8SEnji Cooper 	for (i = 0; i < 10000; i++)
85*fbf5b9f8SEnji Cooper 		snprintf(longdata + 6 * i, 7, "%05d ", i);
86*fbf5b9f8SEnji Cooper 	r = wordexp(longdata, &we, 0);
87*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(r == 0);
88*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(we.we_wordc == 10000);
89*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(we.we_wordv[10000] == NULL);
90*fbf5b9f8SEnji Cooper 	wordfree(&we);
91*fbf5b9f8SEnji Cooper }
92*fbf5b9f8SEnji Cooper 
93*fbf5b9f8SEnji Cooper ATF_TC_WITHOUT_HEAD(WRDE_DOOFFS_test);
ATF_TC_BODY(WRDE_DOOFFS_test,tc)94*fbf5b9f8SEnji Cooper ATF_TC_BODY(WRDE_DOOFFS_test, tc)
95*fbf5b9f8SEnji Cooper {
96*fbf5b9f8SEnji Cooper 	wordexp_t we;
97*fbf5b9f8SEnji Cooper 	int r;
98*fbf5b9f8SEnji Cooper 
99*fbf5b9f8SEnji Cooper 	we.we_offs = 3;
100*fbf5b9f8SEnji Cooper 	r = wordexp("hello world", &we, WRDE_DOOFFS);
101*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(r == 0);
102*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(we.we_wordc == 2);
103*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(we.we_wordv[0] == NULL);
104*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(we.we_wordv[1] == NULL);
105*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(we.we_wordv[2] == NULL);
106*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(strcmp(we.we_wordv[3], "hello") == 0);
107*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(strcmp(we.we_wordv[4], "world") == 0);
108*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(we.we_wordv[5] == NULL);
109*fbf5b9f8SEnji Cooper 	wordfree(&we);
110*fbf5b9f8SEnji Cooper }
111*fbf5b9f8SEnji Cooper 
112*fbf5b9f8SEnji Cooper ATF_TC_WITHOUT_HEAD(WRDE_REUSE_test);
ATF_TC_BODY(WRDE_REUSE_test,tc)113*fbf5b9f8SEnji Cooper ATF_TC_BODY(WRDE_REUSE_test, tc)
114*fbf5b9f8SEnji Cooper {
115*fbf5b9f8SEnji Cooper 	wordexp_t we;
116*fbf5b9f8SEnji Cooper 	int r;
117*fbf5b9f8SEnji Cooper 
118*fbf5b9f8SEnji Cooper 	r = wordexp("hello world", &we, 0);
119*fbf5b9f8SEnji Cooper 	r = wordexp("hello world", &we, WRDE_REUSE);
120*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(r == 0);
121*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(we.we_wordc == 2);
122*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(strcmp(we.we_wordv[0], "hello") == 0);
123*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(strcmp(we.we_wordv[1], "world") == 0);
124*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(we.we_wordv[2] == NULL);
125*fbf5b9f8SEnji Cooper 	wordfree(&we);
126*fbf5b9f8SEnji Cooper }
127*fbf5b9f8SEnji Cooper 
128*fbf5b9f8SEnji Cooper ATF_TC_WITHOUT_HEAD(WRDE_APPEND_test);
ATF_TC_BODY(WRDE_APPEND_test,tc)129*fbf5b9f8SEnji Cooper ATF_TC_BODY(WRDE_APPEND_test, tc)
130*fbf5b9f8SEnji Cooper {
131*fbf5b9f8SEnji Cooper 	wordexp_t we;
132*fbf5b9f8SEnji Cooper 	int r;
133*fbf5b9f8SEnji Cooper 
134*fbf5b9f8SEnji Cooper 	r = wordexp("this is", &we, 0);
135*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(r == 0);
136*fbf5b9f8SEnji Cooper 	r = wordexp("a test", &we, WRDE_APPEND);
137*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(r == 0);
138*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(we.we_wordc == 4);
139*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(strcmp(we.we_wordv[0], "this") == 0);
140*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(strcmp(we.we_wordv[1], "is") == 0);
141*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(strcmp(we.we_wordv[2], "a") == 0);
142*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(strcmp(we.we_wordv[3], "test") == 0);
143*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(we.we_wordv[4] == NULL);
144*fbf5b9f8SEnji Cooper 	wordfree(&we);
145*fbf5b9f8SEnji Cooper }
146*fbf5b9f8SEnji Cooper 
147*fbf5b9f8SEnji Cooper ATF_TC_WITHOUT_HEAD(WRDE_DOOFFS__WRDE_APPEND_test);
ATF_TC_BODY(WRDE_DOOFFS__WRDE_APPEND_test,tc)148*fbf5b9f8SEnji Cooper ATF_TC_BODY(WRDE_DOOFFS__WRDE_APPEND_test, tc)
149*fbf5b9f8SEnji Cooper {
150*fbf5b9f8SEnji Cooper 	wordexp_t we;
151*fbf5b9f8SEnji Cooper 	int r;
152*fbf5b9f8SEnji Cooper 
153*fbf5b9f8SEnji Cooper 	we.we_offs = 2;
154*fbf5b9f8SEnji Cooper 	r = wordexp("this is", &we, WRDE_DOOFFS);
155*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(r == 0);
156*fbf5b9f8SEnji Cooper 	r = wordexp("a test", &we, WRDE_APPEND|WRDE_DOOFFS);
157*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(r == 0);
158*fbf5b9f8SEnji Cooper 	r = wordexp("of wordexp", &we, WRDE_APPEND|WRDE_DOOFFS);
159*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(r == 0);
160*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(we.we_wordc == 6);
161*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(we.we_wordv[0] == NULL);
162*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(we.we_wordv[1] == NULL);
163*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(strcmp(we.we_wordv[2], "this") == 0);
164*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(strcmp(we.we_wordv[3], "is") == 0);
165*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(strcmp(we.we_wordv[4], "a") == 0);
166*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(strcmp(we.we_wordv[5], "test") == 0);
167*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(strcmp(we.we_wordv[6], "of") == 0);
168*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(strcmp(we.we_wordv[7], "wordexp") == 0);
169*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(we.we_wordv[8] == NULL);
170*fbf5b9f8SEnji Cooper 	wordfree(&we);
171*fbf5b9f8SEnji Cooper }
172*fbf5b9f8SEnji Cooper 
173*fbf5b9f8SEnji Cooper ATF_TC_WITHOUT_HEAD(WRDE_UNDEF_test);
ATF_TC_BODY(WRDE_UNDEF_test,tc)174*fbf5b9f8SEnji Cooper ATF_TC_BODY(WRDE_UNDEF_test, tc)
175*fbf5b9f8SEnji Cooper {
176*fbf5b9f8SEnji Cooper 	wordexp_t we;
177*fbf5b9f8SEnji Cooper 	int r;
178*fbf5b9f8SEnji Cooper 
179*fbf5b9f8SEnji Cooper 	r = wordexp("${dont_set_me}", &we, WRDE_UNDEF);
180*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(r == WRDE_BADVAL);
181*fbf5b9f8SEnji Cooper }
182*fbf5b9f8SEnji Cooper 
183*fbf5b9f8SEnji Cooper ATF_TC_WITHOUT_HEAD(WRDE_NOCMD_test);
ATF_TC_BODY(WRDE_NOCMD_test,tc)184*fbf5b9f8SEnji Cooper ATF_TC_BODY(WRDE_NOCMD_test, tc)
185*fbf5b9f8SEnji Cooper {
186*fbf5b9f8SEnji Cooper 	wordexp_t we;
187*fbf5b9f8SEnji Cooper 	int r;
188*fbf5b9f8SEnji Cooper 
189*fbf5b9f8SEnji Cooper 	r = wordexp("`date`", &we, WRDE_NOCMD);
190*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(r == WRDE_CMDSUB);
191*fbf5b9f8SEnji Cooper 	r = wordexp("\"`date`\"", &we, WRDE_NOCMD);
192*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(r == WRDE_CMDSUB);
193*fbf5b9f8SEnji Cooper 	r = wordexp("$(date)", &we, WRDE_NOCMD);
194*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(r == WRDE_CMDSUB);
195*fbf5b9f8SEnji Cooper 	r = wordexp("\"$(date)\"", &we, WRDE_NOCMD);
196*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(r == WRDE_CMDSUB);
197*fbf5b9f8SEnji Cooper 	r = wordexp("$((3+5))", &we, WRDE_NOCMD);
198*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(r == 0);
199*fbf5b9f8SEnji Cooper 	r = wordexp("\\$\\(date\\)", &we, WRDE_NOCMD|WRDE_REUSE);
200*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(r == 0);
201*fbf5b9f8SEnji Cooper 	r = wordexp("'`date`'", &we, WRDE_NOCMD|WRDE_REUSE);
202*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(r == 0);
203*fbf5b9f8SEnji Cooper 	r = wordexp("'$(date)'", &we, WRDE_NOCMD|WRDE_REUSE);
204*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(r == 0);
205*fbf5b9f8SEnji Cooper 	wordfree(&we);
206*fbf5b9f8SEnji Cooper }
207*fbf5b9f8SEnji Cooper 
208*fbf5b9f8SEnji Cooper ATF_TC_WITHOUT_HEAD(WRDE_BADCHAR_test);
ATF_TC_BODY(WRDE_BADCHAR_test,tc)209*fbf5b9f8SEnji Cooper ATF_TC_BODY(WRDE_BADCHAR_test, tc)
210*fbf5b9f8SEnji Cooper {
211*fbf5b9f8SEnji Cooper 	wordexp_t we;
212*fbf5b9f8SEnji Cooper 	int r;
213*fbf5b9f8SEnji Cooper 
214*fbf5b9f8SEnji Cooper 	r = wordexp("'\n|&;<>(){}'", &we, 0);
215*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(r == 0);
216*fbf5b9f8SEnji Cooper 	r = wordexp("\"\n|&;<>(){}\"", &we, WRDE_REUSE);
217*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(r == 0);
218*fbf5b9f8SEnji Cooper 	r = wordexp("\\\n\\|\\&\\;\\<\\>\\(\\)\\{\\}", &we, WRDE_REUSE);
219*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(r == 0);
220*fbf5b9f8SEnji Cooper 	wordfree(&we);
221*fbf5b9f8SEnji Cooper 	r = wordexp("test \n test", &we, 0);
222*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(r == WRDE_BADCHAR);
223*fbf5b9f8SEnji Cooper 	r = wordexp("test | test", &we, 0);
224*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(r == WRDE_BADCHAR);
225*fbf5b9f8SEnji Cooper 	r = wordexp("test & test", &we, 0);
226*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(r == WRDE_BADCHAR);
227*fbf5b9f8SEnji Cooper 	r = wordexp("test ; test", &we, 0);
228*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(r == WRDE_BADCHAR);
229*fbf5b9f8SEnji Cooper 	r = wordexp("test > test", &we, 0);
230*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(r == WRDE_BADCHAR);
231*fbf5b9f8SEnji Cooper 	r = wordexp("test < test", &we, 0);
232*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(r == WRDE_BADCHAR);
233*fbf5b9f8SEnji Cooper 	r = wordexp("test ( test", &we, 0);
234*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(r == WRDE_BADCHAR);
235*fbf5b9f8SEnji Cooper 	r = wordexp("test ) test", &we, 0);
236*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(r == WRDE_BADCHAR);
237*fbf5b9f8SEnji Cooper 	r = wordexp("test { test", &we, 0);
238*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(r == WRDE_BADCHAR);
239*fbf5b9f8SEnji Cooper 	r = wordexp("test } test", &we, 0);
240*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(r == WRDE_BADCHAR);
241*fbf5b9f8SEnji Cooper }
242*fbf5b9f8SEnji Cooper 
243*fbf5b9f8SEnji Cooper ATF_TC_WITHOUT_HEAD(WRDE_SYNTAX_test);
ATF_TC_BODY(WRDE_SYNTAX_test,tc)244*fbf5b9f8SEnji Cooper ATF_TC_BODY(WRDE_SYNTAX_test, tc)
245*fbf5b9f8SEnji Cooper {
246*fbf5b9f8SEnji Cooper 	wordexp_t we;
247*fbf5b9f8SEnji Cooper 	int r;
248*fbf5b9f8SEnji Cooper 
249*fbf5b9f8SEnji Cooper 	r = wordexp("'", &we, 0);
250*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(r == WRDE_SYNTAX);
251*fbf5b9f8SEnji Cooper 	r = wordexp("'", &we, WRDE_UNDEF);
252*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(r == WRDE_SYNTAX);
253*fbf5b9f8SEnji Cooper 	r = wordexp("'\\'", &we, 0);
254*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(r == 0);
255*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(we.we_wordc == 1);
256*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(strcmp(we.we_wordv[0], "\\") == 0);
257*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(we.we_wordv[1] == NULL);
258*fbf5b9f8SEnji Cooper 	wordfree(&we);
259*fbf5b9f8SEnji Cooper 	/* Two syntax errors that are not detected by the current we_check(). */
260*fbf5b9f8SEnji Cooper 	r = wordexp("${IFS:+'}", &we, 0);
261*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(r == WRDE_SYNTAX);
262*fbf5b9f8SEnji Cooper 	r = wordexp("${IFS:+'}", &we, WRDE_UNDEF);
263*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(r == WRDE_SYNTAX);
264*fbf5b9f8SEnji Cooper 	r = wordexp("$(case)", &we, 0);
265*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(r == WRDE_SYNTAX);
266*fbf5b9f8SEnji Cooper 	r = wordexp("$(case)", &we, WRDE_UNDEF);
267*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(r == WRDE_SYNTAX);
268*fbf5b9f8SEnji Cooper }
269*fbf5b9f8SEnji Cooper 
270*fbf5b9f8SEnji Cooper ATF_TC_WITHOUT_HEAD(with_SIGCHILD_handler_test);
ATF_TC_BODY(with_SIGCHILD_handler_test,tc)271*fbf5b9f8SEnji Cooper ATF_TC_BODY(with_SIGCHILD_handler_test, tc)
272*fbf5b9f8SEnji Cooper {
273*fbf5b9f8SEnji Cooper 	struct sigaction sa;
274*fbf5b9f8SEnji Cooper 	wordexp_t we;
275*fbf5b9f8SEnji Cooper 	int r;
276*fbf5b9f8SEnji Cooper 
277*fbf5b9f8SEnji Cooper 	/* With a SIGCHLD handler that reaps all zombies. */
278*fbf5b9f8SEnji Cooper 	sa.sa_flags = 0;
279*fbf5b9f8SEnji Cooper 	sigemptyset(&sa.sa_mask);
280*fbf5b9f8SEnji Cooper 	sa.sa_handler = chld_handler;
281*fbf5b9f8SEnji Cooper 	r = sigaction(SIGCHLD, &sa, NULL);
282*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(r == 0);
283*fbf5b9f8SEnji Cooper 	r = wordexp("hello world", &we, 0);
284*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(r == 0);
285*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(we.we_wordc == 2);
286*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(strcmp(we.we_wordv[0], "hello") == 0);
287*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(strcmp(we.we_wordv[1], "world") == 0);
288*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(we.we_wordv[2] == NULL);
289*fbf5b9f8SEnji Cooper 	wordfree(&we);
290*fbf5b9f8SEnji Cooper 	sa.sa_handler = SIG_DFL;
291*fbf5b9f8SEnji Cooper 	r = sigaction(SIGCHLD, &sa, NULL);
292*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(r == 0);
293*fbf5b9f8SEnji Cooper }
294*fbf5b9f8SEnji Cooper 
295*fbf5b9f8SEnji Cooper ATF_TC_WITHOUT_HEAD(with_unused_non_default_IFS_test);
ATF_TC_BODY(with_unused_non_default_IFS_test,tc)296*fbf5b9f8SEnji Cooper ATF_TC_BODY(with_unused_non_default_IFS_test, tc)
297*fbf5b9f8SEnji Cooper {
298*fbf5b9f8SEnji Cooper 	wordexp_t we;
299*fbf5b9f8SEnji Cooper 	int r;
300*fbf5b9f8SEnji Cooper 
301*fbf5b9f8SEnji Cooper 	/*
302*fbf5b9f8SEnji Cooper 	 * With IFS set to a non-default value (without depending on whether
303*fbf5b9f8SEnji Cooper 	 * IFS is inherited or not).
304*fbf5b9f8SEnji Cooper 	 */
305*fbf5b9f8SEnji Cooper 	r = setenv("IFS", ":", 1);
306*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(r == 0);
307*fbf5b9f8SEnji Cooper 	r = wordexp("hello world", &we, 0);
308*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(r == 0);
309*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(we.we_wordc == 2);
310*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(strcmp(we.we_wordv[0], "hello") == 0);
311*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(strcmp(we.we_wordv[1], "world") == 0);
312*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(we.we_wordv[2] == NULL);
313*fbf5b9f8SEnji Cooper 	wordfree(&we);
314*fbf5b9f8SEnji Cooper 	r = unsetenv("IFS");
315*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(r == 0);
316*fbf5b9f8SEnji Cooper }
317*fbf5b9f8SEnji Cooper 
318*fbf5b9f8SEnji Cooper ATF_TC_WITHOUT_HEAD(with_used_non_default_IFS_test);
ATF_TC_BODY(with_used_non_default_IFS_test,tc)319*fbf5b9f8SEnji Cooper ATF_TC_BODY(with_used_non_default_IFS_test, tc)
320*fbf5b9f8SEnji Cooper {
321*fbf5b9f8SEnji Cooper 	wordexp_t we;
322*fbf5b9f8SEnji Cooper 	int r;
323*fbf5b9f8SEnji Cooper 
324*fbf5b9f8SEnji Cooper 	/*
325*fbf5b9f8SEnji Cooper 	 * With IFS set to a non-default value, and using it.
326*fbf5b9f8SEnji Cooper 	 */
327*fbf5b9f8SEnji Cooper 	r = setenv("IFS", ":", 1);
328*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(r == 0);
329*fbf5b9f8SEnji Cooper 	r = wordexp("${IFS+hello:world}", &we, 0);
330*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(r == 0);
331*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(we.we_wordc == 2);
332*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(strcmp(we.we_wordv[0], "hello") == 0);
333*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(strcmp(we.we_wordv[1], "world") == 0);
334*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(we.we_wordv[2] == NULL);
335*fbf5b9f8SEnji Cooper 	wordfree(&we);
336*fbf5b9f8SEnji Cooper 	r = unsetenv("IFS");
337*fbf5b9f8SEnji Cooper 	ATF_REQUIRE(r == 0);
338*fbf5b9f8SEnji Cooper }
339*fbf5b9f8SEnji Cooper 
ATF_TP_ADD_TCS(tp)340*fbf5b9f8SEnji Cooper ATF_TP_ADD_TCS(tp)
341*fbf5b9f8SEnji Cooper {
342*fbf5b9f8SEnji Cooper 	ATF_TP_ADD_TC(tp, simple_test);
343*fbf5b9f8SEnji Cooper 	ATF_TP_ADD_TC(tp, long_output_test);
344*fbf5b9f8SEnji Cooper 	ATF_TP_ADD_TC(tp, WRDE_DOOFFS_test);
345*fbf5b9f8SEnji Cooper 	ATF_TP_ADD_TC(tp, WRDE_REUSE_test);
346*fbf5b9f8SEnji Cooper 	ATF_TP_ADD_TC(tp, WRDE_APPEND_test);
347*fbf5b9f8SEnji Cooper 	ATF_TP_ADD_TC(tp, WRDE_DOOFFS__WRDE_APPEND_test);
348*fbf5b9f8SEnji Cooper 	ATF_TP_ADD_TC(tp, WRDE_UNDEF_test);
349*fbf5b9f8SEnji Cooper 	ATF_TP_ADD_TC(tp, WRDE_NOCMD_test);
350*fbf5b9f8SEnji Cooper 	ATF_TP_ADD_TC(tp, WRDE_BADCHAR_test);
351*fbf5b9f8SEnji Cooper 	ATF_TP_ADD_TC(tp, WRDE_SYNTAX_test);
352*fbf5b9f8SEnji Cooper 	ATF_TP_ADD_TC(tp, with_SIGCHILD_handler_test);
353*fbf5b9f8SEnji Cooper 	ATF_TP_ADD_TC(tp, with_unused_non_default_IFS_test);
354*fbf5b9f8SEnji Cooper 	ATF_TP_ADD_TC(tp, with_used_non_default_IFS_test);
355*fbf5b9f8SEnji Cooper 
356*fbf5b9f8SEnji Cooper 	return (atf_no_error());
357*fbf5b9f8SEnji Cooper }
358