1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <errno.h>
3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdio.h>
4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <signal.h>
5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdlib.h>
6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void
8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownabend (int sig)
9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  printf ("Abended on signal %d\n", sig);
11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  exit (2);
12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint
15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownmain (void)
16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  struct sigaction  sa;
18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  int i;
20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  int rc;
21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  for (i = 1; i <= 65; i++) {
22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     // Skip signals 32 and 33, since these are used by LinuxThreads. Some
23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     // glibc versions do not invoke the sigaction system call for these
24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     // signals.
25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     // skip signals 63 and 64: some systems say "warning, ignored attempt
26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     // to catch 32 because it's used internally by Valgrind", others say
27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     // "invalid argument".
28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     if (i == 32 || i == 33 || i == 63 || i == 64) {
29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        continue;
30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     }                  // different systems
31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     sa.sa_flags   = 0;
32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     sigemptyset( &sa.sa_mask );
33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     sa.sa_handler = abend;
34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     fprintf(stderr,"setting signal %d: ", i);
35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     rc = sigaction (i /*SIGKILL*/, &sa, NULL);
36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     if (rc) perror ("");
37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     else fprintf(stderr,"Success\n");
38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     fprintf(stderr,"getting signal %d: ", i);
39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     rc = sigaction (i /*SIGKILL*/, NULL, &sa);
40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     if (rc) perror ("");
41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     else fprintf(stderr,"Success\n");
42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     fprintf(stderr,"\n");
43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  }
44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  return 0;
45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
46