1 /* Test that an error from posix_spawn() is correctly propagated to the 2 parent. */ 3 4 #include <errno.h> 5 #include <stdio.h> 6 #include <stdlib.h> 7 #include <unistd.h> 8 #include <spawn.h> 9 10 int main(void) 11 { 12 int res = 1; 13 int err; 14 posix_spawn_file_actions_t file_actions; 15 char *argv_exe[] = {"true", NULL}; 16 char *envv_exe[] = {NULL}; 17 18 err = posix_spawn_file_actions_init(&file_actions); 19 if (err != 0) { 20 errno = err; 21 perror("posix_spawn_file_actions_init"); 22 return 1; 23 } 24 25 err = posix_spawn_file_actions_adddup2(&file_actions, 3, 4); 26 if (err != 0) { 27 errno = err; 28 perror("posix_spawn_file_actions_adddup2"); 29 goto out; 30 } 31 32 /* The following call to posix_spawn() should fail because the requested 33 dup2 action cannot be performed. */ 34 err = posix_spawn(NULL, "/bin/true", &file_actions, NULL, argv_exe, 35 envv_exe); 36 if (err != 0) { 37 errno = err; 38 perror("posix_spawn"); 39 goto out; 40 } 41 42 res = 0; 43 44 out: 45 err = posix_spawn_file_actions_destroy(&file_actions); 46 if (err != 0) { 47 errno = err; 48 perror("posix_spawn_file_actions_destroy"); 49 res = 1; 50 } 51 52 return res; 53 } 54 55