Module Name: src
Committed By: riastradh
Date: Sun Mar 16 15:35:37 UTC 2025
Modified Files:
src/tests/lib/libc/gen/posix_spawn: fa_spawn_utils.c fa_spawn_utils.h
t_fileactions.c t_spawn.c t_spawnattr.c
Log Message:
tests/lib/libc/gen/posix_spawn: Spruce up a bit.
- KNF
- Don't touch files outside the test working directory.
- No need to pre-clean files -- atf gives us an empty tempdir.
- Use h_macros.h to simplify a lot of checks.
- Use names for enumerated arguments, not magic numbers.
- Check some more syscalls.
- Add include guard.
To generate a diff of this commit:
cvs rdiff -u -r1.1 -r1.2 src/tests/lib/libc/gen/posix_spawn/fa_spawn_utils.c \
src/tests/lib/libc/gen/posix_spawn/fa_spawn_utils.h
cvs rdiff -u -r1.7 -r1.8 src/tests/lib/libc/gen/posix_spawn/t_fileactions.c
cvs rdiff -u -r1.11 -r1.12 src/tests/lib/libc/gen/posix_spawn/t_spawn.c
cvs rdiff -u -r1.6 -r1.7 src/tests/lib/libc/gen/posix_spawn/t_spawnattr.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/fa_spawn_utils.c
diff -u src/tests/lib/libc/gen/posix_spawn/fa_spawn_utils.c:1.1 src/tests/lib/libc/gen/posix_spawn/fa_spawn_utils.c:1.2
--- src/tests/lib/libc/gen/posix_spawn/fa_spawn_utils.c:1.1 Sun Nov 7 15:46:20 2021
+++ src/tests/lib/libc/gen/posix_spawn/fa_spawn_utils.c Sun Mar 16 15:35:36 2025
@@ -1,4 +1,4 @@
-/* $NetBSD: fa_spawn_utils.c,v 1.1 2021/11/07 15:46:20 christos Exp $ */
+/* $NetBSD: fa_spawn_utils.c,v 1.2 2025/03/16 15:35:36 riastradh Exp $ */
/*-
* Copyright (c) 2012 The NetBSD Foundation, Inc.
@@ -29,34 +29,34 @@
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
+
#include <sys/cdefs.h>
-__RCSID("$NetBSD: fa_spawn_utils.c,v 1.1 2021/11/07 15:46:20 christos Exp $");
+__RCSID("$NetBSD: fa_spawn_utils.c,v 1.2 2025/03/16 15:35:36 riastradh Exp $");
+
+#include <sys/stat.h>
#include <atf-c.h>
-#include <stdio.h>
#include <errno.h>
+#include <stdio.h>
#include <string.h>
-#include <sys/stat.h>
#include "fa_spawn_utils.h"
+#include "h_macros.h"
off_t
-filesize(const char * restrict fname)
+filesize(const char *fname)
{
struct stat st;
- int err;
- err = stat(fname, &st);
- ATF_REQUIRE_MSG(err == 0, "Can't stat %s (%s)", fname, strerror(errno));
+ RL(stat(fname, &st));
return st.st_size;
}
void
-empty_outfile(const char * restrict fname)
+empty_outfile(const char *fname)
{
FILE *f;
- f = fopen(fname, "w");
- ATF_REQUIRE_MSG(f != NULL, "Can't open %s (%s)", fname, strerror(errno));
- fclose(f);
+ REQUIRE_LIBC(f = fopen(fname, "w"), NULL);
+ REQUIRE_LIBC(fclose(f), EOF);
}
Index: src/tests/lib/libc/gen/posix_spawn/fa_spawn_utils.h
diff -u src/tests/lib/libc/gen/posix_spawn/fa_spawn_utils.h:1.1 src/tests/lib/libc/gen/posix_spawn/fa_spawn_utils.h:1.2
--- src/tests/lib/libc/gen/posix_spawn/fa_spawn_utils.h:1.1 Sun Nov 7 15:46:20 2021
+++ src/tests/lib/libc/gen/posix_spawn/fa_spawn_utils.h Sun Mar 16 15:35:36 2025
@@ -1,3 +1,5 @@
+/* $NetBSD: fa_spawn_utils.h,v 1.2 2025/03/16 15:35:36 riastradh Exp $ */
+
/*-
* Copyright (c) 2012 The NetBSD Foundation, Inc.
* All rights reserved.
@@ -27,5 +29,11 @@
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
-off_t filesize(const char * restrict);
-void empty_outfile(const char * restrict);
+
+#ifndef FA_SPAWN_UTILS_H
+#define FA_SPAWN_UTILS_H
+
+off_t filesize(const char *);
+void empty_outfile(const char *);
+
+#endif
Index: src/tests/lib/libc/gen/posix_spawn/t_fileactions.c
diff -u src/tests/lib/libc/gen/posix_spawn/t_fileactions.c:1.7 src/tests/lib/libc/gen/posix_spawn/t_fileactions.c:1.8
--- src/tests/lib/libc/gen/posix_spawn/t_fileactions.c:1.7 Sun Nov 7 15:46:20 2021
+++ src/tests/lib/libc/gen/posix_spawn/t_fileactions.c Sun Mar 16 15:35:36 2025
@@ -1,4 +1,4 @@
-/* $NetBSD: t_fileactions.c,v 1.7 2021/11/07 15:46:20 christos Exp $ */
+/* $NetBSD: t_fileactions.c,v 1.8 2025/03/16 15:35:36 riastradh Exp $ */
/*-
* Copyright (c) 2012 The NetBSD Foundation, Inc.
@@ -29,34 +29,24 @@
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
-#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_fileactions.c,v 1.7 2021/11/07 15:46:20 christos Exp $");
-
-#include <atf-c.h>
+#include <sys/cdefs.h>
+__RCSID("$NetBSD: t_fileactions.c,v 1.8 2025/03/16 15:35:36 riastradh Exp $");
-#include <sys/wait.h>
#include <sys/stat.h>
+#include <sys/wait.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
+#include <atf-c.h>
#include <errno.h>
#include <fcntl.h>
#include <spawn.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
#include <unistd.h>
#include "fa_spawn_utils.h"
-
-
-ATF_TC(t_spawn_openmode);
-
-ATF_TC_HEAD(t_spawn_openmode, tc)
-{
- atf_tc_set_md_var(tc, "descr",
- "Test the proper handling of 'mode' for 'open' fileactions");
- atf_tc_set_md_var(tc, "require.progs", "/bin/cat");
-}
+#include "h_macros.h"
#define TESTFILE "./the_input_data"
#define CHECKFILE "./the_output_data"
@@ -66,18 +56,24 @@ static void
make_testfile(const char *restrict file)
{
FILE *f;
- size_t written;
+ ssize_t written;
- f = fopen(file, "w");
- ATF_REQUIRE(f != NULL);
- written = fwrite(TESTCONTENT, 1, strlen(TESTCONTENT), f);
- fclose(f);
- ATF_REQUIRE(written == strlen(TESTCONTENT));
+ REQUIRE_LIBC(f = fopen(file, "w"), NULL);
+ RL(written = fwrite(TESTCONTENT, 1, strlen(TESTCONTENT), f));
+ REQUIRE_LIBC(fclose(f), EOF);
+ ATF_REQUIRE((size_t)written == strlen(TESTCONTENT));
}
+ATF_TC(t_spawn_openmode);
+ATF_TC_HEAD(t_spawn_openmode, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Test the proper handling of 'mode' for 'open' fileactions");
+ atf_tc_set_md_var(tc, "require.progs", "/bin/cat");
+}
ATF_TC_BODY(t_spawn_openmode, tc)
{
- int status, err;
+ int status;
pid_t pid;
size_t insize, outsize;
char * const args[2] = { __UNCONST("cat"), NULL };
@@ -87,27 +83,28 @@ ATF_TC_BODY(t_spawn_openmode, tc)
* try a "cat < testfile > checkfile"
*/
make_testfile(TESTFILE);
- unlink(CHECKFILE);
- posix_spawn_file_actions_init(&fa);
- posix_spawn_file_actions_addopen(&fa, fileno(stdin),
- TESTFILE, O_RDONLY, 0);
- posix_spawn_file_actions_addopen(&fa, fileno(stdout),
- CHECKFILE, O_WRONLY|O_CREAT, 0600);
- err = posix_spawn(&pid, "/bin/cat", &fa, NULL, args, NULL);
- posix_spawn_file_actions_destroy(&fa);
-
- ATF_REQUIRE(err == 0);
+ RZ(posix_spawn_file_actions_init(&fa));
+ RZ(posix_spawn_file_actions_addopen(&fa, fileno(stdin),
+ TESTFILE, O_RDONLY, 0));
+ RZ(posix_spawn_file_actions_addopen(&fa, fileno(stdout),
+ CHECKFILE, O_WRONLY|O_CREAT, 0600));
+ RZ(posix_spawn(&pid, "/bin/cat", &fa, NULL, args, NULL));
+ RZ(posix_spawn_file_actions_destroy(&fa));
/* ok, wait for the child to finish */
- waitpid(pid, &status, 0);
- ATF_REQUIRE(WIFEXITED(status) && WEXITSTATUS(status) == EXIT_SUCCESS);
+ RL(waitpid(pid, &status, 0));
+ ATF_REQUIRE_MSG((WIFEXITED(status) &&
+ WEXITSTATUS(status) == EXIT_SUCCESS),
+ "status=0x%x", status);
/* now check that input and output have the same size */
insize = filesize(TESTFILE);
outsize = filesize(CHECKFILE);
- ATF_REQUIRE(insize == strlen(TESTCONTENT));
- ATF_REQUIRE(insize == outsize);
+ ATF_CHECK_MSG(insize == strlen(TESTCONTENT),
+ "insize=%zu strlen(TESTCONTENT)=%zu", insize, strlen(TESTCONTENT));
+ ATF_CHECK_MSG(insize == outsize,
+ "insize=%zu outsize=%zu", insize, outsize);
/*
* try a "cat < testfile >> checkfile"
@@ -115,25 +112,27 @@ ATF_TC_BODY(t_spawn_openmode, tc)
make_testfile(TESTFILE);
make_testfile(CHECKFILE);
- posix_spawn_file_actions_init(&fa);
- posix_spawn_file_actions_addopen(&fa, fileno(stdin),
- TESTFILE, O_RDONLY, 0);
- posix_spawn_file_actions_addopen(&fa, fileno(stdout),
- CHECKFILE, O_WRONLY|O_APPEND, 0);
- err = posix_spawn(&pid, "/bin/cat", &fa, NULL, args, NULL);
- posix_spawn_file_actions_destroy(&fa);
-
- ATF_REQUIRE(err == 0);
+ RZ(posix_spawn_file_actions_init(&fa));
+ RZ(posix_spawn_file_actions_addopen(&fa, fileno(stdin),
+ TESTFILE, O_RDONLY, 0));
+ RZ(posix_spawn_file_actions_addopen(&fa, fileno(stdout),
+ CHECKFILE, O_WRONLY|O_APPEND, 0));
+ RZ(posix_spawn(&pid, "/bin/cat", &fa, NULL, args, NULL));
+ RZ(posix_spawn_file_actions_destroy(&fa));
/* ok, wait for the child to finish */
- waitpid(pid, &status, 0);
- ATF_REQUIRE(WIFEXITED(status) && WEXITSTATUS(status) == EXIT_SUCCESS);
+ RL(waitpid(pid, &status, 0));
+ ATF_REQUIRE_MSG((WIFEXITED(status) &&
+ WEXITSTATUS(status) == EXIT_SUCCESS),
+ "status=0x%x", status);
/* now check that output is twice as long as input */
insize = filesize(TESTFILE);
outsize = filesize(CHECKFILE);
- ATF_REQUIRE(insize == strlen(TESTCONTENT));
- ATF_REQUIRE(insize*2 == outsize);
+ ATF_CHECK_MSG(insize == strlen(TESTCONTENT),
+ "insize=%zu strlen(TESTCONTENT)=%zu", insize, strlen(TESTCONTENT));
+ ATF_CHECK_MSG(insize*2 == outsize,
+ "insize*2=%zu outsize=%zu", insize*2, outsize);
/*
* try a "cat < testfile > checkfile" with input and output swapped
@@ -141,39 +140,39 @@ ATF_TC_BODY(t_spawn_openmode, tc)
make_testfile(TESTFILE);
empty_outfile(CHECKFILE);
- posix_spawn_file_actions_init(&fa);
- posix_spawn_file_actions_addopen(&fa, fileno(stdout),
- TESTFILE, O_RDONLY, 0);
- posix_spawn_file_actions_addopen(&fa, fileno(stdin),
- CHECKFILE, O_WRONLY, 0);
- err = posix_spawn(&pid, "/bin/cat", &fa, NULL, args, NULL);
- posix_spawn_file_actions_destroy(&fa);
-
- ATF_REQUIRE(err == 0);
+ RZ(posix_spawn_file_actions_init(&fa));
+ RZ(posix_spawn_file_actions_addopen(&fa, fileno(stdout),
+ TESTFILE, O_RDONLY, 0));
+ RZ(posix_spawn_file_actions_addopen(&fa, fileno(stdin),
+ CHECKFILE, O_WRONLY, 0));
+ RZ(posix_spawn(&pid, "/bin/cat", &fa, NULL, args, NULL));
+ RZ(posix_spawn_file_actions_destroy(&fa));
/* ok, wait for the child to finish */
- waitpid(pid, &status, 0);
- ATF_REQUIRE(WIFEXITED(status) && WEXITSTATUS(status) == EXIT_FAILURE);
+ RL(waitpid(pid, &status, 0));
+ ATF_REQUIRE_MSG((WIFEXITED(status) &&
+ WEXITSTATUS(status) == EXIT_FAILURE),
+ "status=0x%x", status);
/* now check that input and output are still the same size */
insize = filesize(TESTFILE);
outsize = filesize(CHECKFILE);
- ATF_REQUIRE(insize == strlen(TESTCONTENT));
- ATF_REQUIRE(outsize == 0);
+ ATF_CHECK_MSG(insize == strlen(TESTCONTENT),
+ "insize=%zu strlen(TESTCONTENT)=%zu", insize, strlen(TESTCONTENT));
+ ATF_CHECK_MSG(outsize == 0,
+ "outsize=%zu", outsize);
}
ATF_TC(t_spawn_reopen);
-
ATF_TC_HEAD(t_spawn_reopen, tc)
{
atf_tc_set_md_var(tc, "descr",
"an open filehandle can be replaced by a 'open' fileaction");
atf_tc_set_md_var(tc, "require.progs", "/bin/cat");
}
-
ATF_TC_BODY(t_spawn_reopen, tc)
{
- int status, err;
+ int status;
pid_t pid;
char * const args[2] = { __UNCONST("cat"), NULL };
posix_spawn_file_actions_t fa;
@@ -181,31 +180,29 @@ ATF_TC_BODY(t_spawn_reopen, tc)
/*
* make sure stdin is open in the parent
*/
- freopen("/dev/zero", "r", stdin);
+ REQUIRE_LIBC(freopen("/dev/zero", "r", stdin), NULL);
/*
* now request an open for this fd again in the child
*/
- posix_spawn_file_actions_init(&fa);
- posix_spawn_file_actions_addopen(&fa, fileno(stdin),
- "/dev/null", O_RDONLY, 0);
- err = posix_spawn(&pid, "/bin/cat", &fa, NULL, args, NULL);
- posix_spawn_file_actions_destroy(&fa);
-
- ATF_REQUIRE(err == 0);
-
- waitpid(pid, &status, 0);
- ATF_REQUIRE(WIFEXITED(status) && WEXITSTATUS(status) == EXIT_SUCCESS);
+ RZ(posix_spawn_file_actions_init(&fa));
+ RZ(posix_spawn_file_actions_addopen(&fa, fileno(stdin),
+ "/dev/null", O_RDONLY, 0));
+ RZ(posix_spawn(&pid, "/bin/cat", &fa, NULL, args, NULL));
+ RZ(posix_spawn_file_actions_destroy(&fa));
+
+ RL(waitpid(pid, &status, 0));
+ ATF_REQUIRE_MSG((WIFEXITED(status) &&
+ WEXITSTATUS(status) == EXIT_SUCCESS),
+ "status=0x%x", status);
}
ATF_TC(t_spawn_open_nonexistent);
-
ATF_TC_HEAD(t_spawn_open_nonexistent, tc)
{
atf_tc_set_md_var(tc, "descr",
"posix_spawn fails when a file to open does not exist");
atf_tc_set_md_var(tc, "require.progs", "/bin/cat");
}
-
ATF_TC_BODY(t_spawn_open_nonexistent, tc)
{
int err, status;
@@ -213,9 +210,9 @@ ATF_TC_BODY(t_spawn_open_nonexistent, tc
char * const args[2] = { __UNCONST("cat"), NULL };
posix_spawn_file_actions_t fa;
- posix_spawn_file_actions_init(&fa);
- posix_spawn_file_actions_addopen(&fa, STDIN_FILENO,
- "./non/ex/ist/ent", O_RDONLY, 0);
+ RZ(posix_spawn_file_actions_init(&fa));
+ RZ(posix_spawn_file_actions_addopen(&fa, STDIN_FILENO,
+ "./non/ex/ist/ent", O_RDONLY, 0));
err = posix_spawn(&pid, "/bin/cat", &fa, NULL, args, NULL);
if (err == 0) {
/*
@@ -229,13 +226,13 @@ ATF_TC_BODY(t_spawn_open_nonexistent, tc
* The error has been noticed early enough, no child has
* been run
*/
- ATF_REQUIRE(err == ENOENT);
+ ATF_REQUIRE_MSG(err == ENOENT, "err=%d (%s)",
+ err, strerror(err));
}
- posix_spawn_file_actions_destroy(&fa);
+ RZ(posix_spawn_file_actions_destroy(&fa));
}
ATF_TC(t_spawn_open_nonexistent_diag);
-
ATF_TC_HEAD(t_spawn_open_nonexistent_diag, tc)
{
atf_tc_set_md_var(tc, "descr",
@@ -243,7 +240,6 @@ ATF_TC_HEAD(t_spawn_open_nonexistent_dia
"and delivers proper diagnostic");
atf_tc_set_md_var(tc, "require.progs", "/bin/cat");
}
-
ATF_TC_BODY(t_spawn_open_nonexistent_diag, tc)
{
int err;
@@ -252,7 +248,7 @@ ATF_TC_BODY(t_spawn_open_nonexistent_dia
posix_spawnattr_t attr;
posix_spawn_file_actions_t fa;
- posix_spawnattr_init(&attr);
+ RZ(posix_spawnattr_init(&attr));
/*
* POSIX_SPAWN_RETURNERROR is a NetBSD specific flag that
* will cause a "proper" return value from posix_spawn(2)
@@ -260,72 +256,68 @@ ATF_TC_BODY(t_spawn_open_nonexistent_dia
* status from the child process (c.f. the non-diag variant
* of this test).
*/
- posix_spawnattr_setflags(&attr, POSIX_SPAWN_RETURNERROR);
- posix_spawn_file_actions_init(&fa);
- posix_spawn_file_actions_addopen(&fa, STDIN_FILENO,
- "./non/ex/ist/ent", O_RDONLY, 0);
+ RZ(posix_spawnattr_setflags(&attr, POSIX_SPAWN_RETURNERROR));
+ RZ(posix_spawn_file_actions_init(&fa));
+ RZ(posix_spawn_file_actions_addopen(&fa, STDIN_FILENO,
+ "./non/ex/ist/ent", O_RDONLY, 0));
err = posix_spawn(&pid, "/bin/cat", &fa, &attr, args, NULL);
- ATF_REQUIRE(err == ENOENT);
- posix_spawn_file_actions_destroy(&fa);
- posix_spawnattr_destroy(&attr);
+ ATF_REQUIRE_MSG(err == ENOENT, "err=%d (%s)", err, strerror(err));
+ RZ(posix_spawn_file_actions_destroy(&fa));
+ RZ(posix_spawnattr_destroy(&attr));
}
ATF_TC(t_spawn_fileactions);
-
ATF_TC_HEAD(t_spawn_fileactions, tc)
{
atf_tc_set_md_var(tc, "descr",
"Tests various complex fileactions");
}
-
ATF_TC_BODY(t_spawn_fileactions, tc)
{
- int fd1, fd2, fd3, status, err;
+ int fd1, fd2, fd3, status;
pid_t pid;
char * const args[2] = { __UNCONST("h_fileactions"), NULL };
char helper[FILENAME_MAX];
posix_spawn_file_actions_t fa;
- posix_spawn_file_actions_init(&fa);
+ RZ(posix_spawn_file_actions_init(&fa));
- closefrom(fileno(stderr)+1);
+ RL(closefrom(fileno(stderr) + 1));
- fd1 = open("/dev/null", O_RDONLY);
+ RL(fd1 = open("/dev/null", O_RDONLY));
ATF_REQUIRE(fd1 == 3);
- fd2 = open("/dev/null", O_WRONLY, O_CLOEXEC);
+ RL(fd2 = open("/dev/null", O_WRONLY, O_CLOEXEC));
ATF_REQUIRE(fd2 == 4);
- fd3 = open("/dev/null", O_WRONLY);
+ RL(fd3 = open("/dev/null", O_WRONLY));
ATF_REQUIRE(fd3 == 5);
- posix_spawn_file_actions_addclose(&fa, fd1);
- posix_spawn_file_actions_addopen(&fa, 6, "/dev/null", O_RDWR, 0);
- posix_spawn_file_actions_adddup2(&fa, 1, 7);
+ RZ(posix_spawn_file_actions_addclose(&fa, fd1));
+ RZ(posix_spawn_file_actions_addopen(&fa, 6, "/dev/null", O_RDWR, 0));
+ RZ(posix_spawn_file_actions_adddup2(&fa, 1, 7));
snprintf(helper, sizeof helper, "%s/h_fileactions",
atf_tc_get_config_var(tc, "srcdir"));
- err = posix_spawn(&pid, helper, &fa, NULL, args, NULL);
- posix_spawn_file_actions_destroy(&fa);
+ RZ(posix_spawn(&pid, helper, &fa, NULL, args, NULL));
+ RZ(posix_spawn_file_actions_destroy(&fa));
- ATF_REQUIRE(err == 0);
-
- waitpid(pid, &status, 0);
- ATF_REQUIRE(WIFEXITED(status) && WEXITSTATUS(status) == EXIT_SUCCESS);
+ RL(waitpid(pid, &status, 0));
+ ATF_REQUIRE_MSG((WIFEXITED(status) &&
+ WEXITSTATUS(status) == EXIT_SUCCESS),
+ "status=0x%x", status);
}
ATF_TC(t_spawn_empty_fileactions);
-
ATF_TC_HEAD(t_spawn_empty_fileactions, tc)
{
atf_tc_set_md_var(tc, "descr",
"posix_spawn with empty fileactions (PR kern/46038)");
atf_tc_set_md_var(tc, "require.progs", "/bin/cat");
}
-
ATF_TC_BODY(t_spawn_empty_fileactions, tc)
{
- int status, err;
+ int status;
pid_t pid;
char * const args[2] = { __UNCONST("cat"), NULL };
posix_spawn_file_actions_t fa;
@@ -336,30 +328,32 @@ ATF_TC_BODY(t_spawn_empty_fileactions, t
* already in the parent and pass empty file actions to the child.
*/
make_testfile(TESTFILE);
- unlink(CHECKFILE);
- freopen(TESTFILE, "r", stdin);
- freopen(CHECKFILE, "w", stdout);
+ REQUIRE_LIBC(freopen(TESTFILE, "r", stdin), NULL);
+ REQUIRE_LIBC(freopen(CHECKFILE, "w", stdout), NULL);
- posix_spawn_file_actions_init(&fa);
- err = posix_spawn(&pid, "/bin/cat", &fa, NULL, args, NULL);
- posix_spawn_file_actions_destroy(&fa);
-
- ATF_REQUIRE(err == 0);
+ RZ(posix_spawn_file_actions_init(&fa));
+ RZ(posix_spawn(&pid, "/bin/cat", &fa, NULL, args, NULL));
+ RZ(posix_spawn_file_actions_destroy(&fa));
/* ok, wait for the child to finish */
- waitpid(pid, &status, 0);
- ATF_REQUIRE(WIFEXITED(status) && WEXITSTATUS(status) == EXIT_SUCCESS);
+ RL(waitpid(pid, &status, 0));
+ ATF_REQUIRE_MSG((WIFEXITED(status) &&
+ WEXITSTATUS(status) == EXIT_SUCCESS),
+ "status=0x%x", status);
/* now check that input and output have the same size */
insize = filesize(TESTFILE);
outsize = filesize(CHECKFILE);
- ATF_REQUIRE(insize == strlen(TESTCONTENT));
- ATF_REQUIRE(insize == outsize);
+ ATF_CHECK_MSG(insize == strlen(TESTCONTENT),
+ "insize=%zu strlen(TESTCONTENT)=%zu", insize, strlen(TESTCONTENT));
+ ATF_CHECK_MSG(insize == outsize,
+ "insize=%zu outsize=%zu", insize, outsize);
}
ATF_TP_ADD_TCS(tp)
{
+
ATF_TP_ADD_TC(tp, t_spawn_fileactions);
ATF_TP_ADD_TC(tp, t_spawn_open_nonexistent);
ATF_TP_ADD_TC(tp, t_spawn_open_nonexistent_diag);
Index: src/tests/lib/libc/gen/posix_spawn/t_spawn.c
diff -u src/tests/lib/libc/gen/posix_spawn/t_spawn.c:1.11 src/tests/lib/libc/gen/posix_spawn/t_spawn.c:1.12
--- src/tests/lib/libc/gen/posix_spawn/t_spawn.c:1.11 Sat Mar 15 12:09:41 2025
+++ src/tests/lib/libc/gen/posix_spawn/t_spawn.c Sun Mar 16 15:35:36 2025
@@ -1,4 +1,4 @@
-/* $NetBSD: t_spawn.c,v 1.11 2025/03/15 12:09:41 riastradh Exp $ */
+/* $NetBSD: t_spawn.c,v 1.12 2025/03/16 15:35:36 riastradh Exp $ */
/*-
* Copyright (c) 2012, 2021 The NetBSD Foundation, Inc.
@@ -31,21 +31,19 @@
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_spawn.c,v 1.11 2025/03/15 12:09:41 riastradh Exp $");
-
-#include <atf-c.h>
+__RCSID("$NetBSD: t_spawn.c,v 1.12 2025/03/16 15:35:36 riastradh Exp $");
#include <sys/fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/wait.h>
+#include <atf-c.h>
#include <errno.h>
#include <fcntl.h>
#include <limits.h>
#include <signal.h>
#include <spawn.h>
-#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -55,50 +53,42 @@ __RCSID("$NetBSD: t_spawn.c,v 1.11 2025/
#include "fa_spawn_utils.h"
#include "h_macros.h"
-static void check_success(const char *, int, ...);
+static void check_success(const char *, const char *);
ATF_TC(t_spawn_ls);
-
ATF_TC_HEAD(t_spawn_ls, tc)
{
atf_tc_set_md_var(tc, "descr",
"Tests a simple posix_spawn executing /bin/ls");
}
-
ATF_TC_BODY(t_spawn_ls, tc)
{
char * const args[] = { __UNCONST("ls"), __UNCONST("-la"), NULL };
- int err;
- err = posix_spawn(NULL, "/bin/ls", NULL, NULL, args, NULL);
- ATF_REQUIRE(err == 0);
+ RZ(posix_spawn(NULL, "/bin/ls", NULL, NULL, args, NULL));
}
ATF_TC(t_spawnp_ls);
-
ATF_TC_HEAD(t_spawnp_ls, tc)
{
atf_tc_set_md_var(tc, "descr",
"Tests a simple posix_spawnp executing ls via $PATH");
}
-
ATF_TC_BODY(t_spawnp_ls, tc)
{
char * const args[] = { __UNCONST("ls"), __UNCONST("-la"), NULL };
- int err;
- err = posix_spawnp(NULL, "ls", NULL, NULL, args, NULL);
- ATF_REQUIRE(err == 0);
+ RZ(posix_spawnp(NULL, "ls", NULL, NULL, args, NULL));
}
static void
spawn_error(const atf_tc_t *tc, const char *name, int error)
{
- char buf[FILENAME_MAX];
+ char buf[PATH_MAX];
char * const args[] = { __UNCONST(name), NULL };
int err;
- snprintf(buf, sizeof buf, "%s/%s",
+ 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, "
@@ -106,46 +96,39 @@ spawn_error(const atf_tc_t *tc, const ch
}
ATF_TC(t_spawn_zero);
-
ATF_TC_HEAD(t_spawn_zero, tc)
{
atf_tc_set_md_var(tc, "descr",
"posix_spawn an invalid binary");
}
-
ATF_TC_BODY(t_spawn_zero, tc)
{
spawn_error(tc, "h_zero", ENOEXEC);
}
ATF_TC(t_spawn_missing);
-
ATF_TC_HEAD(t_spawn_missing, tc)
{
atf_tc_set_md_var(tc, "descr",
- "posix_spawn a non existant binary");
+ "posix_spawn a nonexistent binary");
}
-
ATF_TC_BODY(t_spawn_missing, tc)
{
spawn_error(tc, "h_nonexist", ENOENT);
}
ATF_TC(t_spawn_nonexec);
-
ATF_TC_HEAD(t_spawn_nonexec, tc)
{
atf_tc_set_md_var(tc, "descr",
"posix_spawn a script with non existing interpreter");
}
-
ATF_TC_BODY(t_spawn_nonexec, tc)
{
spawn_error(tc, "h_nonexec", ENOENT);
}
ATF_TC(t_spawn_child);
-
ATF_TC_HEAD(t_spawn_child, tc)
{
atf_tc_set_md_var(tc, "descr",
@@ -154,92 +137,75 @@ ATF_TC_HEAD(t_spawn_child, tc)
ATF_TC_BODY(t_spawn_child, tc)
{
- char buf[FILENAME_MAX];
+ char buf[PATH_MAX];
char rv[2] = { '0', '\0' };
char * const args0[] = { __UNCONST("h_spawn"), rv, NULL };
int rets[] = { 0, 1, 7 };
- int err, status;
+ int status;
pid_t pid;
- snprintf(buf, sizeof buf, "%s/h_spawn",
+ snprintf(buf, sizeof(buf), "%s/h_spawn",
atf_tc_get_config_var(tc, "srcdir"));
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]);
+ RZ(posix_spawn(&pid, buf, NULL, NULL, args0, NULL));
+ ATF_REQUIRE_MSG(pid > 0, "pid=%lld", (long long)pid);
+ RL(waitpid(pid, &status, 0));
+ ATF_REQUIRE_MSG((WIFEXITED(status) &&
+ WEXITSTATUS(status) == rets[i]),
+ "status=0x%x", status);
}
}
-#define CHDIRPATH "/tmp"
#define FILENAME "output"
-#define FILEPATH "/tmp/output"
-#define CHDIR 1
-#define FCHDIR 2
+enum chdirop {
+ OP_CHDIR = 1,
+ OP_FCHDIR = 2,
+};
static void
-check_success(const char *file, int argc, ...)
+check_success(const char *dir, const char *file)
{
- va_list ap;
- ssize_t bytesRead;
+ ssize_t bytes_read;
int fd;
- size_t sizeOfFile = (size_t)filesize(file);
- size_t sizeOfStr;
+ size_t sizeof_file = (size_t)filesize(file);
+ size_t sizeof_str;
char *contents;
- const char *dir;
- contents = malloc(sizeOfFile);
- ATF_REQUIRE(contents != NULL);
+ REQUIRE_LIBC(contents = malloc(sizeof_file), NULL);
- /*
- * for now only 1 variadic argument expected
- * only from t_spawn_[f]chdir_rel
- */
- if (argc != 0) {
- va_start(ap, argc);
- dir = va_arg(ap, char *);
- ATF_REQUIRE(dir != NULL);
- va_end(ap);
- } else
- dir = CHDIRPATH;
-
- fd = open(file, O_RDONLY);
- ATF_REQUIRE_MSG(fd != -1, "Can't open `%s' (%s)", file,
- strerror(errno));
+ RL(fd = open(file, O_RDONLY));
/*
* file contains form feed i.e ASCII - 10 at the end.
- * Therefore sizeOfFile - 1
+ * Therefore sizeof_file - 1
*/
- sizeOfStr = strlen(dir);
- ATF_CHECK_MSG(sizeOfStr == sizeOfFile - 1, "%zu (%s) != %zu (%s)",
- sizeOfStr, dir, sizeOfFile - 1, file);
+ sizeof_str = strlen(dir);
+ ATF_CHECK_MSG(sizeof_str == sizeof_file - 1, "%zu (%s) != %zu (%s)",
+ sizeof_str, dir, sizeof_file - 1, file);
- bytesRead = read(fd, contents, sizeOfFile - 1);
- contents[sizeOfFile - 1] = '\0';
+ bytes_read = read(fd, contents, sizeof_file - 1);
+ contents[sizeof_file - 1] = '\0';
ATF_REQUIRE_MSG(strcmp(dir, contents) == 0,
- "[%s] != [%s] Directories dont match", dir, contents);
+ "[%s] != [%s] Directories don't match", dir, contents);
- fd = close(fd);
- ATF_REQUIRE(fd == 0);
+ RL(close(fd));
- unlink(file);
+ RL(unlink(file));
free(contents);
/* XXX not really required */
- ATF_REQUIRE((size_t)bytesRead == sizeOfStr);
+ ATF_REQUIRE_MSG((size_t)bytes_read == sizeof_str,
+ "bytes_read=%zu sizeof_str=%zu", bytes_read, sizeof_str);
}
static void
-spawn_chdir(const char *dirpath, const char *filepath, int operation,
+spawn_chdir(const char *dirpath, const char *filepath, enum chdirop operation,
int expected_error)
{
- int error, fd=-1, status;
+ int error, fd = -1, status;
char * const args[2] = { __UNCONST("pwd"), NULL };
pid_t pid;
posix_spawnattr_t attr, *attr_p;
@@ -248,35 +214,29 @@ spawn_chdir(const char *dirpath, const c
if (filepath)
empty_outfile(filepath);
- error = posix_spawn_file_actions_init(&fa);
- ATF_REQUIRE(error == 0);
+ RZ(posix_spawn_file_actions_init(&fa));
- switch(operation) {
- case CHDIR:
- error = posix_spawn_file_actions_addchdir(&fa, dirpath);
+ switch (operation) {
+ case OP_CHDIR:
+ RZ(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);
+ case OP_FCHDIR:
+ RL(fd = open(dirpath, O_RDONLY));
+ RZ(posix_spawn_file_actions_addfchdir(&fa, fd));
break;
}
- 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);
+ RZ(posix_spawn_file_actions_addopen(&fa, STDOUT_FILENO,
+ FILENAME, O_WRONLY, 0));
attr_p = NULL;
} else {
- error = posix_spawnattr_init(&attr);
- ATF_REQUIRE(error == 0);
+ RZ(posix_spawnattr_init(&attr));
/*
* POSIX_SPAWN_RETURNERROR is a NetBSD specific flag that
@@ -285,52 +245,56 @@ spawn_chdir(const char *dirpath, const c
* 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);
+ RZ(posix_spawnattr_setflags(&attr, POSIX_SPAWN_RETURNERROR));
attr_p = &attr;
}
error = posix_spawn(&pid, "/bin/pwd", &fa, attr_p, args, NULL);
- ATF_REQUIRE(error == expected_error);
+ ATF_REQUIRE_MSG(error == expected_error, "error=%d expected_error=%d",
+ error, expected_error);
/* wait for the child to finish only when no spawnattr */
if (attr_p) {
- posix_spawnattr_destroy(&attr);
+ RZ(posix_spawnattr_destroy(&attr));
} else {
- waitpid(pid, &status, 0);
- ATF_REQUIRE_MSG(WIFEXITED(status) &&
- WEXITSTATUS(status) == EXIT_SUCCESS,
- "%s", "[f]chdir failed");
+ RL(waitpid(pid, &status, 0));
+ ATF_REQUIRE_MSG((WIFEXITED(status) &&
+ WEXITSTATUS(status) == EXIT_SUCCESS),
+ "[f]chdir failed");
}
- posix_spawn_file_actions_destroy(&fa);
+ RZ(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);
+ RL(close(fd));
}
}
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);
+ char chdirpath[PATH_MAX], filepath[PATH_MAX];
+
+ REQUIRE_LIBC(getcwd(chdirpath, sizeof(chdirpath)), NULL);
+ RL(chdir("/"));
+ if (snprintf(filepath, sizeof(filepath), "%s/%s", chdirpath, FILENAME)
+ >= (int)sizeof(filepath))
+ atf_tc_fail("too deep: %s", chdirpath);
+
+ spawn_chdir(chdirpath, filepath, OP_CHDIR, 0);
/* finally cross check the output of "pwd" directory */
- check_success(FILEPATH, 0);
+ check_success(chdirpath, filepath);
}
ATF_TC(t_spawn_chdir_rel);
@@ -342,30 +306,15 @@ ATF_TC_HEAD(t_spawn_chdir_rel, tc)
atf_tc_set_md_var(tc, "require.progs", "/bin/pwd");
}
-
ATF_TC_BODY(t_spawn_chdir_rel, tc)
{
- int error;
const char *relative_dir = "ch-dir";
const char *testdir = getcwd(NULL, 0);
char *chdirwd, *filepath;
- /* cleanup previous */
- error = asprintf(&filepath, "%s/%s", relative_dir, FILENAME);
- ATF_CHECK(error != -1);
- unlink(filepath);
- free(filepath);
-
- rmdir(relative_dir);
- error = mkdir(relative_dir, 0777);
- ATF_REQUIRE_MSG(error == 0, "mkdir `%s' (%s)", relative_dir,
- strerror(errno));
-
- error = asprintf(&chdirwd, "%s/%s", testdir, relative_dir);
- ATF_CHECK(error != -1);
-
- error = asprintf(&filepath, "%s/%s", chdirwd, FILENAME);
- ATF_CHECK(error != -1);
+ RL(mkdir(relative_dir, 0777));
+ RL(asprintf(&chdirwd, "%s/%s", testdir, relative_dir));
+ RL(asprintf(&filepath, "%s/%s", chdirwd, FILENAME));
#ifdef DEBUG
printf("cwd: %s\n", testdir);
@@ -376,44 +325,43 @@ ATF_TC_BODY(t_spawn_chdir_rel, tc)
spawn_chdir(relative_dir, filepath, 1, 0);
/* finally cross check the directory */
- check_success(filepath, 1, chdirwd);
+ check_success(chdirwd, filepath);
free(chdirwd);
free(filepath);
}
ATF_TC(t_spawn_chdir_file);
-
ATF_TC_HEAD(t_spawn_chdir_file, tc)
{
atf_tc_set_md_var(tc, "descr",
"Test posix_spawn_fa_addchdir on plain file (not a directory)");
atf_tc_set_md_var(tc, "require.progs", "/bin/pwd");
}
-
ATF_TC_BODY(t_spawn_chdir_file, tc)
{
- spawn_chdir(FILEPATH, FILEPATH, 1, ENOTDIR);
+ char cwd[PATH_MAX], filepath[PATH_MAX];
+
+ REQUIRE_LIBC(getcwd(cwd, sizeof(cwd)), NULL);
+ if (snprintf(filepath, sizeof(filepath), "%s/%s", cwd, FILENAME)
+ >= (int)sizeof(filepath))
+ atf_tc_fail("too deep: %s", cwd);
- unlink(FILEPATH);
+ spawn_chdir(filepath, filepath, 1, ENOTDIR);
}
ATF_TC(t_spawn_chdir_invalid);
-
ATF_TC_HEAD(t_spawn_chdir_invalid, tc)
{
atf_tc_set_md_var(tc, "descr",
"Test posix_spawn_fa_addchdir for an invalid dir");
atf_tc_set_md_var(tc, "require.progs", "/bin/pwd");
}
-
ATF_TC_BODY(t_spawn_chdir_invalid, tc)
{
spawn_chdir("/not/a/valid/dir", NULL, 1, ENOENT);
-
}
ATF_TC(t_spawn_chdir_permissions);
-
ATF_TC_HEAD(t_spawn_chdir_permissions, tc)
{
atf_tc_set_md_var(tc, "descr",
@@ -421,38 +369,38 @@ ATF_TC_HEAD(t_spawn_chdir_permissions, t
atf_tc_set_md_var(tc, "require.progs", "/bin/pwd");
atf_tc_set_md_var(tc, "require.user", "unprivileged");
}
-
ATF_TC_BODY(t_spawn_chdir_permissions, tc)
{
- int error;
- const char *restrRelDir = "prohibited";
+ const char *restricted_dir = "prohibited";
- rmdir(restrRelDir);
- error = mkdir(restrRelDir, 0055);
- ATF_REQUIRE(error == 0);
+ RL(mkdir(restricted_dir, 0055));
- spawn_chdir(restrRelDir, NULL, 1, EACCES);
+ spawn_chdir(restricted_dir, NULL, 1, EACCES);
}
-
ATF_TC(t_spawn_fchdir_abs);
-
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_abs, tc)
{
- spawn_chdir(CHDIRPATH, FILEPATH, 2, 0);
+ char chdirpath[PATH_MAX], filepath[PATH_MAX];
+
+ REQUIRE_LIBC(getcwd(chdirpath, sizeof(chdirpath)), NULL);
+ RL(chdir("/"));
+ if (snprintf(filepath, sizeof(filepath), "%s/%s", chdirpath, FILENAME)
+ >= (int)sizeof(filepath))
+ atf_tc_fail("too deep: %s", chdirpath);
+
+ spawn_chdir(chdirpath, filepath, OP_FCHDIR, 0);
/* finally cross check the directory */
- check_success(FILEPATH, 0);
+ check_success(chdirpath, filepath);
}
ATF_TC(t_spawn_fchdir_rel);
-
ATF_TC_HEAD(t_spawn_fchdir_rel, tc)
{
atf_tc_set_md_var(tc, "descr",
@@ -460,39 +408,31 @@ ATF_TC_HEAD(t_spawn_fchdir_rel, tc)
"directory");
atf_tc_set_md_var(tc, "require.progs", "/bin/pwd");
}
-
ATF_TC_BODY(t_spawn_fchdir_rel, tc)
{
- int error;
const char *relative_dir = "ch-dir";
const char *testdir = getcwd(NULL, 0);
char *chdirwd, *filepath;
- rmdir(relative_dir);
- error = mkdir(relative_dir, 0755);
- ATF_REQUIRE(error == 0);
+ RL(mkdir(relative_dir, 0755));
/*
* This is done in parts purposely.
* It enables 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);
+ RL(asprintf(&chdirwd, "%s/%s", testdir, relative_dir));
+ RL(asprintf(&filepath, "%s/%s", chdirwd, FILENAME));
spawn_chdir(relative_dir, filepath, 2, 0);
/* finally cross check the directory */
- check_success(filepath, 1, chdirwd);
+ check_success(chdirwd, filepath);
free(chdirwd);
free(filepath);
}
ATF_TC(t_spawn_fchdir_file);
-
ATF_TC_HEAD(t_spawn_fchdir_file, tc)
{
atf_tc_set_md_var(tc, "descr",
@@ -500,26 +440,22 @@ ATF_TC_HEAD(t_spawn_fchdir_file, tc)
"regular file (not a directory)");
atf_tc_set_md_var(tc, "require.progs", "/bin/pwd");
}
-
ATF_TC_BODY(t_spawn_fchdir_file, tc)
{
- 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 = close(fd);
- ATF_REQUIRE(error == 0);
-
- spawn_chdir(FILEPATH, NULL, 2, ENOTDIR);
+ char cwd[PATH_MAX], filepath[PATH_MAX];
+ int fd;
- unlink(FILEPATH);
+ REQUIRE_LIBC(getcwd(cwd, sizeof(cwd)), NULL);
+ if (snprintf(filepath, sizeof(filepath), "%s/%s", cwd, FILENAME)
+ >= (int)sizeof(filepath))
+ atf_tc_fail("too deep: %s", cwd);
+ RL(fd = open(FILENAME, O_WRONLY | O_CREAT | O_TRUNC, 0644));
+ RL(close(fd));
+ spawn_chdir(filepath, NULL, 2, ENOTDIR);
}
ATF_TC(t_spawn_fchdir_neg_fd);
-
ATF_TC_HEAD(t_spawn_fchdir_neg_fd, tc)
{
atf_tc_set_md_var(tc, "descr",
@@ -527,7 +463,6 @@ ATF_TC_HEAD(t_spawn_fchdir_neg_fd, tc)
"descriptor");
atf_tc_set_md_var(tc, "require.progs", "/bin/pwd");
}
-
ATF_TC_BODY(t_spawn_fchdir_neg_fd, tc)
{
int error, fd;
@@ -535,24 +470,21 @@ ATF_TC_BODY(t_spawn_fchdir_neg_fd, tc)
fd = -1;
- error = posix_spawn_file_actions_init(&fa);
- ATF_REQUIRE(error == 0);
+ RZ(posix_spawn_file_actions_init(&fa));
error = posix_spawn_file_actions_addfchdir(&fa, fd);
- ATF_REQUIRE(error == EBADF);
+ ATF_REQUIRE_MSG(error == EBADF, "error=%d", error);
- posix_spawn_file_actions_destroy(&fa);
+ RZ(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;
@@ -562,8 +494,7 @@ ATF_TC_BODY(t_spawn_fchdir_closed, tc)
posix_spawn_file_actions_t fa;
fd = 3;
- error = posix_spawnattr_init(&attr);
- ATF_CHECK(error == 0);
+ RZ(posix_spawnattr_init(&attr));
/*
* POSIX_SPAWN_RETURNERROR is a NetBSD specific flag that
* will cause a "proper" return value from posix_spawn(2)
@@ -571,20 +502,15 @@ ATF_TC_BODY(t_spawn_fchdir_closed, tc)
* 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);
+ RZ(posix_spawnattr_setflags(&attr, POSIX_SPAWN_RETURNERROR));
+ RZ(posix_spawn_file_actions_init(&fa));
+ RZ(posix_spawn_file_actions_addfchdir(&fa, fd));
error = posix_spawn(&pid, "/bin/pwd", &fa, &attr, args, NULL);
- ATF_REQUIRE(error == EBADF);
+ ATF_REQUIRE_MSG(error == EBADF, "error=%d", error);
- posix_spawn_file_actions_destroy(&fa);
- posix_spawnattr_destroy(&attr);
+ RZ(posix_spawn_file_actions_destroy(&fa));
+ RZ(posix_spawnattr_destroy(&attr));
}
ATF_TC(t_spawn_sig);
@@ -628,12 +554,6 @@ ATF_TC_BODY(t_spawn_sig, tc)
}
}
-#undef CHDIR
-#undef FCHDIR
-#undef CHDIRPATH
-#undef FILENAME
-#undef FILEPATH
-
ATF_TP_ADD_TCS(tp)
{
ATF_TP_ADD_TC(tp, t_spawn_ls);
Index: src/tests/lib/libc/gen/posix_spawn/t_spawnattr.c
diff -u src/tests/lib/libc/gen/posix_spawn/t_spawnattr.c:1.6 src/tests/lib/libc/gen/posix_spawn/t_spawnattr.c:1.7
--- src/tests/lib/libc/gen/posix_spawn/t_spawnattr.c:1.6 Mon May 23 21:46:12 2022
+++ src/tests/lib/libc/gen/posix_spawn/t_spawnattr.c Sun Mar 16 15:35:36 2025
@@ -1,4 +1,4 @@
-/* $NetBSD: t_spawnattr.c,v 1.6 2022/05/23 21:46:12 andvar Exp $ */
+/* $NetBSD: t_spawnattr.c,v 1.7 2025/03/16 15:35:36 riastradh Exp $ */
/*-
* Copyright (c) 2012 The NetBSD Foundation, Inc.
@@ -29,32 +29,39 @@
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
+
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_spawnattr.c,v 1.6 2022/05/23 21:46:12 andvar Exp $");
+__RCSID("$NetBSD: t_spawnattr.c,v 1.7 2025/03/16 15:35:36 riastradh Exp $");
#include <sys/param.h>
+#include <sys/wait.h>
+
#include <atf-c.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <sched.h>
#include <signal.h>
#include <spawn.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
#include <unistd.h>
-#include <sys/wait.h>
+
+#include "h_macros.h"
static int
get_different_scheduler(void)
{
+ int sched;
+
/*
* We don't want to use SCHED_OTHER because it does not have
* different priorities.
*/
/* get current schedule policy */
- switch (sched_getscheduler(0)) {
+ RL(sched = sched_getscheduler(0));
+ switch (sched) {
case SCHED_RR:
return SCHED_FIFO;
case SCHED_FIFO:
@@ -72,17 +79,17 @@ get_different_priority(int scheduler)
struct sched_param param;
/* Get the priority range for the new scheduler */
- max = sched_get_priority_max(scheduler);
- min = sched_get_priority_min(scheduler);
+ RL(max = sched_get_priority_max(scheduler));
+ RL(min = sched_get_priority_min(scheduler));
- sched_getparam(0, ¶m);
+ RL(sched_getparam(0, ¶m));
priority = param.sched_priority;
-
+
/* new schedule policy */
for (new = min; new <= max; new++)
if (priority != new)
break;
-
+
ATF_REQUIRE_MSG(priority != new, "could not find different priority");
printf("min %d max %d for scheduler %d, returning %d\n",
min, max, scheduler, new);
@@ -90,17 +97,15 @@ get_different_priority(int scheduler)
}
ATF_TC(t_spawnattr);
-
ATF_TC_HEAD(t_spawnattr, tc)
{
atf_tc_set_md_var(tc, "require.user", "root");
atf_tc_set_md_var(tc, "descr",
"Tests posix_spawn with scheduler attributes");
}
-
ATF_TC_BODY(t_spawnattr, tc)
{
- int pid, scheduler, child_scheduler, priority, status, err, pfd[2];
+ int pid, scheduler, child_scheduler, priority, status, pfd[2];
char helper_arg[128];
char * const args[] = { __UNCONST("h_spawnattr"), helper_arg, NULL };
struct sched_param sp, child_sp;
@@ -111,41 +116,40 @@ ATF_TC_BODY(t_spawnattr, tc)
/*
* create a pipe to control the child
*/
- err = pipe(pfd);
- ATF_REQUIRE_MSG(err == 0, "could not create pipe, errno %d", errno);
- sprintf(helper_arg, "%d", pfd[0]);
+ RL(pipe(pfd));
+ snprintf(helper_arg, sizeof(helper_arg), "%d", pfd[0]);
- posix_spawnattr_init(&attr);
+ RZ(posix_spawnattr_init(&attr));
scheduler = get_different_scheduler();
priority = get_different_priority(scheduler);
sp.sched_priority = priority;
printf("using scheduler %d, priority %d\n", scheduler, priority);
-
- sigemptyset(&sig);
- sigaddset(&sig, SIGUSR1);
- posix_spawnattr_setflags(&attr, POSIX_SPAWN_SETSCHEDULER |
+ RL(sigemptyset(&sig));
+ RL(sigaddset(&sig, SIGUSR1));
+
+ RZ(posix_spawnattr_setflags(&attr, POSIX_SPAWN_SETSCHEDULER |
POSIX_SPAWN_SETSCHEDPARAM | POSIX_SPAWN_SETPGROUP |
POSIX_SPAWN_SETSIGMASK | POSIX_SPAWN_SETSIGDEF |
- POSIX_SPAWN_SETSIGDEF);
- posix_spawnattr_setpgroup(&attr, 0);
- posix_spawnattr_setschedparam(&attr, &sp);
- posix_spawnattr_setschedpolicy(&attr, scheduler);
- posix_spawnattr_setsigmask(&attr, &sig);
- posix_spawnattr_setsigdefault(&attr, &sig);
+ POSIX_SPAWN_SETSIGDEF));
+ RZ(posix_spawnattr_setpgroup(&attr, 0));
+ RZ(posix_spawnattr_setschedparam(&attr, &sp));
+ RZ(posix_spawnattr_setschedpolicy(&attr, scheduler));
+ RZ(posix_spawnattr_setsigmask(&attr, &sig));
+ RZ(posix_spawnattr_setsigdefault(&attr, &sig));
- sprintf(helper, "%s/h_spawnattr",
+ snprintf(helper, sizeof(helper), "%s/h_spawnattr",
atf_tc_get_config_var(tc, "srcdir"));
- err = posix_spawn(&pid, helper, NULL, &attr, args, NULL);
- ATF_REQUIRE_MSG(err == 0, "error %d", err);
+ RZ(posix_spawn(&pid, helper, NULL, &attr, args, NULL));
+ ATF_REQUIRE_MSG(pid > 0, "pid=%lld", (long long)pid);
- child_scheduler = sched_getscheduler(pid);
+ RL(child_scheduler = sched_getscheduler(pid));
ATF_REQUIRE_MSG(scheduler == child_scheduler,
"scheduler = %d, child_scheduler = %d, pid %d, errno %d",
scheduler, child_scheduler, pid, errno);
- sched_getparam(pid, &child_sp);
+ RL(sched_getparam(pid, &child_sp));
ATF_REQUIRE_MSG(child_sp.sched_priority == sp.sched_priority,
"priority is: %d, but we requested: %d",
child_sp.sched_priority, sp.sched_priority);
@@ -154,15 +158,15 @@ ATF_TC_BODY(t_spawnattr, tc)
pid, getpgid(pid));
/* ready, let child go */
- write(pfd[1], "q", 1);
- close(pfd[0]);
- close(pfd[1]);
+ RL(write(pfd[1], "q", 1));
+ RL(close(pfd[0]));
+ RL(close(pfd[1]));
/* wait and check result from child */
- waitpid(pid, &status, 0);
+ RL(waitpid(pid, &status, 0));
ATF_REQUIRE(WIFEXITED(status) && WEXITSTATUS(status) == EXIT_SUCCESS);
- posix_spawnattr_destroy(&attr);
+ RZ(posix_spawnattr_destroy(&attr));
}
ATF_TC(t_spawn_resetids);
@@ -180,22 +184,22 @@ ATF_TC_BODY(t_spawn_resetids, tc)
__UNCONST("h_spawn"), __UNCONST("--resetids"), NULL
};
posix_spawnattr_t attr;
- int err, status;
+ int status;
pid_t pid;
- posix_spawnattr_init(&attr);
- posix_spawnattr_setflags(&attr, POSIX_SPAWN_RESETIDS);
+ RZ(posix_spawnattr_init(&attr));
+ RZ(posix_spawnattr_setflags(&attr, POSIX_SPAWN_RESETIDS));
- snprintf(buf, sizeof buf, "%s/h_spawn",
+ snprintf(buf, sizeof(buf), "%s/h_spawn",
atf_tc_get_config_var(tc, "srcdir"));
- err = posix_spawn(&pid, buf, NULL, &attr, args, NULL);
- ATF_REQUIRE(err == 0);
- ATF_REQUIRE(pid > 0);
- waitpid(pid, &status, 0);
- ATF_REQUIRE(WIFEXITED(status) && WEXITSTATUS(status) == 0);
+ RZ(posix_spawn(&pid, buf, NULL, &attr, args, NULL));
+ ATF_REQUIRE_MSG(pid > 0, "pid=%lld", (long long)pid);
+ RL(waitpid(pid, &status, 0));
+ ATF_REQUIRE_MSG(WIFEXITED(status) && WEXITSTATUS(status) == 0,
+ "status=0x%x", status);
- posix_spawnattr_destroy(&attr);
+ RZ(posix_spawnattr_destroy(&attr));
}
ATF_TP_ADD_TCS(tp)