1 | /*------------------------------------------------------------------------- |
2 | * |
3 | * pqsignal.c |
4 | * Backend signal(2) support (see also src/port/pqsignal.c) |
5 | * |
6 | * Portions Copyright (c) 1996-2019, PostgreSQL Global Development Group |
7 | * Portions Copyright (c) 1994, Regents of the University of California |
8 | * |
9 | * |
10 | * IDENTIFICATION |
11 | * src/backend/libpq/pqsignal.c |
12 | * |
13 | * ------------------------------------------------------------------------ |
14 | */ |
15 | |
16 | #include "postgres.h" |
17 | |
18 | #include "libpq/pqsignal.h" |
19 | |
20 | |
21 | /* Global variables */ |
22 | sigset_t UnBlockSig, |
23 | BlockSig, |
24 | StartupBlockSig; |
25 | |
26 | |
27 | /* |
28 | * Initialize BlockSig, UnBlockSig, and StartupBlockSig. |
29 | * |
30 | * BlockSig is the set of signals to block when we are trying to block |
31 | * signals. This includes all signals we normally expect to get, but NOT |
32 | * signals that should never be turned off. |
33 | * |
34 | * StartupBlockSig is the set of signals to block during startup packet |
35 | * collection; it's essentially BlockSig minus SIGTERM, SIGQUIT, SIGALRM. |
36 | * |
37 | * UnBlockSig is the set of signals to block when we don't want to block |
38 | * signals (is this ever nonzero??) |
39 | */ |
40 | void |
41 | pqinitmask(void) |
42 | { |
43 | sigemptyset(&UnBlockSig); |
44 | |
45 | /* First set all signals, then clear some. */ |
46 | sigfillset(&BlockSig); |
47 | sigfillset(&StartupBlockSig); |
48 | |
49 | /* |
50 | * Unmark those signals that should never be blocked. Some of these signal |
51 | * names don't exist on all platforms. Most do, but might as well ifdef |
52 | * them all for consistency... |
53 | */ |
54 | #ifdef SIGTRAP |
55 | sigdelset(&BlockSig, SIGTRAP); |
56 | sigdelset(&StartupBlockSig, SIGTRAP); |
57 | #endif |
58 | #ifdef SIGABRT |
59 | sigdelset(&BlockSig, SIGABRT); |
60 | sigdelset(&StartupBlockSig, SIGABRT); |
61 | #endif |
62 | #ifdef SIGILL |
63 | sigdelset(&BlockSig, SIGILL); |
64 | sigdelset(&StartupBlockSig, SIGILL); |
65 | #endif |
66 | #ifdef SIGFPE |
67 | sigdelset(&BlockSig, SIGFPE); |
68 | sigdelset(&StartupBlockSig, SIGFPE); |
69 | #endif |
70 | #ifdef SIGSEGV |
71 | sigdelset(&BlockSig, SIGSEGV); |
72 | sigdelset(&StartupBlockSig, SIGSEGV); |
73 | #endif |
74 | #ifdef SIGBUS |
75 | sigdelset(&BlockSig, SIGBUS); |
76 | sigdelset(&StartupBlockSig, SIGBUS); |
77 | #endif |
78 | #ifdef SIGSYS |
79 | sigdelset(&BlockSig, SIGSYS); |
80 | sigdelset(&StartupBlockSig, SIGSYS); |
81 | #endif |
82 | #ifdef SIGCONT |
83 | sigdelset(&BlockSig, SIGCONT); |
84 | sigdelset(&StartupBlockSig, SIGCONT); |
85 | #endif |
86 | |
87 | /* Signals unique to startup */ |
88 | #ifdef SIGQUIT |
89 | sigdelset(&StartupBlockSig, SIGQUIT); |
90 | #endif |
91 | #ifdef SIGTERM |
92 | sigdelset(&StartupBlockSig, SIGTERM); |
93 | #endif |
94 | #ifdef SIGALRM |
95 | sigdelset(&StartupBlockSig, SIGALRM); |
96 | #endif |
97 | } |
98 | |