annotate lib/fatal-signal.c @ 6259:96c32553b4c6

Use a consistent style for including <config.h>. * __fpending.c, acl.c, argmatch.c, argp-help.c, argp-parse.c, argp-pvh.c, backupfile.c, basename.c, c-stack.c, calloc.c, check-version.c, cloexec.c, closeout.c, copy-file.c, creat-safer.c, cycle-check.c, dirfd.c, dirname.c, dup-safer.c, dup2.c, euidaccess.c, exclude.c, exitfail.c, fatal-signal.c, fd-safer.c, file-type.c, fileblocks.c, filemode.c, filenamecat.c, findprog.c, fnmatch.c, fopen-safer.c, free.c, fsusage.c, ftruncate.c, full-write.c, fwriteerror.c, getaddrinfo.c, getcwd.c, getdelim.c, getline.c, getlogin_r.c, getndelim2.c, getnline.c, getopt1.c, getpass.c, group-member.c, hard-locale.c, hash-pjw.c, hash.c, human.c, idcache.c, inet_ntop.c, isdir.c, long-options.c, malloc.c, memcasecmp.c, memcmp.c, memcoll.c, memcpy.c, memmove.c, mkdir-p.c, modechange.c, mountlist.c, open-safer.c, physmem.c, pipe-safer.c, pipe.c, poll.c, posixver.c, progname.c, progreloc.c, putenv.c, quote.c, quotearg.c, readline.c, readlink.c, realloc.c, regex.c, rename.c, rmdir.c, rpmatch.c, safe-read.c, same.c, save-cwd.c, savedir.c, sig2str.c, strcspn.c, strerror.c, stripslash.c, strncasecmp.c, strndup.c, strnlen.c, strnlen1.c, strsep.c, strstr.c, strtod.c, strtoimax.c, strtol.c, strverscmp.c, tempname.c, time_r.c, userspec.c, utimecmp.c, version-etc-fsf.c, version-etc.c, wait-process.c, xalloc-die.c, xgetcwd.c, xmalloc.c, xmemcoll.c, xnanosleep.c, xreadlink.c, xsetenv.c, xstrndup.c, xstrtoimax.c, xstrtol.c, xstrtoumax.c, yesno.c: Standardize inclusion of config.h. * __fpending.h, dirfd.h, getdate.h, human.h, inttostr.h: Removed inclusion of config.h from header files. * inttostr.c: Adjusted in-tree users. * timespec.h: Remove superfluous warning to include config.h. * atexit.c, chdir-long.c chown.c, fchown-stub.c, getgroups.c, gettimeofday.c, lchown.c, lstat.c, mkdir.c, mkstemp.c, nanosleep.c, openat.c, raise.c, readtokens0.c, readutmp.c, unlinkdir.c: Guard inclusion of config.h with HAVE_CONFIG_H.
author Paul Eggert <eggert@cs.ucla.edu>
date Mon, 19 Sep 2005 17:28:14 +0000
parents a48fb0e98c8c
children 1b0092424a44
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4770
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1 /* Emergency actions in case of a fatal signal.
5536
f64f1da7e350 Signals whose handler is set to SIG_IGN are not fatal.
Bruno Haible <bruno@clisp.org>
parents: 4786
diff changeset
2 Copyright (C) 2003-2004 Free Software Foundation, Inc.
4770
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
3 Written by Bruno Haible <bruno@clisp.org>, 2003.
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
4
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
5 This program is free software; you can redistribute it and/or modify
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
6 it under the terms of the GNU General Public License as published by
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
7 the Free Software Foundation; either version 2, or (at your option)
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
8 any later version.
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
9
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
10 This program is distributed in the hope that it will be useful,
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
13 GNU General Public License for more details.
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
14
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
15 You should have received a copy of the GNU General Public License
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
16 along with this program; if not, write to the Free Software Foundation,
5848
a48fb0e98c8c *** empty log message ***
Paul Eggert <eggert@cs.ucla.edu>
parents: 5537
diff changeset
17 Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
4770
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
18
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
19
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
20 #ifdef HAVE_CONFIG_H
6259
96c32553b4c6 Use a consistent style for including <config.h>.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5848
diff changeset
21 # include <config.h>
4770
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
22 #endif
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
23
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
24 /* Specification. */
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
25 #include "fatal-signal.h"
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
26
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
27 #include <stdbool.h>
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
28 #include <stdlib.h>
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
29 #include <signal.h>
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
30 #include <string.h>
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
31 #if HAVE_UNISTD_H
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
32 # include <unistd.h>
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
33 #endif
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
34
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
35 #include "xalloc.h"
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
36
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
37 #define SIZEOF(a) (sizeof(a) / sizeof(a[0]))
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
38
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
39
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
40 /* ========================================================================= */
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
41
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
42
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
43 /* The list of fatal signals.
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
44 These are those signals whose default action is to terminate the process
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
45 without a core dump, except
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
46 SIGKILL - because it cannot be caught,
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
47 SIGALRM SIGUSR1 SIGUSR2 SIGPOLL SIGIO SIGLOST - because applications
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
48 often use them for their own purpose,
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
49 SIGPROF SIGVTALRM - because they are used for profiling,
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
50 SIGSTKFLT - because it is more similar to SIGFPE, SIGSEGV, SIGBUS,
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
51 SIGSYS - because it is more similar to SIGABRT, SIGSEGV,
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
52 SIGPWR - because it of too special use,
4786
83d8d561903a Improved 'fatal-signal' module.
Bruno Haible <bruno@clisp.org>
parents: 4770
diff changeset
53 SIGRTMIN...SIGRTMAX - because they are reserved for application use.
4770
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
54 plus
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
55 SIGXCPU, SIGXFSZ - because they are quite similar to SIGTERM. */
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
56
5536
f64f1da7e350 Signals whose handler is set to SIG_IGN are not fatal.
Bruno Haible <bruno@clisp.org>
parents: 4786
diff changeset
57 static int fatal_signals[] =
4770
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
58 {
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
59 /* ISO C 99 signals. */
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
60 #ifdef SIGINT
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
61 SIGINT,
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
62 #endif
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
63 #ifdef SIGTERM
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
64 SIGTERM,
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
65 #endif
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
66 /* POSIX:2001 signals. */
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
67 #ifdef SIGHUP
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
68 SIGHUP,
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
69 #endif
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
70 #ifdef SIGPIPE
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
71 SIGPIPE,
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
72 #endif
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
73 /* BSD signals. */
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
74 #ifdef SIGXCPU
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
75 SIGXCPU,
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
76 #endif
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
77 #ifdef SIGXFSZ
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
78 SIGXFSZ,
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
79 #endif
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
80 0
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
81 };
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
82
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
83 #define num_fatal_signals (SIZEOF (fatal_signals) - 1)
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
84
5536
f64f1da7e350 Signals whose handler is set to SIG_IGN are not fatal.
Bruno Haible <bruno@clisp.org>
parents: 4786
diff changeset
85 /* Eliminate signals whose signal handler is SIG_IGN. */
f64f1da7e350 Signals whose handler is set to SIG_IGN are not fatal.
Bruno Haible <bruno@clisp.org>
parents: 4786
diff changeset
86
f64f1da7e350 Signals whose handler is set to SIG_IGN are not fatal.
Bruno Haible <bruno@clisp.org>
parents: 4786
diff changeset
87 static void
f64f1da7e350 Signals whose handler is set to SIG_IGN are not fatal.
Bruno Haible <bruno@clisp.org>
parents: 4786
diff changeset
88 init_fatal_signals (void)
f64f1da7e350 Signals whose handler is set to SIG_IGN are not fatal.
Bruno Haible <bruno@clisp.org>
parents: 4786
diff changeset
89 {
f64f1da7e350 Signals whose handler is set to SIG_IGN are not fatal.
Bruno Haible <bruno@clisp.org>
parents: 4786
diff changeset
90 static bool fatal_signals_initialized = false;
f64f1da7e350 Signals whose handler is set to SIG_IGN are not fatal.
Bruno Haible <bruno@clisp.org>
parents: 4786
diff changeset
91 if (!fatal_signals_initialized)
f64f1da7e350 Signals whose handler is set to SIG_IGN are not fatal.
Bruno Haible <bruno@clisp.org>
parents: 4786
diff changeset
92 {
5537
0fc3beabfb42 Portability fix: Don't assume sigaction(). (mingw doesn't have it.)
Bruno Haible <bruno@clisp.org>
parents: 5536
diff changeset
93 #if HAVE_SIGACTION
5536
f64f1da7e350 Signals whose handler is set to SIG_IGN are not fatal.
Bruno Haible <bruno@clisp.org>
parents: 4786
diff changeset
94 size_t i;
f64f1da7e350 Signals whose handler is set to SIG_IGN are not fatal.
Bruno Haible <bruno@clisp.org>
parents: 4786
diff changeset
95
f64f1da7e350 Signals whose handler is set to SIG_IGN are not fatal.
Bruno Haible <bruno@clisp.org>
parents: 4786
diff changeset
96 for (i = 0; i < num_fatal_signals; i++)
f64f1da7e350 Signals whose handler is set to SIG_IGN are not fatal.
Bruno Haible <bruno@clisp.org>
parents: 4786
diff changeset
97 {
f64f1da7e350 Signals whose handler is set to SIG_IGN are not fatal.
Bruno Haible <bruno@clisp.org>
parents: 4786
diff changeset
98 struct sigaction action;
f64f1da7e350 Signals whose handler is set to SIG_IGN are not fatal.
Bruno Haible <bruno@clisp.org>
parents: 4786
diff changeset
99
f64f1da7e350 Signals whose handler is set to SIG_IGN are not fatal.
Bruno Haible <bruno@clisp.org>
parents: 4786
diff changeset
100 if (sigaction (fatal_signals[i], NULL, &action) >= 0
f64f1da7e350 Signals whose handler is set to SIG_IGN are not fatal.
Bruno Haible <bruno@clisp.org>
parents: 4786
diff changeset
101 && action.sa_handler == SIG_IGN)
f64f1da7e350 Signals whose handler is set to SIG_IGN are not fatal.
Bruno Haible <bruno@clisp.org>
parents: 4786
diff changeset
102 fatal_signals[i] = -1;
f64f1da7e350 Signals whose handler is set to SIG_IGN are not fatal.
Bruno Haible <bruno@clisp.org>
parents: 4786
diff changeset
103 }
5537
0fc3beabfb42 Portability fix: Don't assume sigaction(). (mingw doesn't have it.)
Bruno Haible <bruno@clisp.org>
parents: 5536
diff changeset
104 #endif
5536
f64f1da7e350 Signals whose handler is set to SIG_IGN are not fatal.
Bruno Haible <bruno@clisp.org>
parents: 4786
diff changeset
105
f64f1da7e350 Signals whose handler is set to SIG_IGN are not fatal.
Bruno Haible <bruno@clisp.org>
parents: 4786
diff changeset
106 fatal_signals_initialized = true;
f64f1da7e350 Signals whose handler is set to SIG_IGN are not fatal.
Bruno Haible <bruno@clisp.org>
parents: 4786
diff changeset
107 }
f64f1da7e350 Signals whose handler is set to SIG_IGN are not fatal.
Bruno Haible <bruno@clisp.org>
parents: 4786
diff changeset
108 }
f64f1da7e350 Signals whose handler is set to SIG_IGN are not fatal.
Bruno Haible <bruno@clisp.org>
parents: 4786
diff changeset
109
4770
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
110
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
111 /* ========================================================================= */
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
112
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
113
4786
83d8d561903a Improved 'fatal-signal' module.
Bruno Haible <bruno@clisp.org>
parents: 4770
diff changeset
114 typedef void (*action_t) (void);
83d8d561903a Improved 'fatal-signal' module.
Bruno Haible <bruno@clisp.org>
parents: 4770
diff changeset
115
83d8d561903a Improved 'fatal-signal' module.
Bruno Haible <bruno@clisp.org>
parents: 4770
diff changeset
116 /* Type of an entry in the actions array.
83d8d561903a Improved 'fatal-signal' module.
Bruno Haible <bruno@clisp.org>
parents: 4770
diff changeset
117 The 'action' field is accessed from within the fatal_signal_handler(),
83d8d561903a Improved 'fatal-signal' module.
Bruno Haible <bruno@clisp.org>
parents: 4770
diff changeset
118 therefore we mark it as 'volatile'. */
83d8d561903a Improved 'fatal-signal' module.
Bruno Haible <bruno@clisp.org>
parents: 4770
diff changeset
119 typedef struct
83d8d561903a Improved 'fatal-signal' module.
Bruno Haible <bruno@clisp.org>
parents: 4770
diff changeset
120 {
83d8d561903a Improved 'fatal-signal' module.
Bruno Haible <bruno@clisp.org>
parents: 4770
diff changeset
121 volatile action_t action;
83d8d561903a Improved 'fatal-signal' module.
Bruno Haible <bruno@clisp.org>
parents: 4770
diff changeset
122 }
83d8d561903a Improved 'fatal-signal' module.
Bruno Haible <bruno@clisp.org>
parents: 4770
diff changeset
123 actions_entry_t;
83d8d561903a Improved 'fatal-signal' module.
Bruno Haible <bruno@clisp.org>
parents: 4770
diff changeset
124
4770
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
125 /* The registered cleanup actions. */
4786
83d8d561903a Improved 'fatal-signal' module.
Bruno Haible <bruno@clisp.org>
parents: 4770
diff changeset
126 static actions_entry_t static_actions[32];
83d8d561903a Improved 'fatal-signal' module.
Bruno Haible <bruno@clisp.org>
parents: 4770
diff changeset
127 static actions_entry_t * volatile actions = static_actions;
83d8d561903a Improved 'fatal-signal' module.
Bruno Haible <bruno@clisp.org>
parents: 4770
diff changeset
128 static sig_atomic_t volatile actions_count = 0;
4770
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
129 static size_t actions_allocated = SIZEOF (static_actions);
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
130
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
131
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
132 /* Uninstall the handlers. */
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
133 static inline void
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
134 uninstall_handlers ()
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
135 {
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
136 size_t i;
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
137
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
138 for (i = 0; i < num_fatal_signals; i++)
5536
f64f1da7e350 Signals whose handler is set to SIG_IGN are not fatal.
Bruno Haible <bruno@clisp.org>
parents: 4786
diff changeset
139 if (fatal_signals[i] >= 0)
f64f1da7e350 Signals whose handler is set to SIG_IGN are not fatal.
Bruno Haible <bruno@clisp.org>
parents: 4786
diff changeset
140 signal (fatal_signals[i], SIG_DFL);
4770
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
141 }
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
142
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
143
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
144 /* The signal handler. It gets called asynchronously. */
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
145 static void
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
146 fatal_signal_handler (int sig)
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
147 {
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
148 for (;;)
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
149 {
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
150 /* Get the last registered cleanup action, in a reentrant way. */
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
151 action_t action;
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
152 size_t n = actions_count;
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
153 if (n == 0)
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
154 break;
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
155 n--;
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
156 actions_count = n;
4786
83d8d561903a Improved 'fatal-signal' module.
Bruno Haible <bruno@clisp.org>
parents: 4770
diff changeset
157 action = actions[n].action;
4770
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
158 /* Execute the action. */
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
159 action ();
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
160 }
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
161
4786
83d8d561903a Improved 'fatal-signal' module.
Bruno Haible <bruno@clisp.org>
parents: 4770
diff changeset
162 /* Now execute the signal's default action.
83d8d561903a Improved 'fatal-signal' module.
Bruno Haible <bruno@clisp.org>
parents: 4770
diff changeset
163 If signal() blocks the signal being delivered for the duration of the
83d8d561903a Improved 'fatal-signal' module.
Bruno Haible <bruno@clisp.org>
parents: 4770
diff changeset
164 signal handler's execution, the re-raised signal is delivered when this
83d8d561903a Improved 'fatal-signal' module.
Bruno Haible <bruno@clisp.org>
parents: 4770
diff changeset
165 handler returns; otherwise it is delivered already during raise(). */
4770
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
166 uninstall_handlers ();
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
167 #if HAVE_RAISE
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
168 raise (sig);
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
169 #else
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
170 kill (getpid (), sig);
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
171 #endif
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
172 }
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
173
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
174
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
175 /* Install the handlers. */
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
176 static inline void
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
177 install_handlers ()
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
178 {
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
179 size_t i;
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
180
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
181 for (i = 0; i < num_fatal_signals; i++)
5536
f64f1da7e350 Signals whose handler is set to SIG_IGN are not fatal.
Bruno Haible <bruno@clisp.org>
parents: 4786
diff changeset
182 if (fatal_signals[i] >= 0)
f64f1da7e350 Signals whose handler is set to SIG_IGN are not fatal.
Bruno Haible <bruno@clisp.org>
parents: 4786
diff changeset
183 signal (fatal_signals[i], &fatal_signal_handler);
4770
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
184 }
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
185
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
186
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
187 /* Register a cleanup function to be executed when a catchable fatal signal
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
188 occurs. */
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
189 void
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
190 at_fatal_signal (action_t action)
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
191 {
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
192 static bool cleanup_initialized = false;
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
193 if (!cleanup_initialized)
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
194 {
5536
f64f1da7e350 Signals whose handler is set to SIG_IGN are not fatal.
Bruno Haible <bruno@clisp.org>
parents: 4786
diff changeset
195 init_fatal_signals ();
4770
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
196 install_handlers ();
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
197 cleanup_initialized = true;
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
198 }
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
199
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
200 if (actions_count == actions_allocated)
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
201 {
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
202 /* Extend the actions array. Note that we cannot use xrealloc(),
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
203 because then the cleanup() function could access an already
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
204 deallocated array. */
4786
83d8d561903a Improved 'fatal-signal' module.
Bruno Haible <bruno@clisp.org>
parents: 4770
diff changeset
205 actions_entry_t *old_actions = actions;
4770
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
206 size_t new_actions_allocated = 2 * actions_allocated;
4786
83d8d561903a Improved 'fatal-signal' module.
Bruno Haible <bruno@clisp.org>
parents: 4770
diff changeset
207 actions_entry_t *new_actions =
83d8d561903a Improved 'fatal-signal' module.
Bruno Haible <bruno@clisp.org>
parents: 4770
diff changeset
208 xmalloc (new_actions_allocated * sizeof (actions_entry_t));
4770
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
209
4786
83d8d561903a Improved 'fatal-signal' module.
Bruno Haible <bruno@clisp.org>
parents: 4770
diff changeset
210 memcpy (new_actions, old_actions,
83d8d561903a Improved 'fatal-signal' module.
Bruno Haible <bruno@clisp.org>
parents: 4770
diff changeset
211 actions_allocated * sizeof (actions_entry_t));
4770
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
212 actions = new_actions;
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
213 actions_allocated = new_actions_allocated;
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
214 /* Now we can free the old actions array. */
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
215 if (old_actions != static_actions)
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
216 free (old_actions);
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
217 }
4786
83d8d561903a Improved 'fatal-signal' module.
Bruno Haible <bruno@clisp.org>
parents: 4770
diff changeset
218 /* The two uses of 'volatile' in the types above (and ISO C 99 section
83d8d561903a Improved 'fatal-signal' module.
Bruno Haible <bruno@clisp.org>
parents: 4770
diff changeset
219 5.1.2.3.(5)) ensure that we increment the actions_count only after
83d8d561903a Improved 'fatal-signal' module.
Bruno Haible <bruno@clisp.org>
parents: 4770
diff changeset
220 the new action has been written to the memory location
83d8d561903a Improved 'fatal-signal' module.
Bruno Haible <bruno@clisp.org>
parents: 4770
diff changeset
221 actions[actions_count]. */
83d8d561903a Improved 'fatal-signal' module.
Bruno Haible <bruno@clisp.org>
parents: 4770
diff changeset
222 actions[actions_count].action = action;
4770
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
223 actions_count++;
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
224 }
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
225
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
226
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
227 /* ========================================================================= */
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
228
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
229
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
230 #if HAVE_POSIX_SIGNALBLOCKING
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
231
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
232 static sigset_t fatal_signal_set;
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
233
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
234 static void
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
235 init_fatal_signal_set ()
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
236 {
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
237 static bool fatal_signal_set_initialized = false;
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
238 if (!fatal_signal_set_initialized)
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
239 {
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
240 size_t i;
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
241
5536
f64f1da7e350 Signals whose handler is set to SIG_IGN are not fatal.
Bruno Haible <bruno@clisp.org>
parents: 4786
diff changeset
242 init_fatal_signals ();
f64f1da7e350 Signals whose handler is set to SIG_IGN are not fatal.
Bruno Haible <bruno@clisp.org>
parents: 4786
diff changeset
243
4770
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
244 sigemptyset (&fatal_signal_set);
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
245 for (i = 0; i < num_fatal_signals; i++)
5536
f64f1da7e350 Signals whose handler is set to SIG_IGN are not fatal.
Bruno Haible <bruno@clisp.org>
parents: 4786
diff changeset
246 if (fatal_signals[i] >= 0)
f64f1da7e350 Signals whose handler is set to SIG_IGN are not fatal.
Bruno Haible <bruno@clisp.org>
parents: 4786
diff changeset
247 sigaddset (&fatal_signal_set, fatal_signals[i]);
4770
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
248
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
249 fatal_signal_set_initialized = true;
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
250 }
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
251 }
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
252
4786
83d8d561903a Improved 'fatal-signal' module.
Bruno Haible <bruno@clisp.org>
parents: 4770
diff changeset
253 /* Temporarily delay the catchable fatal signals. */
4770
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
254 void
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
255 block_fatal_signals ()
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
256 {
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
257 init_fatal_signal_set ();
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
258 sigprocmask (SIG_BLOCK, &fatal_signal_set, NULL);
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
259 }
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
260
4786
83d8d561903a Improved 'fatal-signal' module.
Bruno Haible <bruno@clisp.org>
parents: 4770
diff changeset
261 /* Stop delaying the catchable fatal signals. */
4770
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
262 void
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
263 unblock_fatal_signals ()
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
264 {
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
265 init_fatal_signal_set ();
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
266 sigprocmask (SIG_UNBLOCK, &fatal_signal_set, NULL);
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
267 }
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
268
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
269 #else
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
270
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
271 /* Don't bother caring about the old systems which don't have POSIX signal
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
272 blocking. */
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
273
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
274 void
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
275 block_fatal_signals ()
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
276 {
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
277 }
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
278
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
279 void
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
280 unblock_fatal_signals ()
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
281 {
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
282 }
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
283
6708dc21dacc New module 'fatal-signal'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
284 #endif