Module Name:    src
Committed By:   christos
Date:           Sat Nov 20 14:28:29 UTC 2021

Modified Files:
        src/tests/lib/libc/gen/posix_spawn: t_spawn.c

Log Message:
Merge common code for the chdir cases (Piyush Sachdeva)
I also deduplicated some more code


To generate a diff of this commit:
cvs rdiff -u -r1.5 -r1.6 src/tests/lib/libc/gen/posix_spawn/t_spawn.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/tests/lib/libc/gen/posix_spawn/t_spawn.c
diff -u src/tests/lib/libc/gen/posix_spawn/t_spawn.c:1.5 src/tests/lib/libc/gen/posix_spawn/t_spawn.c:1.6
--- src/tests/lib/libc/gen/posix_spawn/t_spawn.c:1.5	Mon Nov 15 08:59:16 2021
+++ src/tests/lib/libc/gen/posix_spawn/t_spawn.c	Sat Nov 20 09:28:29 2021
@@ -1,7 +1,7 @@
-/* $NetBSD: t_spawn.c,v 1.5 2021/11/15 13:59:16 christos Exp $ */
+/* $NetBSD: t_spawn.c,v 1.6 2021/11/20 14:28:29 christos Exp $ */
 
 /*-
- * Copyright (c) 2012 The NetBSD Foundation, Inc.
+ * Copyright (c) 2012, 2021 The NetBSD Foundation, Inc.
  * All rights reserved.
  *
  * This code is derived from software contributed to The NetBSD Foundation
@@ -30,7 +30,7 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: t_spawn.c,v 1.5 2021/11/15 13:59:16 christos Exp $");
+__RCSID("$NetBSD: t_spawn.c,v 1.6 2021/11/20 14:28:29 christos Exp $");
 
 #include <atf-c.h>
 
@@ -87,6 +87,20 @@ ATF_TC_BODY(t_spawnp_ls, tc)
 	ATF_REQUIRE(err == 0);
 }
 
+static void
+spawn_error(const atf_tc_t *tc, const char *name, int error)
+{
+	char buf[FILENAME_MAX];
+	char * const args[] = { __UNCONST(name), NULL };
+	int err;
+
+	snprintf(buf, sizeof buf, "%s/%s",
+	    atf_tc_get_config_var(tc, "srcdir"), name);
+	err = posix_spawn(NULL, buf, NULL, NULL, args, NULL);
+	ATF_REQUIRE_MSG(err == error, "expected error %d, "
+	    "got %d when spawning %s", error, err, buf);
+}
+
 ATF_TC(t_spawn_zero);
 
 ATF_TC_HEAD(t_spawn_zero, tc)
@@ -97,13 +111,7 @@ ATF_TC_HEAD(t_spawn_zero, tc)
 
 ATF_TC_BODY(t_spawn_zero, tc)
 {
-	char buf[FILENAME_MAX];
-	char * const args[] = { __UNCONST("h_zero"), NULL };
-	int err;
-
-	snprintf(buf, sizeof buf, "%s/h_zero", atf_tc_get_config_var(tc, "srcdir"));
-	err = posix_spawn(NULL, buf, NULL, NULL, args, NULL);
-	ATF_REQUIRE_MSG(err == ENOEXEC, "expected error %d, got %d when spawning %s", ENOEXEC, err, buf);
+	spawn_error(tc, "h_zero", ENOEXEC);
 }
 
 ATF_TC(t_spawn_missing);
@@ -116,14 +124,7 @@ ATF_TC_HEAD(t_spawn_missing, tc)
 
 ATF_TC_BODY(t_spawn_missing, tc)
 {
-	char buf[FILENAME_MAX];
-	char * const args[] = { __UNCONST("h_nonexist"), NULL };
-	int err;
-
-	snprintf(buf, sizeof buf, "%s/h_nonexist",
-	    atf_tc_get_config_var(tc, "srcdir"));
-	err = posix_spawn(NULL, buf, NULL, NULL, args, NULL);
-	ATF_REQUIRE_MSG(err == ENOENT, "expected error %d, got %d when spawning %s", ENOENT, err, buf);
+	spawn_error(tc, "h_nonexist", ENOENT);
 }
 
 ATF_TC(t_spawn_nonexec);
@@ -136,14 +137,7 @@ ATF_TC_HEAD(t_spawn_nonexec, tc)
 
 ATF_TC_BODY(t_spawn_nonexec, tc)
 {
-	char buf[FILENAME_MAX];
-	char * const args[] = { __UNCONST("h_nonexec"), NULL };
-	int err;
-
-	snprintf(buf, sizeof buf, "%s/h_nonexec",
-	    atf_tc_get_config_var(tc, "srcdir"));
-	err = posix_spawn(NULL, buf, NULL, NULL, args, NULL);
-	ATF_REQUIRE_MSG(err == ENOENT, "expected error %d, got %d when spawning %s", ENOENT, err, buf);
+	spawn_error(tc, "h_nonexec", ENOENT);
 }
 
 ATF_TC(t_spawn_child);
@@ -157,38 +151,33 @@ ATF_TC_HEAD(t_spawn_child, tc)
 ATF_TC_BODY(t_spawn_child, tc)
 {
 	char buf[FILENAME_MAX];
-	char * const args0[] = { __UNCONST("h_spawn"), __UNCONST("0"), NULL };
-	char * const args1[] = { __UNCONST("h_spawn"), __UNCONST("1"), NULL };
-	char * const args7[] = { __UNCONST("h_spawn"), __UNCONST("7"), NULL };
+	char rv[2] = { '0', '\0' };
+	char * const args0[] = { __UNCONST("h_spawn"), rv, NULL };
+	int rets[] = { 0, 1, 7 };
 	int err, status;
 	pid_t pid;
 
 	snprintf(buf, sizeof buf, "%s/h_spawn",
 	    atf_tc_get_config_var(tc, "srcdir"));
 
-	err = posix_spawn(&pid, buf, NULL, NULL, args0, NULL);
-	ATF_REQUIRE(err == 0);
-	ATF_REQUIRE(pid > 0);
-	waitpid(pid, &status, 0);
-	ATF_REQUIRE(WIFEXITED(status) && WEXITSTATUS(status) == 0);
-
-	err = posix_spawn(&pid, buf, NULL, NULL, args1, NULL);
-	ATF_REQUIRE(err == 0);
-	ATF_REQUIRE(pid > 0);
-	waitpid(pid, &status, 0);
-	ATF_REQUIRE(WIFEXITED(status) && WEXITSTATUS(status) == 1);
-
-	err = posix_spawn(&pid, buf, NULL, NULL, args7, NULL);
-	ATF_REQUIRE(err == 0);
-	ATF_REQUIRE(pid > 0);
-	waitpid(pid, &status, 0);
-	ATF_REQUIRE(WIFEXITED(status) && WEXITSTATUS(status) == 7);
+	for (size_t i = 0; i < __arraycount(rets); i++) {
+		rv[0] = rets[i] + '0';
+		err = posix_spawn(&pid, buf, NULL, NULL, args0, NULL);
+		ATF_REQUIRE(err == 0);
+		ATF_REQUIRE(pid > 0);
+		waitpid(pid, &status, 0);
+		ATF_REQUIRE(WIFEXITED(status) &&
+		    WEXITSTATUS(status) == rets[i]);
+	}
 }
 
 #define CHDIRPATH "/tmp"
 #define FILENAME "output"
 #define FILEPATH "/tmp/output"
 
+#define CHDIR 1
+#define FCHDIR 2
+
 static void
 check_success(const char *file, int argc, ...)
 {
@@ -216,14 +205,15 @@ check_success(const char *file, int argc
 		dir = CHDIRPATH;
 
 	fd = open(file, O_RDONLY);
-	ATF_REQUIRE_MSG(fd != -1, "Can't open `%s' (%s)", file, strerror(errno));
+	ATF_REQUIRE_MSG(fd != -1, "Can't open `%s' (%s)", file,
+	    strerror(errno));
 
 	/*
 	 * file contains form feed i.e ASCII - 10 at the end.
 	 * Therefore sizeOfFile - 1
 	 */
 	sizeOfStr = strlen(dir);
-	ATF_CHECK_MSG(sizeOfStr == sizeOfFile - 1, "%zu (%s) != %zu (%s)", 
+	ATF_CHECK_MSG(sizeOfStr == sizeOfFile - 1, "%zu (%s) != %zu (%s)",
 	    sizeOfStr, dir, sizeOfFile - 1, file);
 
 	bytesRead = read(fd, contents, sizeOfFile - 1);
@@ -241,43 +231,100 @@ check_success(const char *file, int argc
 	ATF_REQUIRE((size_t)bytesRead == sizeOfStr);
 }
 
-ATF_TC(t_spawn_chdir_abs);
-
-ATF_TC_HEAD(t_spawn_chdir_abs, tc)
-{
-	atf_tc_set_md_var(tc, "descr",
-	    "Test posix_spawn_fa_addchdir for absolute path");
-	atf_tc_set_md_var(tc, "require.progs", "/bin/pwd");
-}
-
-ATF_TC_BODY(t_spawn_chdir_abs, tc)
+static void
+spawn_chdir(const char *dirpath, const char *filepath, int operation,
+    int expected_error)
 {
+	int error, fd=-1, status;
 	char * const args[2] = { __UNCONST("pwd"), NULL };
-	int error, status;
 	pid_t pid;
+	posix_spawnattr_t attr, *attr_p;
 	posix_spawn_file_actions_t fa;
 
-	empty_outfile(FILEPATH);
+	if (filepath)
+		empty_outfile(filepath);
 
 	error = posix_spawn_file_actions_init(&fa);
 	ATF_REQUIRE(error == 0);
 
-	error = posix_spawn_file_actions_addchdir(&fa, CHDIRPATH);
+	switch(operation) {
+	case CHDIR:
+		error = posix_spawn_file_actions_addchdir(&fa, dirpath);
+		break;
+
+	case FCHDIR:
+		fd = open(dirpath, O_RDONLY);
+		ATF_REQUIRE(fd != -1);
+
+		error = posix_spawn_file_actions_addfchdir(&fa, fd);
+		break;
+	}
 	ATF_REQUIRE(error == 0);
 
-	error = posix_spawn_file_actions_addopen(&fa, STDOUT_FILENO, FILENAME,
-			O_WRONLY, 0);
-	ATF_REQUIRE(error == 0);
-
-	error = posix_spawn(&pid, "/bin/pwd", &fa, NULL, args, NULL);
-	ATF_REQUIRE(error == 0);
+	/*
+	 * if POSIX_SPAWN_RETURNERROR is expected, then no need to open the
+	 * file
+	 */
+	if (expected_error == 0) {
+		error = posix_spawn_file_actions_addopen(&fa, STDOUT_FILENO,
+		    FILENAME, O_WRONLY, 0);
+		ATF_REQUIRE(error == 0);
+		attr_p = NULL;
+	} else {
+		error = posix_spawnattr_init(&attr);
+		ATF_REQUIRE(error == 0);
+
+		/*
+		 * POSIX_SPAWN_RETURNERROR is a NetBSD specific flag that
+		 * will cause a "proper" return value from posix_spawn(2)
+		 * instead of a (potential) success there and a 127 exit
+		 * status from the child process (c.f. the non-diag variant
+		 * of this test).
+		 */
+		error = posix_spawnattr_setflags(&attr,
+		    POSIX_SPAWN_RETURNERROR);
+		ATF_REQUIRE(error == 0);
+		attr_p = &attr;
+	}
+
+	error = posix_spawn(&pid, "/bin/pwd", &fa, attr_p, args, NULL);
+	ATF_REQUIRE(error == expected_error);
+
+	/* wait for the child to finish only when no spawnattr */
+	if (attr_p) {
+		posix_spawnattr_destroy(&attr);
+	} else {
+		waitpid(pid, &status, 0);
+		ATF_REQUIRE_MSG(WIFEXITED(status) &&
+		    WEXITSTATUS(status) == EXIT_SUCCESS,
+		    "%s", "[f]chdir failed");
+	}
 
-	/* wait for the child to finish */
-	waitpid(pid, &status, 0);
-	ATF_REQUIRE_MSG(WIFEXITED(status) && WEXITSTATUS(status) == EXIT_SUCCESS,
-	    "%s", "chdir failed");
 	posix_spawn_file_actions_destroy(&fa);
 
+	/*
+	 * The file incase of fchdir(),
+	 * should be closed before reopening in 'check_success'
+	 */
+	if (fd != -1) {
+		error = close(fd);
+		ATF_REQUIRE(error == 0);
+	}
+}
+
+ATF_TC(t_spawn_chdir_abs);
+
+ATF_TC_HEAD(t_spawn_chdir_abs, tc)
+{
+	atf_tc_set_md_var(tc, "descr",
+	    "Test posix_spawn_fa_addchdir for absolute path");
+	atf_tc_set_md_var(tc, "require.progs", "/bin/pwd");
+}
+
+ATF_TC_BODY(t_spawn_chdir_abs, tc)
+{
+	spawn_chdir(CHDIRPATH, FILEPATH, 1, 0);
+
 	/* finally cross check the output of "pwd" directory */
 	check_success(FILEPATH, 0);
 }
@@ -294,21 +341,18 @@ ATF_TC_HEAD(t_spawn_chdir_rel, tc)
 
 ATF_TC_BODY(t_spawn_chdir_rel, tc)
 {
+	int error;
 	const char *relative_dir = "ch-dir";
 	const char *testdir = getcwd(NULL, 0);
-	char * const args[2] = { __UNCONST("pwd"), NULL };
 	char *chdirwd, *filepath;
-	int error, status;
-	pid_t pid;
-	posix_spawn_file_actions_t fa;
 
 	/* cleanup previous */
 	error = asprintf(&filepath, "%s/%s", relative_dir, FILENAME);
 	ATF_CHECK(error != -1);
 	unlink(filepath);
 	free(filepath);
-	rmdir(relative_dir);
 
+	rmdir(relative_dir);
 	error = mkdir(relative_dir, 0777);
 	ATF_REQUIRE_MSG(error == 0, "mkdir `%s' (%s)", relative_dir,
 	    strerror(errno));
@@ -325,33 +369,12 @@ ATF_TC_BODY(t_spawn_chdir_rel, tc)
 	printf("filepath: %s\n", filepath);
 #endif
 
-	empty_outfile(filepath);
-
-	error = posix_spawn_file_actions_init(&fa);
-	ATF_REQUIRE(error == 0);
-
-	error = posix_spawn_file_actions_addchdir(&fa, relative_dir);
-	ATF_REQUIRE(error == 0);
-
-	error = posix_spawn_file_actions_addopen(&fa, STDOUT_FILENO, FILENAME,
-			O_WRONLY, 0);
-	ATF_REQUIRE(error == 0);
-
-	error = posix_spawn(&pid, "/bin/pwd", &fa, NULL, args, NULL);
-	ATF_REQUIRE(error == 0);
-
-	/* wait for the child to finish */
-	waitpid(pid, &status, 0);
-	ATF_REQUIRE_MSG(WIFEXITED(status) && WEXITSTATUS(status) == EXIT_SUCCESS,
-	    "%s", "chdir failed");
-	posix_spawn_file_actions_destroy(&fa);
+	spawn_chdir(relative_dir, filepath, 1, 0);
 
 	/* finally cross check the directory */
 	check_success(filepath, 1, chdirwd);
 	free(chdirwd);
 	free(filepath);
-
-	rmdir(relative_dir);
 }
 
 ATF_TC(t_spawn_chdir_file);
@@ -365,37 +388,7 @@ ATF_TC_HEAD(t_spawn_chdir_file, tc)
 
 ATF_TC_BODY(t_spawn_chdir_file, tc)
 {
-	int error;
-	pid_t pid;
-	char * const args[2] = { __UNCONST("pwd"), NULL };
-	posix_spawnattr_t attr;
-	posix_spawn_file_actions_t fa;
-
-	empty_outfile(FILEPATH);
-
-	error = posix_spawnattr_init(&attr);
-	ATF_REQUIRE(error == 0);
-	/*
-	 * POSIX_SPAWN_RETURNERROR is a NetBSD specific flag that
-	 * will cause a "proper" return value from posix_spawn(2)
-	 * instead of a (potential) success there and a 127 exit
-	 * status from the child process (c.f. the non-diag variant
-	 * of this test).
-	 */
-	error = posix_spawnattr_setflags(&attr, POSIX_SPAWN_RETURNERROR);
-	ATF_REQUIRE(error == 0);
-
-	error = posix_spawn_file_actions_init(&fa);
-	ATF_REQUIRE(error == 0);
-
-	error = posix_spawn_file_actions_addchdir(&fa, FILEPATH);
-	ATF_REQUIRE(error == 0);
-	
-	error = posix_spawn(&pid, "/bin/pwd", &fa, &attr, args, NULL);
-	ATF_REQUIRE(error == ENOTDIR);
-
-	posix_spawn_file_actions_destroy(&fa);
-	posix_spawnattr_destroy(&attr);
+	spawn_chdir(FILEPATH, FILEPATH, 1, ENOTDIR);
 
 	unlink(FILEPATH);
 }
@@ -411,36 +404,8 @@ ATF_TC_HEAD(t_spawn_chdir_invalid, tc)
 
 ATF_TC_BODY(t_spawn_chdir_invalid, tc)
 {
-	int error;
-	pid_t pid;
-	const char *dirpath = "/not/a/valid/dir";
-	char * const args[2] = { __UNCONST("pwd"), NULL };
-	posix_spawnattr_t attr;
-	posix_spawn_file_actions_t fa;
+	spawn_chdir("/not/a/valid/dir", NULL, 1, ENOENT);
 
-	error = posix_spawnattr_init(&attr);
-	ATF_REQUIRE(error == 0);
-	/*
-	 * POSIX_SPAWN_RETURNERROR is a NetBSD specific flag that
-	 * will cause a "proper" return value from posix_spawn(2)
-	 * instead of a (potential) success there and a 127 exit
-	 * status from the child process (c.f. the non-diag variant
-	 * of this test).
-	 */
-	error = posix_spawnattr_setflags(&attr, POSIX_SPAWN_RETURNERROR);
-	ATF_REQUIRE(error == 0);
-
-	error = posix_spawn_file_actions_init(&fa);
-	ATF_REQUIRE(error == 0);
-
-	error = posix_spawn_file_actions_addchdir(&fa, dirpath);
-	ATF_REQUIRE(error == 0);
-	
-	error = posix_spawn(&pid, "/bin/pwd", &fa, &attr, args, NULL);
-	ATF_REQUIRE(error == ENOENT);
-
-	posix_spawn_file_actions_destroy(&fa);
-	posix_spawnattr_destroy(&attr);
 }
 
 ATF_TC(t_spawn_chdir_permissions);
@@ -456,43 +421,16 @@ ATF_TC_HEAD(t_spawn_chdir_permissions, t
 ATF_TC_BODY(t_spawn_chdir_permissions, tc)
 {
 	int error;
-	pid_t pid;
 	const char *restrRelDir = "prohibited";
-	char * const args[2] = { __UNCONST("pwd"), NULL };
-	posix_spawnattr_t attr;
-	posix_spawn_file_actions_t fa;
 
+	rmdir(restrRelDir);
 	error = mkdir(restrRelDir, 0055);
 	ATF_REQUIRE(error == 0);
 
-	posix_spawnattr_init(&attr);
-	ATF_REQUIRE(error == 0);
-	/*
-	 * POSIX_SPAWN_RETURNERROR is a NetBSD specific flag that
-	 * will cause a "proper" return value from posix_spawn(2)
-	 * instead of a (potential) success there and a 127 exit
-	 * status from the child process (c.f. the non-diag variant
-	 * of this test).
-	 */
-	error = posix_spawnattr_setflags(&attr, POSIX_SPAWN_RETURNERROR);
-	ATF_REQUIRE(error == 0);
-
-	error = posix_spawn_file_actions_init(&fa);
-	ATF_REQUIRE(error == 0);
-
-	error = posix_spawn_file_actions_addchdir(&fa, restrRelDir);
-	ATF_REQUIRE(error == 0);
-	
-	error = posix_spawn(&pid, "/bin/pwd", &fa, &attr, args, NULL);
-	ATF_CHECK(error == EACCES);
-
-	posix_spawn_file_actions_destroy(&fa);
-	posix_spawnattr_destroy(&attr);
-
-	rmdir(restrRelDir);
+	spawn_chdir(restrRelDir, NULL, 1, EACCES);
 }
 
-	
+
 ATF_TC(t_spawn_fchdir_abs);
 
 ATF_TC_HEAD(t_spawn_fchdir_abs, tc)
@@ -503,38 +441,7 @@ ATF_TC_HEAD(t_spawn_fchdir_abs, tc)
 
 ATF_TC_BODY(t_spawn_fchdir_abs, tc)
 {
-	int error, fd, status;
-	pid_t pid;
-	char * const args[2] = { __UNCONST("pwd"), NULL };
-	posix_spawn_file_actions_t fa;
-
-	empty_outfile(FILEPATH);
-
-	fd = open(CHDIRPATH, O_RDONLY);
-	ATF_REQUIRE(fd != -1);
-
-	error = posix_spawn_file_actions_init(&fa);
-	ATF_REQUIRE(error == 0);
-
-	error = posix_spawn_file_actions_addfchdir(&fa, fd);
-	ATF_REQUIRE(error == 0);
-
-	error = posix_spawn_file_actions_addopen(&fa, STDOUT_FILENO, FILENAME,
-	    O_WRONLY, 0);
-	ATF_REQUIRE(error == 0);
-
-	error = posix_spawn(&pid, "/bin/pwd", &fa, NULL, args, NULL);
-	ATF_REQUIRE(error == 0);
-
-	/* wait for the child to finish */
-	waitpid(pid, &status, 0);
-	ATF_REQUIRE_MSG(WIFEXITED(status) && WEXITSTATUS(status) == EXIT_SUCCESS,
-	    "%s", "chdir failed");
-	posix_spawn_file_actions_destroy(&fa);
-
-	/* The file should be closed before reopening in 'check_success' */
-	error = close(fd);
-	ATF_REQUIRE(error == 0);
+	spawn_chdir(CHDIRPATH, FILEPATH, 2, 0);
 
 	/* finally cross check the directory */
 	check_success(FILEPATH, 0);
@@ -552,14 +459,12 @@ ATF_TC_HEAD(t_spawn_fchdir_rel, tc)
 
 ATF_TC_BODY(t_spawn_fchdir_rel, tc)
 {
-	int error, fd, status;
-	pid_t pid;
+	int error;
 	const char *relative_dir = "ch-dir";
 	const char *testdir = getcwd(NULL, 0);
-	char * const args[2] = { __UNCONST("pwd"), NULL };
 	char *chdirwd, *filepath;
-	posix_spawn_file_actions_t fa;
 
+	rmdir(relative_dir);
 	error = mkdir(relative_dir, 0755);
 	ATF_REQUIRE(error == 0);
 
@@ -574,39 +479,12 @@ ATF_TC_BODY(t_spawn_fchdir_rel, tc)
 	error = asprintf(&filepath, "%s/%s", chdirwd, FILENAME);
 	ATF_CHECK(error != -1);
 
-	empty_outfile(filepath);
-
-	fd = open(relative_dir, O_RDONLY);
-	ATF_REQUIRE(fd != -1);
-
-	error = posix_spawn_file_actions_init(&fa);
-	ATF_REQUIRE(error == 0);
-
-	error = posix_spawn_file_actions_addfchdir(&fa, fd);
-	ATF_REQUIRE(error == 0);
-
-	error = posix_spawn_file_actions_addopen(&fa, STDOUT_FILENO, FILENAME,
-	    O_WRONLY, 0);
-	ATF_REQUIRE(error == 0);
-
-	error = posix_spawn(&pid, "/bin/pwd", &fa, NULL, args, NULL);
-	ATF_REQUIRE(error == 0);
-
-	/* wait for the child to finish */
-	waitpid(pid, &status, 0);
-	ATF_REQUIRE_MSG(WIFEXITED(status) && WEXITSTATUS(status) == EXIT_SUCCESS,
-	    "%s", "chdir failed");
-
-	posix_spawn_file_actions_destroy(&fa);
-
-	error = close(fd);
-	ATF_REQUIRE(error == 0);
+	spawn_chdir(relative_dir, filepath, 2, 0);
 
 	/* finally cross check the directory */
 	check_success(filepath, 1, chdirwd);
 	free(chdirwd);
 	free(filepath);
-	rmdir(relative_dir);
 }
 
 ATF_TC(t_spawn_fchdir_file);
@@ -621,43 +499,17 @@ ATF_TC_HEAD(t_spawn_fchdir_file, tc)
 
 ATF_TC_BODY(t_spawn_fchdir_file, tc)
 {
-	int error, fd; 
-	pid_t pid;
-	char * const args[2] = { __UNCONST("pwd"), NULL };
-	posix_spawnattr_t attr;
-	posix_spawn_file_actions_t fa;
+	int error, fd;
 
 	fd = open(FILEPATH, O_WRONLY | O_CREAT | O_TRUNC, 0644);
 	ATF_REQUIRE_MSG(fd != -1, "Can't open `%s' (%s)", FILEPATH,
 	    strerror(errno));
 
-	error = posix_spawnattr_init(&attr);
-	ATF_REQUIRE(error == 0);
-	/*
-	 * POSIX_SPAWN_RETURNERROR is a NetBSD specific flag that
-	 * will cause a "proper" return value from posix_spawn(2)
-	 * instead of a (potential) success there and a 127 exit
-	 * status from the child process (c.f. the non-diag variant
-	 * of this test).
-	 */
-	error = posix_spawnattr_setflags(&attr, POSIX_SPAWN_RETURNERROR);
-	ATF_REQUIRE(error == 0);
-
-	error = posix_spawn_file_actions_init(&fa);
-	ATF_REQUIRE(error == 0);
-
-	error = posix_spawn_file_actions_addfchdir(&fa, fd);
-	ATF_REQUIRE(error == 0);
-
-	error = posix_spawn(&pid, "/bin/pwd", &fa, &attr, args, NULL);
-	ATF_CHECK(error == ENOTDIR);
-
-	posix_spawn_file_actions_destroy(&fa);
-	posix_spawnattr_destroy(&attr);
-
 	error = close(fd);
 	ATF_REQUIRE(error == 0);
 
+	spawn_chdir(FILEPATH, NULL, 2, ENOTDIR);
+
 	unlink(FILEPATH);
 
 }

Reply via email to