Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 23 Nov 2015 10:53:01 +0000 (UTC)
From:      Garrett Cooper <ngie@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org
Subject:   svn commit: r291190 - stable/10/lib/libc/tests/gen
Message-ID:  <201511231053.tANAr1U4029577@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: ngie
Date: Mon Nov 23 10:53:01 2015
New Revision: 291190
URL: https://svnweb.freebsd.org/changeset/base/291190

Log:
  MFC r290572,r290646,r290848,r290849:
  
  r290572:
  
  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.
  
  Sponsored by: EMC / Isilon Storage Division
  
  r290646:
  
  Add missing licensing boilerplate to test-fnmatch.c
  
  Carry over licensing author info from fnmatch_test.c (jilles@)
  
  Sponsored by: EMC / Isilon Storage Division
  
  r290848:
  
  Fix -Wunused warnings
  
  Sponsored by: EMC / Isilon Storage Division
  
  r290849:
  
  Fix -Wmissing-braces warnings by adding braces around all the
  testcase inputs
  
  Sponsored by: EMC / Isilon Storage Division

Added:
  stable/10/lib/libc/tests/gen/fmtcheck_test.c
     - copied unchanged from r290572, head/lib/libc/tests/gen/fmtcheck_test.c
  stable/10/lib/libc/tests/gen/fmtmsg_test.c
     - copied unchanged from r290572, head/lib/libc/tests/gen/fmtmsg_test.c
  stable/10/lib/libc/tests/gen/fnmatch_test.c
     - copied unchanged from r290572, head/lib/libc/tests/gen/fnmatch_test.c
  stable/10/lib/libc/tests/gen/fnmatch_testcases.h
     - copied, changed from r290572, head/lib/libc/tests/gen/fnmatch_testcases.h
  stable/10/lib/libc/tests/gen/ftw_test.c
     - copied, changed from r290572, head/lib/libc/tests/gen/ftw_test.c
  stable/10/lib/libc/tests/gen/popen_test.c
     - copied, changed from r290572, head/lib/libc/tests/gen/popen_test.c
  stable/10/lib/libc/tests/gen/posix_spawn_test.c
     - copied unchanged from r290572, head/lib/libc/tests/gen/posix_spawn_test.c
  stable/10/lib/libc/tests/gen/test-fnmatch.c
     - copied, changed from r290572, head/lib/libc/tests/gen/test-fnmatch.c
  stable/10/lib/libc/tests/gen/wordexp_test.c
     - copied unchanged from r290572, head/lib/libc/tests/gen/wordexp_test.c
Modified:
  stable/10/lib/libc/tests/gen/Makefile
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/lib/libc/tests/gen/Makefile
==============================================================================
--- stable/10/lib/libc/tests/gen/Makefile	Mon Nov 23 10:09:59 2015	(r291189)
+++ stable/10/lib/libc/tests/gen/Makefile	Mon Nov 23 10:53:01 2015	(r291190)
@@ -4,8 +4,15 @@
 
 TESTSDIR=	${TESTSBASE}/lib/libc/gen
 
-ATF_TESTS_C=		arc4random_test
+ATF_TESTS_C+=		arc4random_test
+ATF_TESTS_C+=		fmtcheck2_test
+ATF_TESTS_C+=		fmtmsg_test
+ATF_TESTS_C+=		fnmatch2_test
 ATF_TESTS_C+=		fpclassify2_test
+ATF_TESTS_C+=		ftw_test
+ATF_TESTS_C+=		popen_test
+ATF_TESTS_C+=		posix_spawn_test
+ATF_TESTS_C+=		wordexp_test
 
 # TODO: t_closefrom, t_cpuset, t_fmtcheck, t_randomid, t_sleep
 # TODO: t_siginfo (fixes require further inspection)
@@ -55,7 +62,25 @@ DPADD.nice_test+=	${LIBPTHREAD}
 LDADD.syslog_test+=	-lpthread
 DPADD.syslog_test+=	${LIBPTHREAD}
 
+CFLAGS+=		-I${.CURDIR}
+
+SRCS.fmtcheck2_test=	fmtcheck_test.c
+SRCS.fnmatch2_test=	fnmatch_test.c
+
 TESTS_SUBDIRS=	execve
 TESTS_SUBDIRS+=	posix_spawn
 
+# The old testcase name
+TEST_FNMATCH=	test-fnmatch
+CLEANFILES+=		${GEN_SH_CASE_TESTCASES}
+sh-tests: .PHONY
+.for target in clean obj depend all
+	@cd ${.CURDIR} && ${MAKE} PROG=${TEST_FNMATCH} \
+	    -DNO_SUBDIR ${target}
+.endfor
+	@cd ${.OBJDIR} && ./${TEST_FNMATCH} -s 1 > \
+	    ${SRCTOP}/bin/sh/tests/builtins/case2.0
+	@cd ${.OBJDIR} && ./${TEST_FNMATCH} -s 2 > \
+	    ${SRCTOP}/bin/sh/tests/builtins/case3.0
+
 .include <bsd.test.mk>

Copied: stable/10/lib/libc/tests/gen/fmtcheck_test.c (from r290572, head/lib/libc/tests/gen/fmtcheck_test.c)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ stable/10/lib/libc/tests/gen/fmtcheck_test.c	Mon Nov 23 10:53:01 2015	(r291190, copy of r290572, head/lib/libc/tests/gen/fmtcheck_test.c)
@@ -0,0 +1,105 @@
+/*	$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 <sys/param.h>
+#include <err.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <atf-c.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 },
+};
+
+ATF_TC_WITHOUT_HEAD(fmtcheck_test);
+ATF_TC_BODY(fmtcheck_test, tc)
+{
+	int i;
+	const char *f, *cf, *f1, *f2;
+
+	for (i = 0; i < nitems(test_fmts); 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;
+		ATF_CHECK_MSG(f == cf,
+		    "Test %d: (%s) vs. (%s) failed "
+		    "(should have returned %s)", i + 1, f1, f2,
+		    (test_fmts[i].correct == 1) ? "1st" : "2nd");
+	}
+}
+
+ATF_TP_ADD_TCS(tp)
+{
+
+	ATF_TP_ADD_TC(tp, fmtcheck_test);
+
+	return (atf_no_error());
+}

Copied: stable/10/lib/libc/tests/gen/fmtmsg_test.c (from r290572, head/lib/libc/tests/gen/fmtmsg_test.c)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ stable/10/lib/libc/tests/gen/fmtmsg_test.c	Mon Nov 23 10:53:01 2015	(r291190, copy of r290572, head/lib/libc/tests/gen/fmtmsg_test.c)
@@ -0,0 +1,252 @@
+/*-
+ * 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/param.h>
+#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>
+
+#include <atf-c.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);
+}
+
+ATF_TC_WITHOUT_HEAD(fmtmsg_test);
+ATF_TC_BODY(fmtmsg_test, tc)
+{
+	char *result;
+	struct testcase *t;
+	int i;
+
+	for (i = 0; i < nitems(testcases); 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);
+		ATF_CHECK_MSG(result != NULL, "testcase %d failed", i + 1);
+		if (result != NULL)
+			ATF_CHECK_MSG(strcmp(result, t->result) == 0,
+			    "results for testcase %d didn't match; "
+			    "`%s` != `%s`", i + 1, result, t->result);
+		free(result);
+	}
+}
+
+ATF_TP_ADD_TCS(tp)
+{
+
+	ATF_TP_ADD_TC(tp, fmtmsg_test);
+
+	return (atf_no_error());
+}

Copied: stable/10/lib/libc/tests/gen/fnmatch_test.c (from r290572, head/lib/libc/tests/gen/fnmatch_test.c)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ stable/10/lib/libc/tests/gen/fnmatch_test.c	Mon Nov 23 10:53:01 2015	(r291190, copy of r290572, head/lib/libc/tests/gen/fnmatch_test.c)
@@ -0,0 +1,188 @@
+/*-
+ * 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 <sys/param.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <atf-c.h>
+
+#include "fnmatch_testcases.h"
+
+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;
+}
+
+ATF_TC_WITHOUT_HEAD(fnmatch_test);
+ATF_TC_BODY(fnmatch_test, tc)
+{
+	size_t i;
+	int flags, result;
+	struct testcase *t;
+
+	for (i = 0; i < nitems(testcases); i++) {
+		t = &testcases[i];
+		flags = t->flags;
+		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;
+			}
+			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;
+			}
+			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;
+			}
+			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;
+			}
+			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;
+			}
+			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;
+			}
+			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;
+			}
+			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;
+			}
+			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;
+			}
+		} while (0);
+
+		ATF_CHECK(result == t->result);
+		if (result == t->result)
+			printf("fnmatch(\"%s\", \"%s\", %s) == %d\n",
+			    t->pattern, t->string, flags_to_string(flags), result);
+		else
+			printf("fnmatch(\"%s\", \"%s\", %s) != %d (was %d)\n",
+			    t->pattern, t->string, flags_to_string(flags),
+			    t->result, result);
+	}
+
+}
+
+ATF_TP_ADD_TCS(tp)
+{
+
+	ATF_TP_ADD_TC(tp, fnmatch_test);
+
+	return (atf_no_error());
+}

Copied and modified: stable/10/lib/libc/tests/gen/fnmatch_testcases.h (from r290572, head/lib/libc/tests/gen/fnmatch_testcases.h)
==============================================================================
--- head/lib/libc/tests/gen/fnmatch_testcases.h	Mon Nov  9 06:24:11 2015	(r290572, copy source)
+++ stable/10/lib/libc/tests/gen/fnmatch_testcases.h	Mon Nov 23 10:53:01 2015	(r291190)
@@ -35,142 +35,142 @@ struct testcase {
 	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,
+	{ "", "", 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 },
 };

Copied and modified: stable/10/lib/libc/tests/gen/ftw_test.c (from r290572, head/lib/libc/tests/gen/ftw_test.c)
==============================================================================
--- head/lib/libc/tests/gen/ftw_test.c	Mon Nov  9 06:24:11 2015	(r290572, copy source)
+++ stable/10/lib/libc/tests/gen/ftw_test.c	Mon Nov 23 10:53:01 2015	(r291190)
@@ -49,7 +49,6 @@ extern char **environ;
 
 static char template[] = "testftw.XXXXXXXXXX";
 static char dir[PATH_MAX];
-static int failures;
 static int ftwflags;
 
 static int

Copied and modified: stable/10/lib/libc/tests/gen/popen_test.c (from r290572, head/lib/libc/tests/gen/popen_test.c)
==============================================================================
--- head/lib/libc/tests/gen/popen_test.c	Mon Nov  9 06:24:11 2015	(r290572, copy source)
+++ stable/10/lib/libc/tests/gen/popen_test.c	Mon Nov 23 10:53:01 2015	(r291190)
@@ -71,7 +71,7 @@ check_cloexec(FILE *fp, const char *mode
 ATF_TC_WITHOUT_HEAD(popen_all_modes_test);
 ATF_TC_BODY(popen_all_modes_test, tc)
 {
-	FILE *fp, *fp2;
+	FILE *fp;
 	int i, status;
 	const char *mode;
 	const char *allmodes[] = { "r", "w", "r+", "re", "we", "r+e", "re+" };
@@ -92,7 +92,7 @@ ATF_TC_BODY(popen_all_modes_test, tc)
 ATF_TC_WITHOUT_HEAD(popen_rmodes_test);
 ATF_TC_BODY(popen_rmodes_test, tc)
 {
-	FILE *fp, *fp2;
+	FILE *fp;
 	const char *rmodes[] = { "r", "r+", "re", "r+e", "re+" };
 	const char *mode;
 	char buf[80];
@@ -211,7 +211,7 @@ ATF_TC_WITHOUT_HEAD(popen_rwmodes_test);
 ATF_TC_BODY(popen_rwmodes_test, tc)
 {
 	const char *rwmodes[] = { "r+", "r+e", "re+" };
-	FILE *fp, *fp2;
+	FILE *fp;
 	const char *mode;
 	char *sres;
 	char buf[80];

Copied: stable/10/lib/libc/tests/gen/posix_spawn_test.c (from r290572, head/lib/libc/tests/gen/posix_spawn_test.c)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ stable/10/lib/libc/tests/gen/posix_spawn_test.c	Mon Nov 23 10:53:01 2015	(r291190, copy of r290572, head/lib/libc/tests/gen/posix_spawn_test.c)
@@ -0,0 +1,103 @@
+/*-
+ * 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 <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <spawn.h>
+
+#include <atf-c.h>
+
+char *myenv[2] = { "answer=42", NULL };
+
+ATF_TC_WITHOUT_HEAD(posix_spawn_simple_test);
+ATF_TC_BODY(posix_spawn_simple_test, tc)
+{
+	char *myargs[4];
+	int error, status;
+	pid_t pid, waitres;
+
+	/* Make sure we have no child processes. */
+	while (waitpid(-1, NULL, 0) != -1)
+		;
+	ATF_REQUIRE_MSG(errno == ECHILD, "errno was not ECHILD: %d", errno);
+
+	/* 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);
+	ATF_REQUIRE(error == 0);
+	waitres = waitpid(pid, &status, 0);
+	ATF_REQUIRE(waitres == pid);
+	ATF_REQUIRE(WIFEXITED(status) && WEXITSTATUS(status) == 42);
+}
+
+ATF_TC_WITHOUT_HEAD(posix_spawn_no_such_command_negative_test);
+ATF_TC_BODY(posix_spawn_no_such_command_negative_test, tc)
+{
+	char *myargs[4];
+	int error, status;
+	pid_t pid, waitres;
+

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201511231053.tANAr1U4029577>