/* Test that an error from posix_spawn() is correctly propagated to the parent. */ #include <errno.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <spawn.h> int main(void) { int res = 1; int err; posix_spawn_file_actions_t file_actions; char *argv_exe[] = {"true", NULL}; char *envv_exe[] = {NULL}; err = posix_spawn_file_actions_init(&file_actions); if (err != 0) { errno = err; perror("posix_spawn_file_actions_init"); return 1; } err = posix_spawn_file_actions_adddup2(&file_actions, 3, 4); if (err != 0) { errno = err; perror("posix_spawn_file_actions_adddup2"); goto out; } /* The following call to posix_spawn() should fail because the requested dup2 action cannot be performed. */ err = posix_spawn(NULL, "/bin/true", &file_actions, NULL, argv_exe, envv_exe); if (err != 0) { errno = err; perror("posix_spawn"); goto out; } res = 0; out: err = posix_spawn_file_actions_destroy(&file_actions); if (err != 0) { errno = err; perror("posix_spawn_file_actions_destroy"); res = 1; } return res; }