1 /* Derived from the test case in
2    https://sourceware.org/bugzilla/show_bug.cgi?id=838.  */
3 #include <assert.h>
4 #include <errno.h>
5 #include <stdio.h>
6 #include <stdlib.h>
7 #include <unistd.h>
8 #include <sys/types.h>
9 #include <sys/wait.h>
10 #include <libc-diag.h>
11 
12 static void
sig_handler(int signum)13 sig_handler (int signum)
14 {
15   pid_t child = fork ();
16   if (child == 0)
17     exit (0);
18   TEMP_FAILURE_RETRY (waitpid (child, NULL, 0));
19 }
20 
21 static int
do_test(void)22 do_test (void)
23 {
24   pid_t parent = getpid ();
25 
26   struct sigaction action = { .sa_handler = sig_handler };
27   sigemptyset (&action.sa_mask);
28 
29   DIAG_PUSH_NEEDS_COMMENT;
30   DIAG_IGNORE_NEEDS_COMMENT (10, "-Wunused-result");
31   /* The result of malloc is deliberately ignored, so do not warn
32      about that.  */
33   malloc (sizeof (int));
34   DIAG_POP_NEEDS_COMMENT;
35 
36   if (sigaction (SIGALRM, &action, NULL) != 0)
37     {
38       puts ("sigaction failed");
39       return 1;
40     }
41 
42   /* Create a child that sends the signal to be caught.  */
43   pid_t child = fork ();
44   if (child == 0)
45     {
46       if (kill (parent, SIGALRM) == -1)
47 	perror ("kill");
48       exit (0);
49     }
50 
51   TEMP_FAILURE_RETRY (waitpid (child, NULL, 0));
52 
53   return 0;
54 }
55 
56 #define TEST_FUNCTION do_test ()
57 #include "../test-skeleton.c"
58