diff options
Diffstat (limited to 'posix')
-rw-r--r-- | posix/Makefile | 1 | ||||
-rw-r--r-- | posix/spawn_int.h | 3 | ||||
-rw-r--r-- | posix/tst-posix_spawn-setsid.c | 169 | ||||
-rw-r--r-- | posix/tst-spawn-chdir.c | 15 | ||||
-rw-r--r-- | posix/tst-spawn.c | 24 | ||||
-rw-r--r-- | posix/tst-spawn.h | 36 | ||||
-rw-r--r-- | posix/tst-spawn2.c | 17 | ||||
-rw-r--r-- | posix/tst-spawn3.c | 99 | ||||
-rw-r--r-- | posix/tst-spawn4.c | 7 | ||||
-rw-r--r-- | posix/tst-spawn5.c | 14 | ||||
-rw-r--r-- | posix/tst-spawn6.c | 13 | ||||
-rw-r--r-- | posix/tst-spawn7.c | 13 |
12 files changed, 271 insertions, 140 deletions
diff --git a/posix/Makefile b/posix/Makefile index 70faad4b63..905cf9fb54 100644 --- a/posix/Makefile +++ b/posix/Makefile @@ -602,6 +602,7 @@ tst-spawn-static-ARGS = $(tst-spawn-ARGS) tst-spawn5-ARGS = -- $(host-test-program-cmd) tst-spawn6-ARGS = -- $(host-test-program-cmd) tst-spawn7-ARGS = -- $(host-test-program-cmd) +tst-posix_spawn-setsid-ARGS = -- $(host-test-program-cmd) tst-dir-ARGS = `pwd` `cd $(common-objdir)/$(subdir); pwd` `cd $(common-objdir); pwd` $(objpfx)tst-dir tst-chmod-ARGS = $(objdir) tst-vfork3-ARGS = --test-dir=$(objpfx) diff --git a/posix/spawn_int.h b/posix/spawn_int.h index aeb066c44f..64ee03e62d 100644 --- a/posix/spawn_int.h +++ b/posix/spawn_int.h @@ -76,12 +76,13 @@ struct __spawn_action #define SPAWN_XFLAGS_USE_PATH 0x1 #define SPAWN_XFLAGS_TRY_SHELL 0x2 +#define SPAWN_XFLAGS_RET_PIDFD 0x4 extern int __posix_spawn_file_actions_realloc (posix_spawn_file_actions_t * file_actions) attribute_hidden; -extern int __spawni (pid_t *pid, const char *path, +extern int __spawni (int *pid, const char *path, const posix_spawn_file_actions_t *file_actions, const posix_spawnattr_t *attrp, char *const argv[], char *const envp[], int xflags) attribute_hidden; diff --git a/posix/tst-posix_spawn-setsid.c b/posix/tst-posix_spawn-setsid.c index 124d878ce2..b47eb16cc5 100644 --- a/posix/tst-posix_spawn-setsid.c +++ b/posix/tst-posix_spawn-setsid.c @@ -18,78 +18,159 @@ #include <errno.h> #include <fcntl.h> +#include <getopt.h> +#include <intprops.h> +#include <paths.h> #include <spawn.h> #include <stdbool.h> #include <stdio.h> +#include <stdlib.h> #include <sys/resource.h> +#include <sys/wait.h> #include <unistd.h> #include <support/check.h> +#include <support/xunistd.h> +#include <support/temp_file.h> +#include <tst-spawn.h> +/* Nonzero if the program gets called via `exec'. */ +static int restart; + +/* Hold the four initial argument used to respawn the process, plus + the extra '--direct' and '--restart', and a final NULL. */ +static char *initial_argv[7]; +static int initial_argv_count; + +#define CMDLINE_OPTIONS \ + { "restart", no_argument, &restart, 1 }, + +static char *pidfile; + +static pid_t +read_child_sid (void) +{ + int pidfd = xopen (pidfile, O_RDONLY, 0); + + char buf[INT_STRLEN_BOUND (pid_t)]; + ssize_t n = read (pidfd, buf, sizeof (buf)); + TEST_VERIFY (n < sizeof buf && n >= 0); + buf[n] = '\0'; + + /* We only expect to read the PID. */ + char *endp; + long int rpid = strtol (buf, &endp, 10); + TEST_VERIFY (endp != buf); + + xclose (pidfd); + + return rpid; +} + +/* Called on process re-execution, write down the session id on PIDFILE. */ static void -do_test_setsid (bool test_setsid) +handle_restart (const char *pidfile) { - pid_t sid, child_sid; - int res; + int pidfd = xopen (pidfile, O_WRONLY, 0); + + char buf[INT_STRLEN_BOUND (pid_t)]; + int s = snprintf (buf, sizeof buf, "%d", getsid (0)); + size_t n = write (pidfd, buf, s); + TEST_VERIFY (n == s); + + xclose (pidfd); +} +static void +do_test_setsid (bool test_setsid) +{ /* Current session ID. */ - sid = getsid(0); - if (sid == (pid_t) -1) - FAIL_EXIT1 ("getsid (0): %m"); + pid_t sid = getsid (0); + TEST_VERIFY (sid != (pid_t) -1); posix_spawnattr_t attrp; - /* posix_spawnattr_init should not fail (it basically memset the - attribute). */ - posix_spawnattr_init (&attrp); + TEST_COMPARE (posix_spawnattr_init (&attrp), 0); if (test_setsid) - { - res = posix_spawnattr_setflags (&attrp, POSIX_SPAWN_SETSID); - if (res != 0) - { - errno = res; - FAIL_EXIT1 ("posix_spawnattr_setflags: %m"); - } - } - - /* Program to run. */ - char *args[2] = { (char *) "true", NULL }; - pid_t child; - - res = posix_spawnp (&child, "true", NULL, &attrp, args, environ); - /* posix_spawnattr_destroy is noop. */ - posix_spawnattr_destroy (&attrp); - - if (res != 0) - { - errno = res; - FAIL_EXIT1 ("posix_spawnp: %m"); - } + TEST_COMPARE (posix_spawnattr_setflags (&attrp, POSIX_SPAWN_SETSID), 0); + + /* 1 or 4 elements from initial_argv: + + path to ld.so optional + + --library-path optional + + the library path optional + + application name + + --direct + + --restart + + pidfile */ + int argv_size = initial_argv_count + 2; + char *args[argv_size]; + int argc = 0; + + for (char **arg = initial_argv; *arg != NULL; arg++) + args[argc++] = *arg; + args[argc++] = pidfile; + args[argc] = NULL; + TEST_VERIFY (argc < argv_size); + + PID_T_TYPE pid; + TEST_COMPARE (POSIX_SPAWN (&pid, args[0], NULL, &attrp, args, environ), 0); + TEST_COMPARE (posix_spawnattr_destroy (&attrp), 0); + + siginfo_t sinfo; + TEST_COMPARE (WAITID (P_PID, pid, &sinfo, WEXITED), 0); + TEST_COMPARE (sinfo.si_code, CLD_EXITED); + TEST_COMPARE (sinfo.si_status, 0); + + pid_t child_sid = read_child_sid (); /* Child should have a different session ID than parent. */ - child_sid = getsid (child); - - if (child_sid == (pid_t) -1) - FAIL_EXIT1 ("getsid (%i): %m", child); + TEST_VERIFY (child_sid != (pid_t) -1); if (test_setsid) - { - if (child_sid == sid) - FAIL_EXIT1 ("child session ID matched parent one"); - } + TEST_VERIFY (child_sid != sid); else - { - if (child_sid != sid) - FAIL_EXIT1 ("child session ID did not match parent one"); - } + TEST_VERIFY (child_sid == sid); } static int -do_test (void) +do_test (int argc, char *argv[]) { + /* We must have either: + + - one or four parameters if called initially: + + argv[1]: path for ld.so optional + + argv[2]: "--library-path" optional + + argv[3]: the library path optional + + argv[4]: the application name + + - six parameters left if called through re-execution: + + argv[5/1]: the application name + + argv[6/2]: the pidfile + + * When built with --enable-hardcoded-path-in-tests or issued without + using the loader directly. */ + + if (restart) + { + handle_restart (argv[1]); + return 0; + } + + TEST_VERIFY_EXIT (argc == 2 || argc == 5); + + int i; + for (i = 0; i < argc - 1; i++) + initial_argv[i] = argv[i + 1]; + initial_argv[i++] = (char *) "--direct"; + initial_argv[i++] = (char *) "--restart"; + initial_argv_count = i; + + create_temp_file ("tst-posix_spawn-setsid-", &pidfile); + do_test_setsid (false); do_test_setsid (true); return 0; } +#define TEST_FUNCTION_ARGV do_test #include <support/test-driver.c> diff --git a/posix/tst-spawn-chdir.c b/posix/tst-spawn-chdir.c index b335092d7f..c01ca6692d 100644 --- a/posix/tst-spawn-chdir.c +++ b/posix/tst-spawn-chdir.c @@ -29,7 +29,9 @@ #include <support/test-driver.h> #include <support/xstdio.h> #include <support/xunistd.h> +#include <sys/wait.h> #include <unistd.h> +#include <tst-spawn.h> /* Reads the file at PATH, which must consist of exactly one line. Removes the line terminator at the end of the file. */ @@ -169,17 +171,18 @@ do_test (void) char *const argv[] = { (char *) "pwd", NULL }; char *const envp[] = { NULL } ; - pid_t pid; + PID_T_TYPE pid; if (do_spawnp) - TEST_COMPARE (posix_spawnp (&pid, "pwd", &actions, + TEST_COMPARE (POSIX_SPAWNP (&pid, "pwd", &actions, NULL, argv, envp), 0); else - TEST_COMPARE (posix_spawn (&pid, "subdir/pwd-symlink", &actions, + TEST_COMPARE (POSIX_SPAWN (&pid, "subdir/pwd-symlink", &actions, NULL, argv, envp), 0); TEST_VERIFY (pid > 0); - int status; - xwaitpid (pid, &status, 0); - TEST_COMPARE (status, 0); + siginfo_t sinfo; + TEST_COMPARE (WAITID (P_ALL, 0, &sinfo, WEXITED), 0); + TEST_COMPARE (sinfo.si_code, CLD_EXITED); + TEST_COMPARE (sinfo.si_status, 0); /* Check that the current directory did not change. */ { diff --git a/posix/tst-spawn.c b/posix/tst-spawn.c index 6782a322fc..c44d90756a 100644 --- a/posix/tst-spawn.c +++ b/posix/tst-spawn.c @@ -25,11 +25,13 @@ #include <stdlib.h> #include <string.h> #include <sys/param.h> +#include <sys/wait.h> #include <support/check.h> #include <support/xunistd.h> #include <support/temp_file.h> #include <support/support.h> +#include <tst-spawn.h> /* Nonzero if the program gets called via `exec'. */ @@ -143,9 +145,9 @@ handle_restart (const char *fd1s, const char *fd2s, const char *fd3s, static int do_test (int argc, char *argv[]) { - pid_t pid; + PID_T_TYPE pid; int fd4; - int status; + siginfo_t sinfo; posix_spawn_file_actions_t actions; char fd1name[18]; char fd2name[18]; @@ -233,17 +235,16 @@ do_test (int argc, char *argv[]) spargv[i++] = fd5name; spargv[i] = NULL; - TEST_COMPARE (posix_spawn (&pid, argv[1], &actions, NULL, spargv, environ), + TEST_COMPARE (POSIX_SPAWN (&pid, argv[1], &actions, NULL, spargv, environ), 0); /* Wait for the children. */ - TEST_COMPARE (xwaitpid (pid, &status, 0), pid); - TEST_VERIFY (WIFEXITED (status)); - TEST_VERIFY (!WIFSIGNALED (status)); - TEST_COMPARE (WEXITSTATUS (status), 0); + TEST_COMPARE (WAITID (P_PID, pid, &sinfo, WEXITED), 0); + TEST_COMPARE (sinfo.si_code, CLD_EXITED); + TEST_COMPARE (sinfo.si_status, 0); /* Same test but with a NULL pid argument. */ - TEST_COMPARE (posix_spawn (NULL, argv[1], &actions, NULL, spargv, environ), + TEST_COMPARE (POSIX_SPAWN (NULL, argv[1], &actions, NULL, spargv, environ), 0); /* Cleanup. */ @@ -251,10 +252,9 @@ do_test (int argc, char *argv[]) free (name3_copy); /* Wait for the children. */ - xwaitpid (-1, &status, 0); - TEST_VERIFY (WIFEXITED (status)); - TEST_VERIFY (!WIFSIGNALED (status)); - TEST_COMPARE (WEXITSTATUS (status), 0); + TEST_COMPARE (WAITID (P_ALL, 0, &sinfo, WEXITED), 0); + TEST_COMPARE (sinfo.si_code, CLD_EXITED); + TEST_COMPARE (sinfo.si_status, 0); return 0; } diff --git a/posix/tst-spawn.h b/posix/tst-spawn.h new file mode 100644 index 0000000000..a6f2dc8680 --- /dev/null +++ b/posix/tst-spawn.h @@ -0,0 +1,36 @@ +/* Generic definitions for posix_spawn tests. + Copyright (C) 2023 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <https://www.gnu.org/licenses/>. */ + +#ifndef PID_T_TYPE +# define PID_T_TYPE pid_t +#endif + +#ifndef POSIX_SPAWN +# define POSIX_SPAWN(__child, __path, __actions, __attr, __argv, __envp) \ + posix_spawn (__child, __path, __actions, __attr, __argv, __envp) +#endif + +#ifndef POSIX_SPAWNP +# define POSIX_SPAWNP(__child, __path, __actions, __attr, __argv, __envp) \ + posix_spawnp (__child, __path, __actions, __attr, __argv, __envp) +#endif + +#ifndef WAITID +# define WAITID(__idtype, __id, __info, __opts) \ + waitid (__idtype, __id, __info, __opts) +#endif diff --git a/posix/tst-spawn2.c b/posix/tst-spawn2.c index 40dc692488..f5c1f13039 100644 --- a/posix/tst-spawn2.c +++ b/posix/tst-spawn2.c @@ -26,6 +26,7 @@ #include <stdio.h> #include <support/check.h> +#include <tst-spawn.h> int do_test (void) @@ -35,9 +36,9 @@ do_test (void) const char *program = "/path/to/invalid/binary"; char * const args[] = { 0 }; - pid_t pid = -1; + PID_T_TYPE pid = -1; - int ret = posix_spawn (&pid, program, 0, 0, args, environ); + int ret = POSIX_SPAWN (&pid, program, 0, 0, args, environ); if (ret != ENOENT) { errno = ret; @@ -51,14 +52,13 @@ do_test (void) FAIL_EXIT1 ("posix_spawn returned pid != -1 (%i)", (int) pid); /* Check if no child is actually created. */ - ret = waitpid (-1, NULL, 0); - if (ret != -1 || errno != ECHILD) - FAIL_EXIT1 ("waitpid: %m)"); + TEST_COMPARE (WAITID (P_ALL, 0, NULL, WEXITED), -1); + TEST_COMPARE (errno, ECHILD); /* Same as before, but with posix_spawnp. */ char *args2[] = { (char*) program, 0 }; - ret = posix_spawnp (&pid, args2[0], 0, 0, args2, environ); + ret = POSIX_SPAWNP (&pid, args2[0], 0, 0, args2, environ); if (ret != ENOENT) { errno = ret; @@ -68,9 +68,8 @@ do_test (void) if (pid != -1) FAIL_EXIT1 ("posix_spawnp returned pid != -1 (%i)", (int) pid); - ret = waitpid (-1, NULL, 0); - if (ret != -1 || errno != ECHILD) - FAIL_EXIT1 ("waitpid: %m)"); + TEST_COMPARE (WAITID (P_ALL, 0, NULL, WEXITED), -1); + TEST_COMPARE (errno, ECHILD); return 0; } diff --git a/posix/tst-spawn3.c b/posix/tst-spawn3.c index e7ce0fb386..81161eb6de 100644 --- a/posix/tst-spawn3.c +++ b/posix/tst-spawn3.c @@ -27,9 +27,12 @@ #include <sys/resource.h> #include <fcntl.h> #include <paths.h> +#include <intprops.h> #include <support/check.h> #include <support/temp_file.h> +#include <support/xunistd.h> +#include <tst-spawn.h> static int do_test (void) @@ -48,7 +51,6 @@ do_test (void) struct rlimit rl; int max_fd = 24; - int ret; /* Set maximum number of file descriptor to a low value to avoid open too many files in environments where RLIMIT_NOFILE is large and to @@ -66,7 +68,7 @@ do_test (void) /* Exhauste the file descriptor limit with temporary files. */ int files[max_fd]; int nfiles = 0; - for (;;) + for (; nfiles < max_fd; nfiles++) { int fd = create_temp_file ("tst-spawn3.", NULL); if (fd == -1) @@ -75,75 +77,82 @@ do_test (void) FAIL_EXIT1 ("create_temp_file: %m"); break; } - files[nfiles++] = fd; + files[nfiles] = fd; } + TEST_VERIFY_EXIT (nfiles != 0); posix_spawn_file_actions_t a; - if (posix_spawn_file_actions_init (&a) != 0) - FAIL_EXIT1 ("posix_spawn_file_actions_init"); + TEST_COMPARE (posix_spawn_file_actions_init (&a), 0); /* Executes a /bin/sh echo $$ 2>&1 > ${objpfx}tst-spawn3.pid . */ const char pidfile[] = OBJPFX "tst-spawn3.pid"; - if (posix_spawn_file_actions_addopen (&a, STDOUT_FILENO, pidfile, O_WRONLY - | O_CREAT | O_TRUNC, 0644) != 0) - FAIL_EXIT1 ("posix_spawn_file_actions_addopen"); + TEST_COMPARE (posix_spawn_file_actions_addopen (&a, STDOUT_FILENO, pidfile, + O_WRONLY| O_CREAT | O_TRUNC, + 0644), + 0); - if (posix_spawn_file_actions_adddup2 (&a, STDOUT_FILENO, STDERR_FILENO) != 0) - FAIL_EXIT1 ("posix_spawn_file_actions_adddup2"); + TEST_COMPARE (posix_spawn_file_actions_adddup2 (&a, STDOUT_FILENO, + STDERR_FILENO), + 0); /* Since execve (called by posix_spawn) might require to open files to actually execute the shell script, setup to close the temporary file descriptors. */ - for (int i=0; i<nfiles; i++) - { - if (posix_spawn_file_actions_addclose (&a, files[i])) - FAIL_EXIT1 ("posix_spawn_file_actions_addclose"); - } + int maxnfiles = +#ifdef TST_SPAWN_PIDFD + /* The sparing file descriptor will be returned as the pid descriptor, + otherwise clone fail with EMFILE. */ + nfiles - 1; +#else + nfiles; +#endif + + for (int i=0; i<maxnfiles; i++) + TEST_COMPARE (posix_spawn_file_actions_addclose (&a, files[i]), 0); char *spawn_argv[] = { (char *) _PATH_BSHELL, (char *) "-c", (char *) "echo $$", NULL }; - pid_t pid; - if ((ret = posix_spawn (&pid, _PATH_BSHELL, &a, NULL, spawn_argv, NULL)) - != 0) - { - errno = ret; - FAIL_EXIT1 ("posix_spawn: %m"); - } - - int status; - int err = waitpid (pid, &status, 0); - if (err != pid) - FAIL_EXIT1 ("waitpid: %m"); + PID_T_TYPE pid; + + { + int r = POSIX_SPAWN (&pid, _PATH_BSHELL, &a, NULL, spawn_argv, NULL); + if (r == ENOSYS) + FAIL_UNSUPPORTED ("kernel does not support CLONE_PIDFD clone flag"); +#ifdef TST_SPAWN_PIDFD + TEST_COMPARE (r, EMFILE); + + /* Free up one file descriptor, so posix_spawn_pidfd_ex can return it. */ + xclose (files[nfiles-1]); + nfiles--; + r = POSIX_SPAWN (&pid, _PATH_BSHELL, &a, NULL, spawn_argv, NULL); +#endif + TEST_COMPARE (r, 0); + } + + siginfo_t sinfo; + TEST_COMPARE (WAITID (P_PID, pid, &sinfo, WEXITED), 0); + TEST_COMPARE (sinfo.si_code, CLD_EXITED); + TEST_COMPARE (sinfo.si_status, 0); /* Close the temporary files descriptor so it can check posix_spawn output. */ for (int i=0; i<nfiles; i++) - { - if (close (files[i])) - FAIL_EXIT1 ("close: %m"); - } + xclose (files[i]); - int pidfd = open (pidfile, O_RDONLY); - if (pidfd == -1) - FAIL_EXIT1 ("open: %m"); + int pidfd = xopen (pidfile, O_RDONLY, 0); - char buf[64]; - ssize_t n; - if ((n = read (pidfd, buf, sizeof (buf))) < 0) - FAIL_EXIT1 ("read: %m"); + char buf[INT_BUFSIZE_BOUND (pid_t)]; + ssize_t n = read (pidfd, buf, sizeof (buf)); + TEST_VERIFY (n < sizeof buf && n >= 0); - unlink (pidfile); + xunlink (pidfile); /* We only expect to read the PID. */ char *endp; long int rpid = strtol (buf, &endp, 10); - if (*endp != '\n') - FAIL_EXIT1 ("*endp != \'n\'"); - if (endp == buf) - FAIL_EXIT1 ("read empty line"); + TEST_VERIFY (*endp == '\n' && endp != buf); - if (rpid != pid) - FAIL_EXIT1 ("found \"%s\", expected pid %ld\n", buf, (long int) pid); + TEST_COMPARE (rpid, sinfo.si_pid); return 0; } diff --git a/posix/tst-spawn4.c b/posix/tst-spawn4.c index 327f04ea6c..8bf8bd52df 100644 --- a/posix/tst-spawn4.c +++ b/posix/tst-spawn4.c @@ -24,6 +24,7 @@ #include <support/xunistd.h> #include <support/check.h> #include <support/temp_file.h> +#include <tst-spawn.h> static int do_test (void) @@ -38,15 +39,15 @@ do_test (void) TEST_VERIFY_EXIT (chmod (scriptname, 0x775) == 0); - pid_t pid; + PID_T_TYPE pid; int status; /* Check if scripts without shebang are correctly not executed. */ - status = posix_spawn (&pid, scriptname, NULL, NULL, (char *[]) { 0 }, + status = POSIX_SPAWN (&pid, scriptname, NULL, NULL, (char *[]) { 0 }, (char *[]) { 0 }); TEST_VERIFY_EXIT (status == ENOEXEC); - status = posix_spawnp (&pid, scriptname, NULL, NULL, (char *[]) { 0 }, + status = POSIX_SPAWNP (&pid, scriptname, NULL, NULL, (char *[]) { 0 }, (char *[]) { 0 }); TEST_VERIFY_EXIT (status == ENOEXEC); diff --git a/posix/tst-spawn5.c b/posix/tst-spawn5.c index 6b3d11cf82..7850f3d7dd 100644 --- a/posix/tst-spawn5.c +++ b/posix/tst-spawn5.c @@ -33,6 +33,7 @@ #include <arch-fd_to_filename.h> #include <array_length.h> +#include <tst-spawn.h> /* Nonzero if the program gets called via `exec'. */ static int restart; @@ -161,14 +162,13 @@ spawn_closefrom_test (posix_spawn_file_actions_t *fa, int lowfd, int highfd, args[argc] = NULL; TEST_VERIFY (argc < argv_size); - pid_t pid; - int status; + PID_T_TYPE pid; + siginfo_t sinfo; - TEST_COMPARE (posix_spawn (&pid, args[0], fa, NULL, args, environ), 0); - TEST_COMPARE (xwaitpid (pid, &status, 0), pid); - TEST_VERIFY (WIFEXITED (status)); - TEST_VERIFY (!WIFSIGNALED (status)); - TEST_COMPARE (WEXITSTATUS (status), 0); + TEST_COMPARE (POSIX_SPAWN (&pid, args[0], fa, NULL, args, environ), 0); + TEST_COMPARE (WAITID (P_PID, pid, &sinfo, WEXITED), 0); + TEST_COMPARE (sinfo.si_code, CLD_EXITED); + TEST_COMPARE (sinfo.si_status, 0); } static void diff --git a/posix/tst-spawn6.c b/posix/tst-spawn6.c index 4e29d78168..94fb762f8b 100644 --- a/posix/tst-spawn6.c +++ b/posix/tst-spawn6.c @@ -32,6 +32,7 @@ #include <sys/ioctl.h> #include <stdlib.h> #include <termios.h> +#include <tst-spawn.h> #ifndef PATH_MAX # define PATH_MAX 1024 @@ -108,17 +109,15 @@ run_subprogram (int argc, char *argv[], const posix_spawnattr_t *attr, spargv[i] = NULL; pid_t pid; - TEST_COMPARE (posix_spawn (&pid, argv[1], actions, attr, spargv, environ), + TEST_COMPARE (POSIX_SPAWN (&pid, argv[1], actions, attr, spargv, environ), exp_err); if (exp_err != 0) return; - int status; - TEST_COMPARE (xwaitpid (pid, &status, WUNTRACED), pid); - TEST_VERIFY (WIFEXITED (status)); - TEST_VERIFY (!WIFSTOPPED (status)); - TEST_VERIFY (!WIFSIGNALED (status)); - TEST_COMPARE (WEXITSTATUS (status), 0); + siginfo_t sinfo; + TEST_COMPARE (WAITID (P_ALL, 0, &sinfo, WEXITED), 0); + TEST_COMPARE (sinfo.si_code, CLD_EXITED); + TEST_COMPARE (sinfo.si_status, 0); } static int diff --git a/posix/tst-spawn7.c b/posix/tst-spawn7.c index fb06915cb7..cc4498830b 100644 --- a/posix/tst-spawn7.c +++ b/posix/tst-spawn7.c @@ -24,7 +24,9 @@ #include <support/check.h> #include <support/xsignal.h> #include <support/xunistd.h> +#include <sys/wait.h> #include <unistd.h> +#include <tst-spawn.h> /* Nonzero if the program gets called via `exec'. */ #define CMDLINE_OPTIONS \ @@ -81,14 +83,13 @@ spawn_signal_test (const char *type, const posix_spawnattr_t *attr) { spargs[check_type_argc] = (char*) type; - pid_t pid; - int status; + PID_T_TYPE pid; + siginfo_t sinfo; TEST_COMPARE (posix_spawn (&pid, spargs[0], NULL, attr, spargs, environ), 0); - TEST_COMPARE (xwaitpid (pid, &status, 0), pid); - TEST_VERIFY (WIFEXITED (status)); - TEST_VERIFY (!WIFSIGNALED (status)); - TEST_COMPARE (WEXITSTATUS (status), 0); + TEST_COMPARE (WAITID (P_ALL, 0, &sinfo, WEXITED), 0); + TEST_COMPARE (sinfo.si_code, CLD_EXITED); + TEST_COMPARE (sinfo.si_status, 0); } static void |