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 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); 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); 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); 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); 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); 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); 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); 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); 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); 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); 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); 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); 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); 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 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