• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
main(void)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