Module Name: src
Committed By: christos
Date: Mon Nov 15 13:59:16 UTC 2021
Modified Files:
src/tests/lib/libc/gen/posix_spawn: t_spawn.c
Log Message:
Add missing test
To generate a diff of this commit:
cvs rdiff -u -r1.4 -r1.5 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.4 src/tests/lib/libc/gen/posix_spawn/t_spawn.c:1.5
--- src/tests/lib/libc/gen/posix_spawn/t_spawn.c:1.4 Sun Nov 7 10:46:20 2021
+++ src/tests/lib/libc/gen/posix_spawn/t_spawn.c Mon Nov 15 08:59:16 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: t_spawn.c,v 1.4 2021/11/07 15:46:20 christos Exp $ */
+/* $NetBSD: t_spawn.c,v 1.5 2021/11/15 13:59:16 christos Exp $ */
/*-
* Copyright (c) 2012 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_spawn.c,v 1.4 2021/11/07 15:46:20 christos Exp $");
+__RCSID("$NetBSD: t_spawn.c,v 1.5 2021/11/15 13:59:16 christos Exp $");
#include <atf-c.h>
@@ -193,7 +193,8 @@ static void
check_success(const char *file, int argc, ...)
{
va_list ap;
- int bytesRead, fd;
+ ssize_t bytesRead;
+ int fd;
size_t sizeOfFile = (size_t)filesize(file);
size_t sizeOfStr;
char *contents;
@@ -204,7 +205,7 @@ check_success(const char *file, int argc
/*
* for now only 1 variadic argument expected
- * only from t_spawn_chdir_rel
+ * only from t_spawn_[f]chdir_rel
*/
if (argc != 0) {
va_start(ap, argc);
@@ -237,7 +238,7 @@ check_success(const char *file, int argc
free(contents);
/* XXX not really required */
- ATF_REQUIRE(bytesRead = sizeOfStr);
+ ATF_REQUIRE((size_t)bytesRead == sizeOfStr);
}
ATF_TC(t_spawn_chdir_abs);
@@ -492,15 +493,15 @@ ATF_TC_BODY(t_spawn_chdir_permissions, t
}
-ATF_TC(t_spawn_fchdir);
+ATF_TC(t_spawn_fchdir_abs);
-ATF_TC_HEAD(t_spawn_fchdir, tc)
+ATF_TC_HEAD(t_spawn_fchdir_abs, tc)
{
atf_tc_set_md_var(tc, "descr", "Test posix_spawn_fa_fchdir");
atf_tc_set_md_var(tc, "require.progs", "/bin/pwd");
}
-ATF_TC_BODY(t_spawn_fchdir, tc)
+ATF_TC_BODY(t_spawn_fchdir_abs, tc)
{
int error, fd, status;
pid_t pid;
@@ -510,7 +511,7 @@ ATF_TC_BODY(t_spawn_fchdir, tc)
empty_outfile(FILEPATH);
fd = open(CHDIRPATH, O_RDONLY);
- ATF_REQUIRE(fd >= 0);
+ ATF_REQUIRE(fd != -1);
error = posix_spawn_file_actions_init(&fa);
ATF_REQUIRE(error == 0);
@@ -539,59 +540,99 @@ ATF_TC_BODY(t_spawn_fchdir, tc)
check_success(FILEPATH, 0);
}
-ATF_TC(t_spawn_fchdir_neg_fd);
+ATF_TC(t_spawn_fchdir_rel);
-ATF_TC_HEAD(t_spawn_fchdir_neg_fd, tc)
+ATF_TC_HEAD(t_spawn_fchdir_rel, tc)
{
atf_tc_set_md_var(tc, "descr",
- "Testing posix_spawn_file_actions_addfchdir on a negative file "
- "descriptor");
+ "Testing posix_spawn_file_actions_addfchdir on a relative "
+ "directory");
atf_tc_set_md_var(tc, "require.progs", "/bin/pwd");
}
-ATF_TC_BODY(t_spawn_fchdir_neg_fd, tc)
+ATF_TC_BODY(t_spawn_fchdir_rel, tc)
{
- int error, fd;
+ int error, fd, status;
+ pid_t pid;
+ 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;
- fd = -1;
+ error = mkdir(relative_dir, 0755);
+ ATF_REQUIRE(error == 0);
+
+ /*
+ * This is done in parts purposely.
+ * It enbales the abs path of the relative dir
+ * to be passed to 'check_success()' for comparing
+ */
+ error = asprintf(&chdirwd, "%s/%s", testdir, relative_dir);
+ ATF_CHECK(error != -1);
+
+ 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 == EBADF);
+ 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);
+
+ /* finally cross check the directory */
+ check_success(filepath, 1, chdirwd);
+ free(chdirwd);
+ free(filepath);
+ rmdir(relative_dir);
}
-ATF_TC(t_spawn_fchdir_closed);
+ATF_TC(t_spawn_fchdir_file);
-ATF_TC_HEAD(t_spawn_fchdir_closed, tc)
+ATF_TC_HEAD(t_spawn_fchdir_file, tc)
{
atf_tc_set_md_var(tc, "descr",
- "Testing posix_spawn_file_actions_addfchdir for a closed fd");
+ "Testing posix_spawn_file_actions_addfchdir on a "
+ "regular file (not a directory)");
atf_tc_set_md_var(tc, "require.progs", "/bin/pwd");
}
-ATF_TC_BODY(t_spawn_fchdir_closed, tc)
+ATF_TC_BODY(t_spawn_fchdir_file, tc)
{
- int error, fd;
+ int error, fd;
pid_t pid;
char * const args[2] = { __UNCONST("pwd"), NULL };
posix_spawnattr_t attr;
posix_spawn_file_actions_t fa;
- /*
- * fd = open(CHDIRPATH, O_RDONLY);
- * ATF_REQUIRE(fd >= 0);
- * error = close(fd);
- * ATF_REQUIRE(error == 0);
- */
- fd = 3;
+ 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_CHECK(error == 0);
+ ATF_REQUIRE(error == 0);
/*
* POSIX_SPAWN_RETURNERROR is a NetBSD specific flag that
* will cause a "proper" return value from posix_spawn(2)
@@ -609,36 +650,64 @@ ATF_TC_BODY(t_spawn_fchdir_closed, tc)
ATF_REQUIRE(error == 0);
error = posix_spawn(&pid, "/bin/pwd", &fa, &attr, args, NULL);
- ATF_REQUIRE(error == EBADF);
+ ATF_CHECK(error == ENOTDIR);
posix_spawn_file_actions_destroy(&fa);
posix_spawnattr_destroy(&attr);
+
+ error = close(fd);
+ ATF_REQUIRE(error == 0);
+
+ unlink(FILEPATH);
+
}
-ATF_TC(t_spawn_fchdir_file);
+ATF_TC(t_spawn_fchdir_neg_fd);
-ATF_TC_HEAD(t_spawn_fchdir_file, tc)
+ATF_TC_HEAD(t_spawn_fchdir_neg_fd, tc)
{
atf_tc_set_md_var(tc, "descr",
- "Testing posix_spawn_file_actions_addfchdir on a "
- "regular file (not a directory)");
+ "Testing posix_spawn_file_actions_addfchdir on a negative file "
+ "descriptor");
atf_tc_set_md_var(tc, "require.progs", "/bin/pwd");
}
-ATF_TC_BODY(t_spawn_fchdir_file, tc)
+ATF_TC_BODY(t_spawn_fchdir_neg_fd, tc)
{
- int error, fd;
+ int error, fd;
+ posix_spawn_file_actions_t fa;
+
+ fd = -1;
+
+ error = posix_spawn_file_actions_init(&fa);
+ ATF_REQUIRE(error == 0);
+
+ error = posix_spawn_file_actions_addfchdir(&fa, fd);
+ ATF_REQUIRE(error == EBADF);
+
+ posix_spawn_file_actions_destroy(&fa);
+}
+
+ATF_TC(t_spawn_fchdir_closed);
+
+ATF_TC_HEAD(t_spawn_fchdir_closed, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Testing posix_spawn_file_actions_addfchdir for a closed fd");
+ atf_tc_set_md_var(tc, "require.progs", "/bin/pwd");
+}
+
+ATF_TC_BODY(t_spawn_fchdir_closed, tc)
+{
+ int error, fd;
pid_t pid;
char * const args[2] = { __UNCONST("pwd"), NULL };
posix_spawnattr_t attr;
posix_spawn_file_actions_t fa;
- fd = open(FILEPATH, O_WRONLY | O_CREAT | O_TRUNC, 0644);
- ATF_REQUIRE_MSG(fd != -1, "Can't open `%s' (%s)", FILEPATH,
- strerror(errno));
-
+ fd = 3;
error = posix_spawnattr_init(&attr);
- ATF_REQUIRE(error == 0);
+ ATF_CHECK(error == 0);
/*
* POSIX_SPAWN_RETURNERROR is a NetBSD specific flag that
* will cause a "proper" return value from posix_spawn(2)
@@ -656,16 +725,10 @@ ATF_TC_BODY(t_spawn_fchdir_file, tc)
ATF_REQUIRE(error == 0);
error = posix_spawn(&pid, "/bin/pwd", &fa, &attr, args, NULL);
- ATF_CHECK(error == ENOTDIR);
+ ATF_REQUIRE(error == EBADF);
posix_spawn_file_actions_destroy(&fa);
posix_spawnattr_destroy(&attr);
-
- error = close(fd);
- ATF_REQUIRE(error == 0);
-
- unlink(FILEPATH);
-
}
#undef CHDIRPATH
@@ -685,10 +748,11 @@ ATF_TP_ADD_TCS(tp)
ATF_TP_ADD_TC(tp, t_spawn_chdir_file);
ATF_TP_ADD_TC(tp, t_spawn_chdir_invalid);
ATF_TP_ADD_TC(tp, t_spawn_chdir_permissions);
- ATF_TP_ADD_TC(tp, t_spawn_fchdir);
+ ATF_TP_ADD_TC(tp, t_spawn_fchdir_abs);
+ ATF_TP_ADD_TC(tp, t_spawn_fchdir_rel);
+ ATF_TP_ADD_TC(tp, t_spawn_fchdir_file);
ATF_TP_ADD_TC(tp, t_spawn_fchdir_neg_fd);
ATF_TP_ADD_TC(tp, t_spawn_fchdir_closed);
- ATF_TP_ADD_TC(tp, t_spawn_fchdir_file);
return atf_no_error();
}