1*a31d3627SSascha Wildner /*-
2*a31d3627SSascha Wildner * Copyright (c) 2003 Tim J. Robbins
3*a31d3627SSascha Wildner * All rights reserved.
4*a31d3627SSascha Wildner *
5*a31d3627SSascha Wildner * Redistribution and use in source and binary forms, with or without
6*a31d3627SSascha Wildner * modification, are permitted provided that the following conditions
7*a31d3627SSascha Wildner * are met:
8*a31d3627SSascha Wildner * 1. Redistributions of source code must retain the above copyright
9*a31d3627SSascha Wildner * notice, this list of conditions and the following disclaimer.
10*a31d3627SSascha Wildner * 2. Redistributions in binary form must reproduce the above copyright
11*a31d3627SSascha Wildner * notice, this list of conditions and the following disclaimer in the
12*a31d3627SSascha Wildner * documentation and/or other materials provided with the distribution.
13*a31d3627SSascha Wildner *
14*a31d3627SSascha Wildner * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15*a31d3627SSascha Wildner * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16*a31d3627SSascha Wildner * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17*a31d3627SSascha Wildner * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18*a31d3627SSascha Wildner * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19*a31d3627SSascha Wildner * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20*a31d3627SSascha Wildner * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21*a31d3627SSascha Wildner * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22*a31d3627SSascha Wildner * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23*a31d3627SSascha Wildner * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24*a31d3627SSascha Wildner * SUCH DAMAGE.
25*a31d3627SSascha Wildner *
26*a31d3627SSascha Wildner * $FreeBSD: head/tools/regression/lib/libc/gen/test-wordexp.c 286941 2015-08-19 20:31:03Z jilles $
27*a31d3627SSascha Wildner */
28*a31d3627SSascha Wildner
29*a31d3627SSascha Wildner /*
30*a31d3627SSascha Wildner * Test program for wordexp() and wordfree() as specified by
31*a31d3627SSascha Wildner * IEEE Std. 1003.1-2001.
32*a31d3627SSascha Wildner */
33*a31d3627SSascha Wildner
34*a31d3627SSascha Wildner #include <sys/wait.h>
35*a31d3627SSascha Wildner
36*a31d3627SSascha Wildner #include <assert.h>
37*a31d3627SSascha Wildner #include <errno.h>
38*a31d3627SSascha Wildner #include <signal.h>
39*a31d3627SSascha Wildner #include <stdio.h>
40*a31d3627SSascha Wildner #include <stdlib.h>
41*a31d3627SSascha Wildner #include <string.h>
42*a31d3627SSascha Wildner #include <wordexp.h>
43*a31d3627SSascha Wildner
44*a31d3627SSascha Wildner static void
chld_handler(int x)45*a31d3627SSascha Wildner chld_handler(int x)
46*a31d3627SSascha Wildner {
47*a31d3627SSascha Wildner int status, serrno;
48*a31d3627SSascha Wildner
49*a31d3627SSascha Wildner (void)x;
50*a31d3627SSascha Wildner serrno = errno;
51*a31d3627SSascha Wildner while (waitpid(-1, &status, WNOHANG) > 0)
52*a31d3627SSascha Wildner ;
53*a31d3627SSascha Wildner errno = serrno;
54*a31d3627SSascha Wildner }
55*a31d3627SSascha Wildner
56*a31d3627SSascha Wildner int
main(int argc,char * argv[])57*a31d3627SSascha Wildner main(int argc, char *argv[])
58*a31d3627SSascha Wildner {
59*a31d3627SSascha Wildner struct sigaction sa;
60*a31d3627SSascha Wildner wordexp_t we;
61*a31d3627SSascha Wildner int r;
62*a31d3627SSascha Wildner int i;
63*a31d3627SSascha Wildner char longdata[6 * 10000 + 1];
64*a31d3627SSascha Wildner
65*a31d3627SSascha Wildner /* Test that the macros are there. */
66*a31d3627SSascha Wildner (void)(WRDE_APPEND + WRDE_DOOFFS + WRDE_NOCMD + WRDE_REUSE +
67*a31d3627SSascha Wildner WRDE_SHOWERR + WRDE_UNDEF);
68*a31d3627SSascha Wildner (void)(WRDE_BADCHAR + WRDE_BADVAL + WRDE_CMDSUB + WRDE_NOSPACE +
69*a31d3627SSascha Wildner WRDE_SYNTAX);
70*a31d3627SSascha Wildner
71*a31d3627SSascha Wildner /* Simple test. */
72*a31d3627SSascha Wildner r = wordexp("hello world", &we, 0);
73*a31d3627SSascha Wildner assert(r == 0);
74*a31d3627SSascha Wildner assert(we.we_wordc == 2);
75*a31d3627SSascha Wildner assert(strcmp(we.we_wordv[0], "hello") == 0);
76*a31d3627SSascha Wildner assert(strcmp(we.we_wordv[1], "world") == 0);
77*a31d3627SSascha Wildner assert(we.we_wordv[2] == NULL);
78*a31d3627SSascha Wildner wordfree(&we);
79*a31d3627SSascha Wildner
80*a31d3627SSascha Wildner /* Long output. */
81*a31d3627SSascha Wildner for (i = 0; i < 10000; i++)
82*a31d3627SSascha Wildner snprintf(longdata + 6 * i, 7, "%05d ", i);
83*a31d3627SSascha Wildner r = wordexp(longdata, &we, 0);
84*a31d3627SSascha Wildner assert(r == 0);
85*a31d3627SSascha Wildner assert(we.we_wordc == 10000);
86*a31d3627SSascha Wildner assert(we.we_wordv[10000] == NULL);
87*a31d3627SSascha Wildner wordfree(&we);
88*a31d3627SSascha Wildner
89*a31d3627SSascha Wildner /* WRDE_DOOFFS */
90*a31d3627SSascha Wildner we.we_offs = 3;
91*a31d3627SSascha Wildner r = wordexp("hello world", &we, WRDE_DOOFFS);
92*a31d3627SSascha Wildner assert(r == 0);
93*a31d3627SSascha Wildner assert(we.we_wordc == 2);
94*a31d3627SSascha Wildner assert(we.we_wordv[0] == NULL);
95*a31d3627SSascha Wildner assert(we.we_wordv[1] == NULL);
96*a31d3627SSascha Wildner assert(we.we_wordv[2] == NULL);
97*a31d3627SSascha Wildner assert(strcmp(we.we_wordv[3], "hello") == 0);
98*a31d3627SSascha Wildner assert(strcmp(we.we_wordv[4], "world") == 0);
99*a31d3627SSascha Wildner assert(we.we_wordv[5] == NULL);
100*a31d3627SSascha Wildner wordfree(&we);
101*a31d3627SSascha Wildner
102*a31d3627SSascha Wildner /* WRDE_REUSE */
103*a31d3627SSascha Wildner r = wordexp("hello world", &we, 0);
104*a31d3627SSascha Wildner r = wordexp("hello world", &we, WRDE_REUSE);
105*a31d3627SSascha Wildner assert(r == 0);
106*a31d3627SSascha Wildner assert(we.we_wordc == 2);
107*a31d3627SSascha Wildner assert(strcmp(we.we_wordv[0], "hello") == 0);
108*a31d3627SSascha Wildner assert(strcmp(we.we_wordv[1], "world") == 0);
109*a31d3627SSascha Wildner assert(we.we_wordv[2] == NULL);
110*a31d3627SSascha Wildner wordfree(&we);
111*a31d3627SSascha Wildner
112*a31d3627SSascha Wildner /* WRDE_APPEND */
113*a31d3627SSascha Wildner r = wordexp("this is", &we, 0);
114*a31d3627SSascha Wildner assert(r == 0);
115*a31d3627SSascha Wildner r = wordexp("a test", &we, WRDE_APPEND);
116*a31d3627SSascha Wildner assert(r == 0);
117*a31d3627SSascha Wildner assert(we.we_wordc == 4);
118*a31d3627SSascha Wildner assert(strcmp(we.we_wordv[0], "this") == 0);
119*a31d3627SSascha Wildner assert(strcmp(we.we_wordv[1], "is") == 0);
120*a31d3627SSascha Wildner assert(strcmp(we.we_wordv[2], "a") == 0);
121*a31d3627SSascha Wildner assert(strcmp(we.we_wordv[3], "test") == 0);
122*a31d3627SSascha Wildner assert(we.we_wordv[4] == NULL);
123*a31d3627SSascha Wildner wordfree(&we);
124*a31d3627SSascha Wildner
125*a31d3627SSascha Wildner /* WRDE_DOOFFS + WRDE_APPEND */
126*a31d3627SSascha Wildner we.we_offs = 2;
127*a31d3627SSascha Wildner r = wordexp("this is", &we, WRDE_DOOFFS);
128*a31d3627SSascha Wildner assert(r == 0);
129*a31d3627SSascha Wildner r = wordexp("a test", &we, WRDE_APPEND|WRDE_DOOFFS);
130*a31d3627SSascha Wildner assert(r == 0);
131*a31d3627SSascha Wildner r = wordexp("of wordexp", &we, WRDE_APPEND|WRDE_DOOFFS);
132*a31d3627SSascha Wildner assert(r == 0);
133*a31d3627SSascha Wildner assert(we.we_wordc == 6);
134*a31d3627SSascha Wildner assert(we.we_wordv[0] == NULL);
135*a31d3627SSascha Wildner assert(we.we_wordv[1] == NULL);
136*a31d3627SSascha Wildner assert(strcmp(we.we_wordv[2], "this") == 0);
137*a31d3627SSascha Wildner assert(strcmp(we.we_wordv[3], "is") == 0);
138*a31d3627SSascha Wildner assert(strcmp(we.we_wordv[4], "a") == 0);
139*a31d3627SSascha Wildner assert(strcmp(we.we_wordv[5], "test") == 0);
140*a31d3627SSascha Wildner assert(strcmp(we.we_wordv[6], "of") == 0);
141*a31d3627SSascha Wildner assert(strcmp(we.we_wordv[7], "wordexp") == 0);
142*a31d3627SSascha Wildner assert(we.we_wordv[8] == NULL);
143*a31d3627SSascha Wildner wordfree(&we);
144*a31d3627SSascha Wildner
145*a31d3627SSascha Wildner /* WRDE_UNDEF */
146*a31d3627SSascha Wildner r = wordexp("${dont_set_me}", &we, WRDE_UNDEF);
147*a31d3627SSascha Wildner assert(r == WRDE_BADVAL);
148*a31d3627SSascha Wildner
149*a31d3627SSascha Wildner /* WRDE_NOCMD */
150*a31d3627SSascha Wildner r = wordexp("`date`", &we, WRDE_NOCMD);
151*a31d3627SSascha Wildner assert(r == WRDE_CMDSUB);
152*a31d3627SSascha Wildner r = wordexp("\"`date`\"", &we, WRDE_NOCMD);
153*a31d3627SSascha Wildner assert(r == WRDE_CMDSUB);
154*a31d3627SSascha Wildner r = wordexp("$(date)", &we, WRDE_NOCMD);
155*a31d3627SSascha Wildner assert(r == WRDE_CMDSUB);
156*a31d3627SSascha Wildner r = wordexp("\"$(date)\"", &we, WRDE_NOCMD);
157*a31d3627SSascha Wildner assert(r == WRDE_CMDSUB);
158*a31d3627SSascha Wildner r = wordexp("$((3+5))", &we, WRDE_NOCMD);
159*a31d3627SSascha Wildner assert(r == 0);
160*a31d3627SSascha Wildner r = wordexp("\\$\\(date\\)", &we, WRDE_NOCMD|WRDE_REUSE);
161*a31d3627SSascha Wildner assert(r == 0);
162*a31d3627SSascha Wildner r = wordexp("'`date`'", &we, WRDE_NOCMD|WRDE_REUSE);
163*a31d3627SSascha Wildner assert(r == 0);
164*a31d3627SSascha Wildner r = wordexp("'$(date)'", &we, WRDE_NOCMD|WRDE_REUSE);
165*a31d3627SSascha Wildner assert(r == 0);
166*a31d3627SSascha Wildner wordfree(&we);
167*a31d3627SSascha Wildner
168*a31d3627SSascha Wildner /* WRDE_BADCHAR */
169*a31d3627SSascha Wildner r = wordexp("'\n|&;<>(){}'", &we, 0);
170*a31d3627SSascha Wildner assert(r == 0);
171*a31d3627SSascha Wildner r = wordexp("\"\n|&;<>(){}\"", &we, WRDE_REUSE);
172*a31d3627SSascha Wildner assert(r == 0);
173*a31d3627SSascha Wildner r = wordexp("\\\n\\|\\&\\;\\<\\>\\(\\)\\{\\}", &we, WRDE_REUSE);
174*a31d3627SSascha Wildner assert(r == 0);
175*a31d3627SSascha Wildner wordfree(&we);
176*a31d3627SSascha Wildner r = wordexp("test \n test", &we, 0);
177*a31d3627SSascha Wildner assert(r == WRDE_BADCHAR);
178*a31d3627SSascha Wildner r = wordexp("test | test", &we, 0);
179*a31d3627SSascha Wildner assert(r == WRDE_BADCHAR);
180*a31d3627SSascha Wildner r = wordexp("test & test", &we, 0);
181*a31d3627SSascha Wildner assert(r == WRDE_BADCHAR);
182*a31d3627SSascha Wildner r = wordexp("test ; test", &we, 0);
183*a31d3627SSascha Wildner assert(r == WRDE_BADCHAR);
184*a31d3627SSascha Wildner r = wordexp("test > test", &we, 0);
185*a31d3627SSascha Wildner assert(r == WRDE_BADCHAR);
186*a31d3627SSascha Wildner r = wordexp("test < test", &we, 0);
187*a31d3627SSascha Wildner assert(r == WRDE_BADCHAR);
188*a31d3627SSascha Wildner r = wordexp("test ( test", &we, 0);
189*a31d3627SSascha Wildner assert(r == WRDE_BADCHAR);
190*a31d3627SSascha Wildner r = wordexp("test ) test", &we, 0);
191*a31d3627SSascha Wildner assert(r == WRDE_BADCHAR);
192*a31d3627SSascha Wildner r = wordexp("test { test", &we, 0);
193*a31d3627SSascha Wildner assert(r == WRDE_BADCHAR);
194*a31d3627SSascha Wildner r = wordexp("test } test", &we, 0);
195*a31d3627SSascha Wildner assert(r == WRDE_BADCHAR);
196*a31d3627SSascha Wildner
197*a31d3627SSascha Wildner /* WRDE_SYNTAX */
198*a31d3627SSascha Wildner r = wordexp("'", &we, 0);
199*a31d3627SSascha Wildner assert(r == WRDE_SYNTAX);
200*a31d3627SSascha Wildner r = wordexp("'", &we, WRDE_UNDEF);
201*a31d3627SSascha Wildner assert(r == WRDE_SYNTAX);
202*a31d3627SSascha Wildner r = wordexp("'\\'", &we, 0);
203*a31d3627SSascha Wildner assert(r == 0);
204*a31d3627SSascha Wildner assert(we.we_wordc == 1);
205*a31d3627SSascha Wildner assert(strcmp(we.we_wordv[0], "\\") == 0);
206*a31d3627SSascha Wildner assert(we.we_wordv[1] == NULL);
207*a31d3627SSascha Wildner wordfree(&we);
208*a31d3627SSascha Wildner /* Two syntax errors that are not detected by the current we_check(). */
209*a31d3627SSascha Wildner r = wordexp("${IFS:+'}", &we, 0);
210*a31d3627SSascha Wildner assert(r == WRDE_SYNTAX);
211*a31d3627SSascha Wildner r = wordexp("${IFS:+'}", &we, WRDE_UNDEF);
212*a31d3627SSascha Wildner assert(r == WRDE_SYNTAX);
213*a31d3627SSascha Wildner r = wordexp("$(case)", &we, 0);
214*a31d3627SSascha Wildner assert(r == WRDE_SYNTAX);
215*a31d3627SSascha Wildner r = wordexp("$(case)", &we, WRDE_UNDEF);
216*a31d3627SSascha Wildner assert(r == WRDE_SYNTAX);
217*a31d3627SSascha Wildner
218*a31d3627SSascha Wildner /* With a SIGCHLD handler that reaps all zombies. */
219*a31d3627SSascha Wildner sa.sa_flags = 0;
220*a31d3627SSascha Wildner sigemptyset(&sa.sa_mask);
221*a31d3627SSascha Wildner sa.sa_handler = chld_handler;
222*a31d3627SSascha Wildner r = sigaction(SIGCHLD, &sa, NULL);
223*a31d3627SSascha Wildner assert(r == 0);
224*a31d3627SSascha Wildner r = wordexp("hello world", &we, 0);
225*a31d3627SSascha Wildner assert(r == 0);
226*a31d3627SSascha Wildner assert(we.we_wordc == 2);
227*a31d3627SSascha Wildner assert(strcmp(we.we_wordv[0], "hello") == 0);
228*a31d3627SSascha Wildner assert(strcmp(we.we_wordv[1], "world") == 0);
229*a31d3627SSascha Wildner assert(we.we_wordv[2] == NULL);
230*a31d3627SSascha Wildner wordfree(&we);
231*a31d3627SSascha Wildner sa.sa_handler = SIG_DFL;
232*a31d3627SSascha Wildner r = sigaction(SIGCHLD, &sa, NULL);
233*a31d3627SSascha Wildner assert(r == 0);
234*a31d3627SSascha Wildner
235*a31d3627SSascha Wildner /*
236*a31d3627SSascha Wildner * With IFS set to a non-default value (without depending on whether
237*a31d3627SSascha Wildner * IFS is inherited or not).
238*a31d3627SSascha Wildner */
239*a31d3627SSascha Wildner r = setenv("IFS", ":", 1);
240*a31d3627SSascha Wildner assert(r == 0);
241*a31d3627SSascha Wildner r = wordexp("hello world", &we, 0);
242*a31d3627SSascha Wildner assert(r == 0);
243*a31d3627SSascha Wildner assert(we.we_wordc == 2);
244*a31d3627SSascha Wildner assert(strcmp(we.we_wordv[0], "hello") == 0);
245*a31d3627SSascha Wildner assert(strcmp(we.we_wordv[1], "world") == 0);
246*a31d3627SSascha Wildner assert(we.we_wordv[2] == NULL);
247*a31d3627SSascha Wildner wordfree(&we);
248*a31d3627SSascha Wildner r = unsetenv("IFS");
249*a31d3627SSascha Wildner assert(r == 0);
250*a31d3627SSascha Wildner
251*a31d3627SSascha Wildner /*
252*a31d3627SSascha Wildner * With IFS set to a non-default value, and using it.
253*a31d3627SSascha Wildner */
254*a31d3627SSascha Wildner r = setenv("IFS", ":", 1);
255*a31d3627SSascha Wildner assert(r == 0);
256*a31d3627SSascha Wildner r = wordexp("${IFS+hello:world}", &we, 0);
257*a31d3627SSascha Wildner assert(r == 0);
258*a31d3627SSascha Wildner assert(we.we_wordc == 2);
259*a31d3627SSascha Wildner assert(strcmp(we.we_wordv[0], "hello") == 0);
260*a31d3627SSascha Wildner assert(strcmp(we.we_wordv[1], "world") == 0);
261*a31d3627SSascha Wildner assert(we.we_wordv[2] == NULL);
262*a31d3627SSascha Wildner wordfree(&we);
263*a31d3627SSascha Wildner r = unsetenv("IFS");
264*a31d3627SSascha Wildner assert(r == 0);
265*a31d3627SSascha Wildner
266*a31d3627SSascha Wildner printf("PASS wordexp()\n");
267*a31d3627SSascha Wildner printf("PASS wordfree()\n");
268*a31d3627SSascha Wildner
269*a31d3627SSascha Wildner return (0);
270*a31d3627SSascha Wildner }
271