1/* Emergency actions in case of a fatal signal.
2 Copyright (C) 2003-2004, 2009-2019 Free Software Foundation, Inc.
3 Written by Bruno Haible <bruno@clisp.org>, 2003.
4
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 3 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program. If not, see <https://www.gnu.org/licenses/>. */
17
18
19#ifdef __cplusplus
20extern "C" {
21#endif
22
23
24/* It is often useful to do some cleanup action when a usually fatal signal
25 terminates the process, like removing a temporary file or killing a
26 subprocess that may be stuck waiting for a device, pipe or network input.
27 Such signals are SIGHUP, SIGINT, SIGPIPE, SIGTERM, and possibly others.
28 The limitation of this facility is that it cannot work for SIGKILL.
29
30 Signals with a SIG_IGN handler are considered to be non-fatal. The
31 functions in this file assume that when a SIG_IGN handler is installed
32 for a signal, it was installed before any functions in this file were
33 called and it stays so for the whole lifetime of the process. */
34
35/* Register a cleanup function to be executed when a catchable fatal signal
36 occurs.
37
38 Restrictions for the cleanup function:
39 - The cleanup function can do all kinds of system calls. It may also
40 modify (clobber) errno.
41 - It can also access application dependent memory locations and data
42 structures provided they are in a consistent state. One way to ensure
43 this is through block_fatal_signals()/unblock_fatal_signals(), see
44 below. Another - more tricky - way to ensure this is the careful use
45 of 'volatile'.
46 However,
47 - malloc() and similarly complex facilities are not safe to be called
48 because they are not guaranteed to be in a consistent state.
49 - Also, the cleanup function must not block the catchable fatal signals
50 and leave them blocked upon return.
51
52 The cleanup function is executed asynchronously. It is unspecified
53 whether during its execution the catchable fatal signals are blocked
54 or not. */
55extern void at_fatal_signal (_GL_ASYNC_SAFE void (*function) (int sig));
56
57
58/* Sometimes it is necessary to block the usually fatal signals while the
59 data structures being accessed by the cleanup action are being built or
60 reorganized. This is the case, for example, when a temporary file or
61 directory is created through mkstemp() or mkdtemp(), because these
62 functions create the temporary file or directory _before_ returning its
63 name to the application. */
64
65/* Temporarily delay the catchable fatal signals.
66 The signals will be blocked (= delayed) until the next call to
67 unblock_fatal_signals(). If the signals are already blocked, a further
68 call to block_fatal_signals() has no effect. */
69extern void block_fatal_signals (void);
70
71/* Stop delaying the catchable fatal signals. */
72extern void unblock_fatal_signals (void);
73
74
75/* Return the list of signals that block_fatal_signals/unblock_fatal_signals
76 would block or unblock.
77 Fills signals[0..count-1] and returns count. */
78extern unsigned int get_fatal_signals (int signals[64]);
79
80
81#ifdef __cplusplus
82}
83#endif
84