summaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorngie <ngie@FreeBSD.org>2015-11-09 06:24:11 +0000
committerngie <ngie@FreeBSD.org>2015-11-09 06:24:11 +0000
commit5a54ab5e6790d816f2c3dd53e7662ecc06726dc7 (patch)
treed6d0b17e61ef93ad2aed62a47158a0357873ff1d /tools
parentd0245e573224c10fd72bff97ced03c3d8cdbff86 (diff)
downloadFreeBSD-src-5a54ab5e6790d816f2c3dd53e7662ecc06726dc7.zip
FreeBSD-src-5a54ab5e6790d816f2c3dd53e7662ecc06726dc7.tar.gz
Integrate tools/regression/lib/libc/gen into the FreeBSD test suite
as lib/libc/tests/gen The code in test-fnmatch that was used for generating: - bin/sh/tests/builtins/case2.0 - bin/sh/tests/builtins/case3.0 has been left undisturbed. The target `make sh-tests` has been moved over from tools/regression/lib/libc/gen/Makefile to lib/libc/tests/gen/Makefile and made into a PHONY target case2.0 and case3.0 test input generation isn't being done automatically. This needs additional discussion. MFC after: 1 week Sponsored by: EMC / Isilon Storage Division
Diffstat (limited to 'tools')
-rw-r--r--tools/regression/lib/libc/gen/Makefile16
-rw-r--r--tools/regression/lib/libc/gen/test-fmtcheck.c102
-rw-r--r--tools/regression/lib/libc/gen/test-fmtmsg.c251
-rw-r--r--tools/regression/lib/libc/gen/test-fnmatch.c390
-rw-r--r--tools/regression/lib/libc/gen/test-ftw.c143
-rw-r--r--tools/regression/lib/libc/gen/test-popen.c227
-rw-r--r--tools/regression/lib/libc/gen/test-posix_spawn.c90
-rw-r--r--tools/regression/lib/libc/gen/test-wordexp.c271
8 files changed, 0 insertions, 1490 deletions
diff --git a/tools/regression/lib/libc/gen/Makefile b/tools/regression/lib/libc/gen/Makefile
deleted file mode 100644
index f3a40e3..0000000
--- a/tools/regression/lib/libc/gen/Makefile
+++ /dev/null
@@ -1,16 +0,0 @@
-# $FreeBSD$
-
-TESTS= test-fmtcheck test-fmtmsg test-fnmatch \
- test-ftw test-popen test-posix_spawn test-wordexp
-
-.PHONY: tests
-tests: ${TESTS}
- for p in ${TESTS}; do ${.OBJDIR}/$$p; done
-
-.PHONY: clean
-clean:
- -rm -f ${TESTS}
-
-sh-tests: test-fnmatch
- ./test-fnmatch -s 1 >../../../bin/sh/builtins/case2.0
- ./test-fnmatch -s 2 >../../../bin/sh/builtins/case3.0
diff --git a/tools/regression/lib/libc/gen/test-fmtcheck.c b/tools/regression/lib/libc/gen/test-fmtcheck.c
deleted file mode 100644
index 734eab1..0000000
--- a/tools/regression/lib/libc/gen/test-fmtcheck.c
+++ /dev/null
@@ -1,102 +0,0 @@
-/* $NetBSD: tfmtcheck.c,v 1.3 2008/04/28 20:23:04 martin Exp $ */
-
-/*-
- * Copyright (c) 2000 The NetBSD Foundation, Inc.
- * All rights reserved.
- *
- * This code was contributed to The NetBSD Foundation by Allen Briggs.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
- * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <err.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-struct test_fmt {
- char *fmt1;
- char *fmt2;
- int correct;
-} test_fmts[] = {
- { "%d", "%d", 1 },
- { "%2d", "%2.2d", 1 },
- { "%x", "%d", 1 },
- { "%u", "%d", 1 },
- { "%03d", "%d", 1 },
- { "%-2d", "%d", 1 },
- { "%d", "%-12.1d", 1 },
- { "%d", "%-01.3d", 1 },
- { "%X", "%-01.3d", 1 },
- { "%D", "%ld", 1 },
- { "%s", "%s", 1 },
- { "%s", "This is a %s test", 1 },
- { "Hi, there. This is a %s test", "%s", 1 },
- { "%d", "%s", 2 },
- { "%e", "%s", 2 },
- { "%r", "%d", 2 },
- { "%*.2d", "%*d", 1 },
- { "%2.*d", "%*d", 2 },
- { "%*d", "%*d", 1 },
- { "%-3", "%d", 2 },
- { "%d %s", "%d", 2 },
- { "%*.*.*d", "%*.*.*d", 2 },
- { "%d", "%d %s", 1 },
- { "%40s", "%20s", 1 },
- { "%x %x %x", "%o %u %d", 1 },
- { "%o %u %d", "%x %x %X", 1 },
- { "%#o %u %#-d", "%x %#x %X", 1 },
- { "%qd", "%llx", 1 },
- { "%%", "%llx", 1 },
- { "%p %30s %#llx %-10.*e", "This number %lu%% and string %s has %qd numbers and %.*g floats", 1 },
-};
-
-int
-main(int argc, char *argv[])
-{
- int i, n, r;
- const char *f, *cf, *f1, *f2;
-
- printf("1..1\n");
- r = 0;
- n = sizeof(test_fmts) / sizeof(test_fmts[0]);
- for (i=0 ; i<n ; i++) {
- f1 = test_fmts[i].fmt1;
- f2 = test_fmts[i].fmt2;
- f = fmtcheck(f1, f2);
- if (test_fmts[i].correct == 1) {
- cf = f1;
- } else {
- cf = f2;
- }
- if (f != cf) {
- r++;
- errx(1, "Test %d: (%s) vs. (%s) failed "
- "(should have returned %s)", i, f1, f2,
- (test_fmts[i].correct == 1) ? "1st" : "2nd");
- }
- }
- printf("ok 1\n");
- exit(0);
-}
diff --git a/tools/regression/lib/libc/gen/test-fmtmsg.c b/tools/regression/lib/libc/gen/test-fmtmsg.c
deleted file mode 100644
index e5dcc0f..0000000
--- a/tools/regression/lib/libc/gen/test-fmtmsg.c
+++ /dev/null
@@ -1,251 +0,0 @@
-/*-
- * Copyright (c) 2012 Jilles Tjoelker
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/wait.h>
-
-#include <err.h>
-#include <errno.h>
-#include <fmtmsg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-static char *run_test(long classification, const char *label, int severity,
- const char *text, const char *action, const char *tag);
-
-struct testcase {
- long classification;
- const char *label;
- int severity;
- const char *text;
- const char *action;
- const char *tag;
- const char *msgverb;
- const char *result;
-} testcases[] = {
- {
- MM_UTIL | MM_PRINT, "BSD:ls", MM_ERROR,
- "illegal option -- z", "refer to manual", "BSD:ls:001",
- NULL,
- "BSD:ls: ERROR: illegal option -- z\n"
- "TO FIX: refer to manual BSD:ls:001\n"
- },
- {
- MM_UTIL | MM_PRINT, "BSD:ls", MM_ERROR,
- "illegal option -- z", "refer to manual", "BSD:ls:001",
- "text:severity:action:tag",
- "illegal option -- z: ERROR\n"
- "TO FIX: refer to manual BSD:ls:001\n"
- },
- {
- MM_UTIL | MM_PRINT, "BSD:ls", MM_ERROR,
- "illegal option -- z", "refer to manual", "BSD:ls:001",
- "text",
- "illegal option -- z\n"
- },
- {
- MM_UTIL | MM_PRINT, "BSD:ls", MM_ERROR,
- "illegal option -- z", "refer to manual", "BSD:ls:001",
- "severity:text",
- "ERROR: illegal option -- z\n"
- },
- {
- MM_UTIL | MM_PRINT, "BSD:ls", MM_ERROR,
- "illegal option -- z", "refer to manual", "BSD:ls:001",
- "ignore me",
- "BSD:ls: ERROR: illegal option -- z\n"
- "TO FIX: refer to manual BSD:ls:001\n"
- },
- {
- MM_UTIL | MM_PRINT, "BSD:ls", MM_ERROR,
- "illegal option -- z", "refer to manual", "BSD:ls:001",
- "tag:severity:text:nothing:action",
- "BSD:ls: ERROR: illegal option -- z\n"
- "TO FIX: refer to manual BSD:ls:001\n"
- },
- {
- MM_UTIL | MM_PRINT, "BSD:ls", MM_ERROR,
- "illegal option -- z", "refer to manual", "BSD:ls:001",
- "",
- "BSD:ls: ERROR: illegal option -- z\n"
- "TO FIX: refer to manual BSD:ls:001\n"
- },
- {
- MM_UTIL | MM_PRINT, MM_NULLLBL, MM_ERROR,
- "illegal option -- z", "refer to manual", "BSD:ls:001",
- NULL,
- "ERROR: illegal option -- z\n"
- "TO FIX: refer to manual BSD:ls:001\n"
- },
- {
- MM_UTIL | MM_PRINT, "BSD:ls", MM_ERROR,
- "illegal option -- z", MM_NULLACT, MM_NULLTAG,
- NULL,
- "BSD:ls: ERROR: illegal option -- z\n"
- },
- {
- MM_UTIL | MM_NULLMC, "BSD:ls", MM_ERROR,
- "illegal option -- z", "refer to manual", "BSD:ls:001",
- NULL,
- ""
- },
- {
- MM_APPL | MM_PRINT, "ABCDEFGHIJ:abcdefghijklmn", MM_INFO,
- "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
- "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
- "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
- "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
- "refer to manual", "ABCDEFGHIJ:abcdefghijklmn:001",
- NULL,
- "ABCDEFGHIJ:abcdefghijklmn: INFO: "
- "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
- "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
- "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
- "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n"
- "TO FIX: refer to manual ABCDEFGHIJ:abcdefghijklmn:001\n"
- },
- {
- MM_OPSYS | MM_PRINT, "TEST:test", MM_HALT,
- "failed", "nothing can help me", "NOTHING",
- NULL,
- "TEST:test: HALT: failed\n"
- "TO FIX: nothing can help me NOTHING\n"
- },
- {
- MM_OPSYS | MM_PRINT, "TEST:test", MM_WARNING,
- "failed", "nothing can help me", "NOTHING",
- NULL,
- "TEST:test: WARNING: failed\n"
- "TO FIX: nothing can help me NOTHING\n"
- },
- {
- MM_OPSYS | MM_PRINT, "TEST:test", MM_NOSEV,
- "failed", "nothing can help me", "NOTHING",
- NULL,
- "TEST:test: failed\n"
- "TO FIX: nothing can help me NOTHING\n"
- }
-};
-
-static char *
-run_test(long classification, const char *label, int severity,
- const char *text, const char *action, const char *tag)
-{
- int pip[2];
- pid_t pid, wpid;
- char *result, *p;
- size_t resultsize;
- ssize_t n;
- int status;
-
- if (pipe(pip) == -1)
- err(2, "pipe");
- pid = fork();
- if (pid == -1)
- err(2, "fork");
- if (pid == 0) {
- close(pip[0]);
- if (pip[1] != STDERR_FILENO &&
- dup2(pip[1], STDERR_FILENO) == -1)
- _exit(2);
- if (fmtmsg(classification, label, severity, text, action, tag)
- != MM_OK)
- _exit(1);
- else
- _exit(0);
- }
- close(pip[1]);
- resultsize = 1024;
- result = malloc(resultsize);
- p = result;
- while ((n = read(pip[0], p, result + resultsize - p - 1)) != 0) {
- if (n == -1) {
- if (errno == EINTR)
- continue;
- else
- err(2, "read");
- }
- p += n;
- if (result + resultsize == p - 1) {
- resultsize *= 2;
- result = realloc(result, resultsize);
- if (result == NULL)
- err(2, "realloc");
- }
- }
- if (memchr(result, '\0', p - result) != NULL) {
- free(result);
- return (NULL);
- }
- *p = '\0';
- close(pip[0]);
- while ((wpid = waitpid(pid, &status, 0)) == -1 && errno == EINTR)
- ;
- if (wpid == -1)
- err(2, "waitpid");
- if (status != 0) {
- free(result);
- return (NULL);
- }
- return (result);
-}
-
-int
-main(void)
-{
- size_t i, n;
- int errors;
- char *result;
- struct testcase *t;
-
- n = sizeof(testcases) / sizeof(testcases[0]);
- errors = 0;
- printf("1..%zu\n", n);
- for (i = 0; i < n; i++) {
- t = &testcases[i];
- if (t->msgverb != NULL)
- setenv("MSGVERB", t->msgverb, 1);
- else
- unsetenv("MSGVERB");
- result = run_test(t->classification, t->label, t->severity,
- t->text, t->action, t->tag);
- if (result != NULL && strcmp(result, t->result) == 0)
- printf("ok %zu - correct\n",
- i + 1);
- else {
- printf("not ok %zu - %s\n",
- i + 1, result != NULL ? "incorrect" : "failed");
- errors = 1;
- }
- free(result);
- }
-
- return (errors);
-}
diff --git a/tools/regression/lib/libc/gen/test-fnmatch.c b/tools/regression/lib/libc/gen/test-fnmatch.c
deleted file mode 100644
index fd33574..0000000
--- a/tools/regression/lib/libc/gen/test-fnmatch.c
+++ /dev/null
@@ -1,390 +0,0 @@
-/*-
- * Copyright (c) 2010 Jilles Tjoelker
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <fnmatch.h>
-
-struct testcase {
- const char *pattern;
- const char *string;
- int flags;
- int result;
-} testcases[] = {
- "", "", 0, 0,
- "a", "a", 0, 0,
- "a", "b", 0, FNM_NOMATCH,
- "a", "A", 0, FNM_NOMATCH,
- "*", "a", 0, 0,
- "*", "aa", 0, 0,
- "*a", "a", 0, 0,
- "*a", "b", 0, FNM_NOMATCH,
- "*a*", "b", 0, FNM_NOMATCH,
- "*a*b*", "ab", 0, 0,
- "*a*b*", "qaqbq", 0, 0,
- "*a*bb*", "qaqbqbbq", 0, 0,
- "*a*bc*", "qaqbqbcq", 0, 0,
- "*a*bb*", "qaqbqbb", 0, 0,
- "*a*bc*", "qaqbqbc", 0, 0,
- "*a*bb", "qaqbqbb", 0, 0,
- "*a*bc", "qaqbqbc", 0, 0,
- "*a*bb", "qaqbqbbq", 0, FNM_NOMATCH,
- "*a*bc", "qaqbqbcq", 0, FNM_NOMATCH,
- "*a*a*a*a*a*a*a*a*a*a*", "aaaaaaaaa", 0, FNM_NOMATCH,
- "*a*a*a*a*a*a*a*a*a*a*", "aaaaaaaaaa", 0, 0,
- "*a*a*a*a*a*a*a*a*a*a*", "aaaaaaaaaaa", 0, 0,
- ".*.*.*.*.*.*.*.*.*.*", ".........", 0, FNM_NOMATCH,
- ".*.*.*.*.*.*.*.*.*.*", "..........", 0, 0,
- ".*.*.*.*.*.*.*.*.*.*", "...........", 0, 0,
- "*?*?*?*?*?*?*?*?*?*?*", "123456789", 0, FNM_NOMATCH,
- "??????????*", "123456789", 0, FNM_NOMATCH,
- "*??????????", "123456789", 0, FNM_NOMATCH,
- "*?*?*?*?*?*?*?*?*?*?*", "1234567890", 0, 0,
- "??????????*", "1234567890", 0, 0,
- "*??????????", "1234567890", 0, 0,
- "*?*?*?*?*?*?*?*?*?*?*", "12345678901", 0, 0,
- "??????????*", "12345678901", 0, 0,
- "*??????????", "12345678901", 0, 0,
- "[x]", "x", 0, 0,
- "[*]", "*", 0, 0,
- "[?]", "?", 0, 0,
- "[", "[", 0, 0,
- "[[]", "[", 0, 0,
- "[[]", "x", 0, FNM_NOMATCH,
- "[*]", "", 0, FNM_NOMATCH,
- "[*]", "x", 0, FNM_NOMATCH,
- "[?]", "x", 0, FNM_NOMATCH,
- "*[*]*", "foo*foo", 0, 0,
- "*[*]*", "foo", 0, FNM_NOMATCH,
- "[0-9]", "0", 0, 0,
- "[0-9]", "5", 0, 0,
- "[0-9]", "9", 0, 0,
- "[0-9]", "/", 0, FNM_NOMATCH,
- "[0-9]", ":", 0, FNM_NOMATCH,
- "[0-9]", "*", 0, FNM_NOMATCH,
- "[!0-9]", "0", 0, FNM_NOMATCH,
- "[!0-9]", "5", 0, FNM_NOMATCH,
- "[!0-9]", "9", 0, FNM_NOMATCH,
- "[!0-9]", "/", 0, 0,
- "[!0-9]", ":", 0, 0,
- "[!0-9]", "*", 0, 0,
- "*[0-9]", "a0", 0, 0,
- "*[0-9]", "a5", 0, 0,
- "*[0-9]", "a9", 0, 0,
- "*[0-9]", "a/", 0, FNM_NOMATCH,
- "*[0-9]", "a:", 0, FNM_NOMATCH,
- "*[0-9]", "a*", 0, FNM_NOMATCH,
- "*[!0-9]", "a0", 0, FNM_NOMATCH,
- "*[!0-9]", "a5", 0, FNM_NOMATCH,
- "*[!0-9]", "a9", 0, FNM_NOMATCH,
- "*[!0-9]", "a/", 0, 0,
- "*[!0-9]", "a:", 0, 0,
- "*[!0-9]", "a*", 0, 0,
- "*[0-9]", "a00", 0, 0,
- "*[0-9]", "a55", 0, 0,
- "*[0-9]", "a99", 0, 0,
- "*[0-9]", "a0a0", 0, 0,
- "*[0-9]", "a5a5", 0, 0,
- "*[0-9]", "a9a9", 0, 0,
- "\\*", "*", 0, 0,
- "\\?", "?", 0, 0,
- "\\[x]", "[x]", 0, 0,
- "\\[", "[", 0, 0,
- "\\\\", "\\", 0, 0,
- "*\\**", "foo*foo", 0, 0,
- "*\\**", "foo", 0, FNM_NOMATCH,
- "*\\\\*", "foo\\foo", 0, 0,
- "*\\\\*", "foo", 0, FNM_NOMATCH,
- "\\(", "(", 0, 0,
- "\\a", "a", 0, 0,
- "\\*", "a", 0, FNM_NOMATCH,
- "\\?", "a", 0, FNM_NOMATCH,
- "\\*", "\\*", 0, FNM_NOMATCH,
- "\\?", "\\?", 0, FNM_NOMATCH,
- "\\[x]", "\\[x]", 0, FNM_NOMATCH,
- "\\[x]", "\\x", 0, FNM_NOMATCH,
- "\\[", "\\[", 0, FNM_NOMATCH,
- "\\(", "\\(", 0, FNM_NOMATCH,
- "\\a", "\\a", 0, FNM_NOMATCH,
- "\\", "\\", 0, FNM_NOMATCH,
- "\\", "", 0, 0,
- "\\*", "\\*", FNM_NOESCAPE, 0,
- "\\?", "\\?", FNM_NOESCAPE, 0,
- "\\", "\\", FNM_NOESCAPE, 0,
- "\\\\", "\\", FNM_NOESCAPE, FNM_NOMATCH,
- "\\\\", "\\\\", FNM_NOESCAPE, 0,
- "*\\*", "foo\\foo", FNM_NOESCAPE, 0,
- "*\\*", "foo", FNM_NOESCAPE, FNM_NOMATCH,
- "*", ".", FNM_PERIOD, FNM_NOMATCH,
- "?", ".", FNM_PERIOD, FNM_NOMATCH,
- ".*", ".", 0, 0,
- ".*", "..", 0, 0,
- ".*", ".a", 0, 0,
- "[0-9]", ".", FNM_PERIOD, FNM_NOMATCH,
- "a*", "a.", 0, 0,
- "a/a", "a/a", FNM_PATHNAME, 0,
- "a/*", "a/a", FNM_PATHNAME, 0,
- "*/a", "a/a", FNM_PATHNAME, 0,
- "*/*", "a/a", FNM_PATHNAME, 0,
- "a*b/*", "abbb/x", FNM_PATHNAME, 0,
- "a*b/*", "abbb/.x", FNM_PATHNAME, 0,
- "*", "a/a", FNM_PATHNAME, FNM_NOMATCH,
- "*/*", "a/a/a", FNM_PATHNAME, FNM_NOMATCH,
- "b/*", "b/.x", FNM_PATHNAME | FNM_PERIOD, FNM_NOMATCH,
- "b*/*", "a/.x", FNM_PATHNAME | FNM_PERIOD, FNM_NOMATCH,
- "b/.*", "b/.x", FNM_PATHNAME | FNM_PERIOD, 0,
- "b*/.*", "b/.x", FNM_PATHNAME | FNM_PERIOD, 0,
- "a", "A", FNM_CASEFOLD, 0,
- "A", "a", FNM_CASEFOLD, 0,
- "[a]", "A", FNM_CASEFOLD, 0,
- "[A]", "a", FNM_CASEFOLD, 0,
- "a", "b", FNM_CASEFOLD, FNM_NOMATCH,
- "a", "a/b", FNM_PATHNAME, FNM_NOMATCH,
- "*", "a/b", FNM_PATHNAME, FNM_NOMATCH,
- "*b", "a/b", FNM_PATHNAME, FNM_NOMATCH,
- "a", "a/b", FNM_PATHNAME | FNM_LEADING_DIR, 0,
- "*", "a/b", FNM_PATHNAME | FNM_LEADING_DIR, 0,
- "*", ".a/b", FNM_PATHNAME | FNM_LEADING_DIR, 0,
- "*a", ".a/b", FNM_PATHNAME | FNM_LEADING_DIR, 0,
- "*", ".a/b", FNM_PATHNAME | FNM_PERIOD | FNM_LEADING_DIR, FNM_NOMATCH,
- "*a", ".a/b", FNM_PATHNAME | FNM_PERIOD | FNM_LEADING_DIR, FNM_NOMATCH,
- "a*b/*", "abbb/.x", FNM_PATHNAME | FNM_PERIOD, FNM_NOMATCH,
-};
-
-static const char *
-flags_to_string(int flags)
-{
- static const int flagvalues[] = { FNM_NOESCAPE, FNM_PATHNAME,
- FNM_PERIOD, FNM_LEADING_DIR, FNM_CASEFOLD, 0 };
- static const char flagnames[] = "FNM_NOESCAPE\0FNM_PATHNAME\0FNM_PERIOD\0FNM_LEADING_DIR\0FNM_CASEFOLD\0";
- static char result[sizeof(flagnames) + 3 * sizeof(int) + 2];
- char *p;
- size_t i, len;
- const char *fp;
-
- p = result;
- fp = flagnames;
- for (i = 0; flagvalues[i] != 0; i++) {
- len = strlen(fp);
- if (flags & flagvalues[i]) {
- if (p != result)
- *p++ = '|';
- memcpy(p, fp, len);
- p += len;
- flags &= ~flagvalues[i];
- }
- fp += len + 1;
- }
- if (p == result)
- memcpy(p, "0", 2);
- else if (flags != 0)
- sprintf(p, "%d", flags);
- else
- *p = '\0';
- return result;
-}
-
-static int
-write_sh_tests(const char *progname, int num)
-{
- size_t i, n;
- struct testcase *t;
-
- printf("# Generated by %s -s %d, do not edit.\n", progname, num);
- printf("# $" "FreeBSD$\n");
- printf("failures=\n");
- printf("failed() { printf '%%s\\n' \"Failed: $1 '$2' '$3'\"; failures=x$failures; }\n");
- if (num == 1) {
- printf("testmatch() { eval \"case \\$2 in ''$1) ;; *) failed testmatch \\\"\\$@\\\";; esac\"; }\n");
- printf("testnomatch() { eval \"case \\$2 in ''$1) failed testnomatch \\\"\\$@\\\";; esac\"; }\n");
- } else if (num == 2) {
- printf("# We do not treat a backslash specially in this case,\n");
- printf("# but this is not the case in all shells.\n");
- printf("netestmatch() { case $2 in $1) ;; *) failed netestmatch \"$@\";; esac; }\n");
- printf("netestnomatch() { case $2 in $1) failed netestnomatch \"$@\";; esac; }\n");
- }
- n = sizeof(testcases) / sizeof(testcases[0]);
- for (i = 0; i < n; i++) {
- t = &testcases[i];
- if (strchr(t->pattern, '\'') != NULL ||
- strchr(t->string, '\'') != NULL)
- continue;
- if (t->flags == 0 && strcmp(t->pattern, "\\") == 0)
- continue;
- if (num == 1 && t->flags == 0)
- printf("test%smatch '%s' '%s'\n",
- t->result == FNM_NOMATCH ? "no" : "",
- t->pattern, t->string);
- if (num == 2 && (t->flags == FNM_NOESCAPE ||
- (t->flags == 0 && strchr(t->pattern, '\\') == NULL)))
- printf("netest%smatch '%s' '%s'\n",
- t->result == FNM_NOMATCH ? "no" : "",
- t->pattern, t->string);
- }
- printf("[ -z \"$failures\" ]\n");
- return 0;
-}
-
-int
-main(int argc, char *argv[])
-{
- size_t i, n;
- int opt, flags, result, extra, errors;
- struct testcase *t;
-
- while ((opt = getopt(argc, argv, "s:")) != -1) {
- switch (opt) {
- case 's':
- return (write_sh_tests(argv[0], atoi(optarg)));
- default:
- fprintf(stderr, "usage: %s [-s num]\n", argv[0]);
- fprintf(stderr, "-s option writes tests for sh(1), num is 1 or 2\n");
- exit(1);
- }
- }
- n = sizeof(testcases) / sizeof(testcases[0]);
- errors = 0;
- printf("1..%zu\n", n);
- for (i = 0; i < n; i++) {
- t = &testcases[i];
- flags = t->flags;
- extra = 0;
- do {
- result = fnmatch(t->pattern, t->string, flags);
- if (result != t->result)
- break;
- if (strchr(t->pattern, '\\') == NULL &&
- !(flags & FNM_NOESCAPE)) {
- flags |= FNM_NOESCAPE;
- result = fnmatch(t->pattern, t->string, flags);
- if (result != t->result)
- break;
- flags = t->flags;
- extra++;
- }
- if (strchr(t->pattern, '\\') != NULL &&
- strchr(t->string, '\\') == NULL &&
- t->result == FNM_NOMATCH &&
- !(flags & (FNM_NOESCAPE | FNM_LEADING_DIR))) {
- flags |= FNM_NOESCAPE;
- result = fnmatch(t->pattern, t->string, flags);
- if (result != t->result)
- break;
- flags = t->flags;
- extra++;
- }
- if ((t->string[0] != '.' || t->pattern[0] == '.' ||
- t->result == FNM_NOMATCH) &&
- !(flags & (FNM_PATHNAME | FNM_PERIOD))) {
- flags |= FNM_PERIOD;
- result = fnmatch(t->pattern, t->string, flags);
- if (result != t->result)
- break;
- flags = t->flags;
- extra++;
- }
- if ((strchr(t->string, '/') == NULL ||
- t->result == FNM_NOMATCH) &&
- !(flags & FNM_PATHNAME)) {
- flags |= FNM_PATHNAME;
- result = fnmatch(t->pattern, t->string, flags);
- if (result != t->result)
- break;
- flags = t->flags;
- extra++;
- }
- if ((((t->string[0] != '.' || t->pattern[0] == '.') &&
- strstr(t->string, "/.") == NULL) ||
- t->result == FNM_NOMATCH) &&
- flags & FNM_PATHNAME && !(flags & FNM_PERIOD)) {
- flags |= FNM_PERIOD;
- result = fnmatch(t->pattern, t->string, flags);
- if (result != t->result)
- break;
- flags = t->flags;
- extra++;
- }
- if ((((t->string[0] != '.' || t->pattern[0] == '.') &&
- strchr(t->string, '/') == NULL) ||
- t->result == FNM_NOMATCH) &&
- !(flags & (FNM_PATHNAME | FNM_PERIOD))) {
- flags |= FNM_PATHNAME | FNM_PERIOD;
- result = fnmatch(t->pattern, t->string, flags);
- if (result != t->result)
- break;
- flags = t->flags;
- extra++;
- }
- if ((strchr(t->string, '/') == NULL || t->result == 0)
- && !(flags & FNM_LEADING_DIR)) {
- flags |= FNM_LEADING_DIR;
- result = fnmatch(t->pattern, t->string, flags);
- if (result != t->result)
- break;
- flags = t->flags;
- extra++;
- }
- if (t->result == 0 && !(flags & FNM_CASEFOLD)) {
- flags |= FNM_CASEFOLD;
- result = fnmatch(t->pattern, t->string, flags);
- if (result != t->result)
- break;
- flags = t->flags;
- extra++;
- }
- if (strchr(t->pattern, '\\') == NULL &&
- t->result == 0 &&
- !(flags & (FNM_NOESCAPE | FNM_CASEFOLD))) {
- flags |= FNM_NOESCAPE | FNM_CASEFOLD;
- result = fnmatch(t->pattern, t->string, flags);
- if (result != t->result)
- break;
- flags = t->flags;
- extra++;
- }
- } while (0);
- if (result == t->result)
- printf("ok %zu - fnmatch(\"%s\", \"%s\", %s) = %d (+%d)\n",
- i + 1, t->pattern, t->string,
- flags_to_string(flags),
- result, extra);
- else {
- printf("not ok %zu - fnmatch(\"%s\", \"%s\", %s) = %d != %d\n",
- i + 1, t->pattern, t->string,
- flags_to_string(flags),
- result, t->result);
- errors = 1;
- }
- }
-
- return (errors);
-}
diff --git a/tools/regression/lib/libc/gen/test-ftw.c b/tools/regression/lib/libc/gen/test-ftw.c
deleted file mode 100644
index 209f033..0000000
--- a/tools/regression/lib/libc/gen/test-ftw.c
+++ /dev/null
@@ -1,143 +0,0 @@
-/*-
- * Copyright (c) 2012 Jilles Tjoelker
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-/*
- * Limited test program for nftw() as specified by IEEE Std. 1003.1-2008.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/wait.h>
-
-#include <assert.h>
-#include <err.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <ftw.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <spawn.h>
-#include <unistd.h>
-
-extern char **environ;
-
-static char dir[] = "/tmp/testftw.XXXXXXXXXX";
-static int failures;
-static int ftwflags;
-
-static void
-cleanup(int ustatus __unused)
-{
- int error, status;
- pid_t pid, waitres;
- const char *myargs[5];
-
- err_set_exit(NULL);
- myargs[0] = "rm";
- myargs[1] = "-rf";
- myargs[2] = "--";
- myargs[3] = dir;
- myargs[4] = NULL;
- error = posix_spawnp(&pid, myargs[0], NULL, NULL,
- __DECONST(char **, myargs), environ);
- if (error != 0)
- warn("posix_spawnp rm");
- else {
- waitres = waitpid(pid, &status, 0);
- if (waitres != pid)
- warnx("waitpid rm failed");
- else if (status != 0)
- warnx("rm failed");
- }
-}
-
-static int
-cb(const char *path, const struct stat *st, int type, struct FTW *f)
-{
-
- switch (type) {
- case FTW_D:
- if ((ftwflags & FTW_DEPTH) == 0)
- return (0);
- break;
- case FTW_DP:
- if ((ftwflags & FTW_DEPTH) != 0)
- return (0);
- break;
- case FTW_SL:
- if ((ftwflags & FTW_PHYS) != 0)
- return (0);
- break;
- }
- warnx("unexpected path=%s type=%d f.level=%d\n",
- path, type, f->level);
- failures++;
- return (0);
-}
-
-int
-main(int argc, char *argv[])
-{
- int fd;
-
- if (!mkdtemp(dir))
- err(2, "mkdtemp");
-
- err_set_exit(cleanup);
-
- fd = open(dir, O_DIRECTORY | O_RDONLY);
- if (fd == -1)
- err(2, "open %s", dir);
-
- if (mkdirat(fd, "d1", 0777) == -1)
- err(2, "mkdirat d1");
-
- if (symlinkat(dir, fd, "d1/looper") == -1)
- err(2, "symlinkat looper");
-
- ftwflags = FTW_PHYS;
- if (nftw(dir, cb, 10, ftwflags) == -1)
- err(2, "nftw FTW_PHYS");
- ftwflags = FTW_PHYS | FTW_DEPTH;
- if (nftw(dir, cb, 10, ftwflags) == -1)
- err(2, "nftw FTW_PHYS | FTW_DEPTH");
- ftwflags = 0;
- if (nftw(dir, cb, 10, ftwflags) == -1)
- err(2, "nftw 0");
- ftwflags = FTW_DEPTH;
- if (nftw(dir, cb, 10, ftwflags) == -1)
- err(2, "nftw FTW_DEPTH");
-
- close(fd);
-
- printf("PASS nftw()\n");
-
- cleanup(failures != 0);
-
- return (failures != 0);
-}
diff --git a/tools/regression/lib/libc/gen/test-popen.c b/tools/regression/lib/libc/gen/test-popen.c
deleted file mode 100644
index bf301d2..0000000
--- a/tools/regression/lib/libc/gen/test-popen.c
+++ /dev/null
@@ -1,227 +0,0 @@
-/*-
- * Copyright (c) 2013 Jilles Tjoelker
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-/*
- * Limited test program for popen() as specified by IEEE Std. 1003.1-2008,
- * with BSD extensions.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/wait.h>
-
-#include <assert.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-static int failures;
-static volatile sig_atomic_t got_sigpipe;
-
-static void
-sigpipe_handler(int sig __unused)
-{
- got_sigpipe = 1;
-}
-
-static void
-check_cloexec(FILE *fp, const char *mode)
-{
- int flags;
-
- flags = fcntl(fileno(fp), F_GETFD);
- if (flags == -1)
- fprintf(stderr, "fcntl(F_GETFD) failed\n"), failures++;
- else if ((flags & FD_CLOEXEC) !=
- (strchr(mode, 'e') != NULL ? FD_CLOEXEC : 0))
- fprintf(stderr, "Bad cloexec flag\n"), failures++;
-}
-
-int
-main(int argc, char *argv[])
-{
- FILE *fp, *fp2;
- int i, j, status;
- const char *mode;
- const char *allmodes[] = { "r", "w", "r+", "re", "we", "r+e", "re+" };
- const char *rmodes[] = { "r", "r+", "re", "r+e", "re+" };
- const char *wmodes[] = { "w", "r+", "we", "r+e", "re+" };
- const char *rwmodes[] = { "r+", "r+e", "re+" };
- char buf[80];
- struct sigaction act, oact;
-
- for (i = 0; i < sizeof(allmodes) / sizeof(allmodes[0]); i++) {
- mode = allmodes[i];
- fp = popen("exit 7", mode);
- if (fp == NULL) {
- fprintf(stderr, "popen(, \"%s\") failed", mode);
- failures++;
- continue;
- }
- check_cloexec(fp, mode);
- status = pclose(fp);
- if (!WIFEXITED(status) || WEXITSTATUS(status) != 7)
- fprintf(stderr, "Bad exit status (no I/O)\n"), failures++;
- }
-
- for (i = 0; i < sizeof(rmodes) / sizeof(rmodes[0]); i++) {
- mode = rmodes[i];
- fp = popen("exit 9", mode);
- if (fp == NULL) {
- fprintf(stderr, "popen(, \"%s\") failed", mode);
- failures++;
- continue;
- }
- check_cloexec(fp, mode);
- if (fgetc(fp) != EOF || !feof(fp) || ferror(fp))
- fprintf(stderr, "Input error 1\n"), failures++;
- status = pclose(fp);
- if (!WIFEXITED(status) || WEXITSTATUS(status) != 9)
- fprintf(stderr, "Bad exit status (input)\n"), failures++;
- }
-
- for (i = 0; i < sizeof(rmodes) / sizeof(rmodes[0]); i++) {
- mode = rmodes[i];
- fp = popen("echo hi there", mode);
- if (fp == NULL) {
- fprintf(stderr, "popen(, \"%s\") failed", mode);
- failures++;
- continue;
- }
- check_cloexec(fp, mode);
- if (fgets(buf, sizeof(buf), fp) == NULL)
- fprintf(stderr, "Input error 2\n"), failures++;
- else if (strcmp(buf, "hi there\n") != 0)
- fprintf(stderr, "Bad input 1\n"), failures++;
- status = pclose(fp);
- if (!WIFEXITED(status) || WEXITSTATUS(status) != 0)
- fprintf(stderr, "Bad exit status (input)\n"), failures++;
- }
-
- for (i = 0; i < sizeof(wmodes) / sizeof(wmodes[0]); i++) {
- mode = wmodes[i];
- fp = popen("read x && [ \"$x\" = abcd ]", mode);
- if (fp == NULL) {
- fprintf(stderr, "popen(, \"%s\") failed", mode);
- failures++;
- continue;
- }
- check_cloexec(fp, mode);
- if (fputs("abcd\n", fp) == EOF)
- fprintf(stderr, "Output error 1\n"), failures++;
- status = pclose(fp);
- if (!WIFEXITED(status) || WEXITSTATUS(status) != 0)
- fprintf(stderr, "Bad exit status (output)\n"), failures++;
- }
-
- act.sa_handler = sigpipe_handler;
- act.sa_flags = SA_RESTART;
- sigemptyset(&act.sa_mask);
- if (sigaction(SIGPIPE, &act, &oact) == -1)
- fprintf(stderr, "sigaction() failed\n"), failures++;
- for (i = 0; i < sizeof(wmodes) / sizeof(wmodes[0]); i++) {
- mode = wmodes[i];
- fp = popen("exit 88", mode);
- if (fp == NULL) {
- fprintf(stderr, "popen(, \"%s\") failed", mode);
- failures++;
- continue;
- }
- check_cloexec(fp, mode);
- got_sigpipe = 0;
- while (fputs("abcd\n", fp) != EOF)
- ;
- if (!ferror(fp) || errno != EPIPE)
- fprintf(stderr, "Expected EPIPE\n"), failures++;
- if (!got_sigpipe)
- fprintf(stderr, "Expected SIGPIPE\n"), failures++;
- status = pclose(fp);
- if (!WIFEXITED(status) || WEXITSTATUS(status) != 88)
- fprintf(stderr, "Bad exit status (EPIPE)\n"), failures++;
- }
- if (sigaction(SIGPIPE, &oact, NULL) == -1)
- fprintf(stderr, "sigaction() failed\n"), failures++;
-
- for (i = 0; i < sizeof(rwmodes) / sizeof(rwmodes[0]); i++) {
- mode = rwmodes[i];
- fp = popen("read x && printf '%s\\n' \"Q${x#a}\"", mode);
- if (fp == NULL) {
- fprintf(stderr, "popen(, \"%s\") failed", mode);
- failures++;
- continue;
- }
- check_cloexec(fp, mode);
- if (fputs("abcd\n", fp) == EOF)
- fprintf(stderr, "Output error 2\n"), failures++;
- if (fgets(buf, sizeof(buf), fp) == NULL)
- fprintf(stderr, "Input error 3\n"), failures++;
- else if (strcmp(buf, "Qbcd\n") != 0)
- fprintf(stderr, "Bad input 2\n"), failures++;
- status = pclose(fp);
- if (!WIFEXITED(status) || WEXITSTATUS(status) != 0)
- fprintf(stderr, "Bad exit status (I/O)\n"), failures++;
- }
-
- for (i = 0; i < sizeof(wmodes) / sizeof(wmodes[0]); i++) {
- for (j = 0; j < sizeof(wmodes) / sizeof(wmodes[0]); j++) {
- mode = wmodes[i];
- fp = popen("read x", mode);
- if (fp == NULL) {
- fprintf(stderr, "popen(, \"%s\") failed", mode);
- failures++;
- continue;
- }
- mode = wmodes[j];
- fp2 = popen("read x", mode);
- if (fp2 == NULL) {
- fprintf(stderr, "popen(, \"%s\") failed", mode);
- failures++;
- pclose(fp);
- continue;
- }
- /* If fp2 inherits fp's pipe, we will deadlock here. */
- status = pclose(fp);
- if (!WIFEXITED(status) || WEXITSTATUS(status) != 1) {
- fprintf(stderr, "Bad exit status (2 pipes)\n");
- failures++;
- }
- status = pclose(fp2);
- if (!WIFEXITED(status) || WEXITSTATUS(status) != 1) {
- fprintf(stderr, "Bad exit status (2 pipes)\n");
- failures++;
- }
- }
- }
-
- if (failures == 0)
- printf("PASS popen()\n");
-
- return (failures != 0);
-}
diff --git a/tools/regression/lib/libc/gen/test-posix_spawn.c b/tools/regression/lib/libc/gen/test-posix_spawn.c
deleted file mode 100644
index f1b8d43..0000000
--- a/tools/regression/lib/libc/gen/test-posix_spawn.c
+++ /dev/null
@@ -1,90 +0,0 @@
-/*-
- * Copyright (c) 2011 Jilles Tjoelker
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-/*
- * Test program for posix_spawn() and posix_spawnp() as specified by
- * IEEE Std. 1003.1-2008.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/wait.h>
-
-#include <assert.h>
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <spawn.h>
-
-int
-main(int argc, char *argv[])
-{
- int error, status;
- pid_t pid, waitres;
- char *myargs[4];
- char *myenv[2] = { "answer=42", NULL };
-
- /* Make sure we have no child processes. */
- while (waitpid(-1, NULL, 0) != -1)
- ;
- assert(errno == ECHILD);
-
- /* Simple test. */
- myargs[0] = "sh";
- myargs[1] = "-c";
- myargs[2] = "exit $answer";
- myargs[3] = NULL;
- error = posix_spawnp(&pid, myargs[0], NULL, NULL, myargs, myenv);
- assert(error == 0);
- waitres = waitpid(pid, &status, 0);
- assert(waitres == pid);
- assert(WIFEXITED(status) && WEXITSTATUS(status) == 42);
-
- /*
- * If the executable does not exist, the function shall either fail
- * and not create a child process or succeed and create a child
- * process that exits with status 127.
- */
- myargs[0] = "/var/empty/nonexistent";
- myargs[1] = NULL;
- error = posix_spawn(&pid, myargs[0], NULL, NULL, myargs, myenv);
- if (error == 0) {
- waitres = waitpid(pid, &status, 0);
- assert(waitres == pid);
- assert(WIFEXITED(status) && WEXITSTATUS(status) == 127);
- } else {
- assert(error == ENOENT);
- waitres = waitpid(-1, NULL, 0);
- assert(waitres == -1 && errno == ECHILD);
- }
-
- printf("PASS posix_spawn()\n");
- printf("PASS posix_spawnp()\n");
-
- return (0);
-}
diff --git a/tools/regression/lib/libc/gen/test-wordexp.c b/tools/regression/lib/libc/gen/test-wordexp.c
deleted file mode 100644
index 68b1578..0000000
--- a/tools/regression/lib/libc/gen/test-wordexp.c
+++ /dev/null
@@ -1,271 +0,0 @@
-/*-
- * Copyright (c) 2003 Tim J. Robbins
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-/*
- * Test program for wordexp() and wordfree() as specified by
- * IEEE Std. 1003.1-2001.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/wait.h>
-
-#include <assert.h>
-#include <errno.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <wordexp.h>
-
-static void
-chld_handler(int x)
-{
- int status, serrno;
-
- (void)x;
- serrno = errno;
- while (waitpid(-1, &status, WNOHANG) > 0)
- ;
- errno = serrno;
-}
-
-int
-main(int argc, char *argv[])
-{
- struct sigaction sa;
- wordexp_t we;
- int r;
- int i;
- char longdata[6 * 10000 + 1];
-
- /* Test that the macros are there. */
- (void)(WRDE_APPEND + WRDE_DOOFFS + WRDE_NOCMD + WRDE_REUSE +
- WRDE_SHOWERR + WRDE_UNDEF);
- (void)(WRDE_BADCHAR + WRDE_BADVAL + WRDE_CMDSUB + WRDE_NOSPACE +
- WRDE_SYNTAX);
-
- /* Simple test. */
- r = wordexp("hello world", &we, 0);
- assert(r == 0);
- assert(we.we_wordc == 2);
- assert(strcmp(we.we_wordv[0], "hello") == 0);
- assert(strcmp(we.we_wordv[1], "world") == 0);
- assert(we.we_wordv[2] == NULL);
- wordfree(&we);
-
- /* Long output. */
- for (i = 0; i < 10000; i++)
- snprintf(longdata + 6 * i, 7, "%05d ", i);
- r = wordexp(longdata, &we, 0);
- assert(r == 0);
- assert(we.we_wordc == 10000);
- assert(we.we_wordv[10000] == NULL);
- wordfree(&we);
-
- /* WRDE_DOOFFS */
- we.we_offs = 3;
- r = wordexp("hello world", &we, WRDE_DOOFFS);
- assert(r == 0);
- assert(we.we_wordc == 2);
- assert(we.we_wordv[0] == NULL);
- assert(we.we_wordv[1] == NULL);
- assert(we.we_wordv[2] == NULL);
- assert(strcmp(we.we_wordv[3], "hello") == 0);
- assert(strcmp(we.we_wordv[4], "world") == 0);
- assert(we.we_wordv[5] == NULL);
- wordfree(&we);
-
- /* WRDE_REUSE */
- r = wordexp("hello world", &we, 0);
- r = wordexp("hello world", &we, WRDE_REUSE);
- assert(r == 0);
- assert(we.we_wordc == 2);
- assert(strcmp(we.we_wordv[0], "hello") == 0);
- assert(strcmp(we.we_wordv[1], "world") == 0);
- assert(we.we_wordv[2] == NULL);
- wordfree(&we);
-
- /* WRDE_APPEND */
- r = wordexp("this is", &we, 0);
- assert(r == 0);
- r = wordexp("a test", &we, WRDE_APPEND);
- assert(r == 0);
- assert(we.we_wordc == 4);
- assert(strcmp(we.we_wordv[0], "this") == 0);
- assert(strcmp(we.we_wordv[1], "is") == 0);
- assert(strcmp(we.we_wordv[2], "a") == 0);
- assert(strcmp(we.we_wordv[3], "test") == 0);
- assert(we.we_wordv[4] == NULL);
- wordfree(&we);
-
- /* WRDE_DOOFFS + WRDE_APPEND */
- we.we_offs = 2;
- r = wordexp("this is", &we, WRDE_DOOFFS);
- assert(r == 0);
- r = wordexp("a test", &we, WRDE_APPEND|WRDE_DOOFFS);
- assert(r == 0);
- r = wordexp("of wordexp", &we, WRDE_APPEND|WRDE_DOOFFS);
- assert(r == 0);
- assert(we.we_wordc == 6);
- assert(we.we_wordv[0] == NULL);
- assert(we.we_wordv[1] == NULL);
- assert(strcmp(we.we_wordv[2], "this") == 0);
- assert(strcmp(we.we_wordv[3], "is") == 0);
- assert(strcmp(we.we_wordv[4], "a") == 0);
- assert(strcmp(we.we_wordv[5], "test") == 0);
- assert(strcmp(we.we_wordv[6], "of") == 0);
- assert(strcmp(we.we_wordv[7], "wordexp") == 0);
- assert(we.we_wordv[8] == NULL);
- wordfree(&we);
-
- /* WRDE_UNDEF */
- r = wordexp("${dont_set_me}", &we, WRDE_UNDEF);
- assert(r == WRDE_BADVAL);
-
- /* WRDE_NOCMD */
- r = wordexp("`date`", &we, WRDE_NOCMD);
- assert(r == WRDE_CMDSUB);
- r = wordexp("\"`date`\"", &we, WRDE_NOCMD);
- assert(r == WRDE_CMDSUB);
- r = wordexp("$(date)", &we, WRDE_NOCMD);
- assert(r == WRDE_CMDSUB);
- r = wordexp("\"$(date)\"", &we, WRDE_NOCMD);
- assert(r == WRDE_CMDSUB);
- r = wordexp("$((3+5))", &we, WRDE_NOCMD);
- assert(r == 0);
- r = wordexp("\\$\\(date\\)", &we, WRDE_NOCMD|WRDE_REUSE);
- assert(r == 0);
- r = wordexp("'`date`'", &we, WRDE_NOCMD|WRDE_REUSE);
- assert(r == 0);
- r = wordexp("'$(date)'", &we, WRDE_NOCMD|WRDE_REUSE);
- assert(r == 0);
- wordfree(&we);
-
- /* WRDE_BADCHAR */
- r = wordexp("'\n|&;<>(){}'", &we, 0);
- assert(r == 0);
- r = wordexp("\"\n|&;<>(){}\"", &we, WRDE_REUSE);
- assert(r == 0);
- r = wordexp("\\\n\\|\\&\\;\\<\\>\\(\\)\\{\\}", &we, WRDE_REUSE);
- assert(r == 0);
- wordfree(&we);
- r = wordexp("test \n test", &we, 0);
- assert(r == WRDE_BADCHAR);
- r = wordexp("test | test", &we, 0);
- assert(r == WRDE_BADCHAR);
- r = wordexp("test & test", &we, 0);
- assert(r == WRDE_BADCHAR);
- r = wordexp("test ; test", &we, 0);
- assert(r == WRDE_BADCHAR);
- r = wordexp("test > test", &we, 0);
- assert(r == WRDE_BADCHAR);
- r = wordexp("test < test", &we, 0);
- assert(r == WRDE_BADCHAR);
- r = wordexp("test ( test", &we, 0);
- assert(r == WRDE_BADCHAR);
- r = wordexp("test ) test", &we, 0);
- assert(r == WRDE_BADCHAR);
- r = wordexp("test { test", &we, 0);
- assert(r == WRDE_BADCHAR);
- r = wordexp("test } test", &we, 0);
- assert(r == WRDE_BADCHAR);
-
- /* WRDE_SYNTAX */
- r = wordexp("'", &we, 0);
- assert(r == WRDE_SYNTAX);
- r = wordexp("'", &we, WRDE_UNDEF);
- assert(r == WRDE_SYNTAX);
- r = wordexp("'\\'", &we, 0);
- assert(r == 0);
- assert(we.we_wordc == 1);
- assert(strcmp(we.we_wordv[0], "\\") == 0);
- assert(we.we_wordv[1] == NULL);
- wordfree(&we);
- /* Two syntax errors that are not detected by the current we_check(). */
- r = wordexp("${IFS:+'}", &we, 0);
- assert(r == WRDE_SYNTAX);
- r = wordexp("${IFS:+'}", &we, WRDE_UNDEF);
- assert(r == WRDE_SYNTAX);
- r = wordexp("$(case)", &we, 0);
- assert(r == WRDE_SYNTAX);
- r = wordexp("$(case)", &we, WRDE_UNDEF);
- assert(r == WRDE_SYNTAX);
-
- /* With a SIGCHLD handler that reaps all zombies. */
- sa.sa_flags = 0;
- sigemptyset(&sa.sa_mask);
- sa.sa_handler = chld_handler;
- r = sigaction(SIGCHLD, &sa, NULL);
- assert(r == 0);
- r = wordexp("hello world", &we, 0);
- assert(r == 0);
- assert(we.we_wordc == 2);
- assert(strcmp(we.we_wordv[0], "hello") == 0);
- assert(strcmp(we.we_wordv[1], "world") == 0);
- assert(we.we_wordv[2] == NULL);
- wordfree(&we);
- sa.sa_handler = SIG_DFL;
- r = sigaction(SIGCHLD, &sa, NULL);
- assert(r == 0);
-
- /*
- * With IFS set to a non-default value (without depending on whether
- * IFS is inherited or not).
- */
- r = setenv("IFS", ":", 1);
- assert(r == 0);
- r = wordexp("hello world", &we, 0);
- assert(r == 0);
- assert(we.we_wordc == 2);
- assert(strcmp(we.we_wordv[0], "hello") == 0);
- assert(strcmp(we.we_wordv[1], "world") == 0);
- assert(we.we_wordv[2] == NULL);
- wordfree(&we);
- r = unsetenv("IFS");
- assert(r == 0);
-
- /*
- * With IFS set to a non-default value, and using it.
- */
- r = setenv("IFS", ":", 1);
- assert(r == 0);
- r = wordexp("${IFS+hello:world}", &we, 0);
- assert(r == 0);
- assert(we.we_wordc == 2);
- assert(strcmp(we.we_wordv[0], "hello") == 0);
- assert(strcmp(we.we_wordv[1], "world") == 0);
- assert(we.we_wordv[2] == NULL);
- wordfree(&we);
- r = unsetenv("IFS");
- assert(r == 0);
-
- printf("PASS wordexp()\n");
- printf("PASS wordfree()\n");
-
- return (0);
-}
OpenPOWER on IntegriCloud