1 /* make sure we can vfork/exec across setjmp/longjmp's
2 * and make sure signal block masks don't get corrupted
13 #include <sys/types.h>
19 static int execute_child(const char *prog)
25 execlp(prog, prog, NULL);
26 perror("Could not execute specified prog");
28 } else if (child == 1)
31 return WEXITSTATUS(status);
36 static int check_sig_mask(void)
45 memset(&child_mask, 0x00, sizeof(child_mask));
46 ret = sigprocmask(SIG_BLOCK, NULL, &child_mask);
48 perror("could not get child sig block mask");
51 ret = memcmp(&orig_mask, &child_mask, sizeof(orig_mask));
53 printf("sigmsk: %08lx%08lx ", child_mask.__val[1], child_mask.__val[0]);
54 printf("sigmsk: %08lx%08lx ", orig_mask.__val[1], orig_mask.__val[0]);
58 } else if (child == 1)
61 return WEXITSTATUS(status);
64 int main(int argc, char *argv[])
70 /* values modified between setjmp/longjmp cannot be local to this func */
73 memset(&orig_mask, 0x00, sizeof(orig_mask));
74 ret = sigprocmask(SIG_BLOCK, NULL, &orig_mask);
76 perror("could not get orig sig block mask");
80 prog = (argc > 1 ? argv[1] : "true");
85 /* test vfork()/exec() inside of sigsetjmp/siglongjmp */
90 printf("sigsetjmp loop %i\n", cnt);
91 ret |= check_sig_mask();
92 ret |= execute_child(prog);
94 siglongjmp(sigenv, 0);
96 /* test vfork()/sigprocmask() inside of setjmp/longjmp */
101 printf("setjmp loop %i\n", cnt);
102 ret |= check_sig_mask();
103 ret |= execute_child(prog);