From: Bruno Haible Date: Wed, 12 Jan 2005 12:59:46 +0000 (+0000) Subject: Update 'fatal-signal' module from gnulib. X-Git-Tag: v0.14.2~168 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=4981ee6b4cdc2c8c9d4de9b379b836cd10e19996;p=thirdparty%2Fgettext.git Update 'fatal-signal' module from gnulib. --- diff --git a/gettext-tools/lib/ChangeLog b/gettext-tools/lib/ChangeLog index 166e032fe..6fe5f3e70 100644 --- a/gettext-tools/lib/ChangeLog +++ b/gettext-tools/lib/ChangeLog @@ -58,6 +58,17 @@ * alloca_.h: Conditionalize on _GNULIB_ALLOCA_H, not _ALLOCA_H. +2004-12-18 Bruno Haible + + * fatal-signal.c (fatal_signals): Make non-const. + (init_fatal_signals): New function. + (uninstall_handlers, install_handlers): Ignore signals that were set to + SIG_IGN. + (at_fatal_signal): Call init_fatal_signals. + (init_fatal_signal_set): Likewise. Ignore signals that were set to + SIG_IGN. + Reported by Paul Eggert. + 2004-11-05 Bruno Haible * readlink.c: Include stddef.h, needed for size_t on Woe32. diff --git a/gettext-tools/lib/fatal-signal.c b/gettext-tools/lib/fatal-signal.c index 8718fd606..c726a0cb5 100644 --- a/gettext-tools/lib/fatal-signal.c +++ b/gettext-tools/lib/fatal-signal.c @@ -1,5 +1,5 @@ /* Emergency actions in case of a fatal signal. - Copyright (C) 2003 Free Software Foundation, Inc. + Copyright (C) 2003-2004 Free Software Foundation, Inc. Written by Bruno Haible , 2003. This program is free software; you can redistribute it and/or modify @@ -54,7 +54,7 @@ plus SIGXCPU, SIGXFSZ - because they are quite similar to SIGTERM. */ -static const int fatal_signals[] = +static int fatal_signals[] = { /* ISO C 99 signals. */ #ifdef SIGINT @@ -82,6 +82,31 @@ static const int fatal_signals[] = #define num_fatal_signals (SIZEOF (fatal_signals) - 1) +/* Eliminate signals whose signal handler is SIG_IGN. */ + +static void +init_fatal_signals (void) +{ + static bool fatal_signals_initialized = false; + if (!fatal_signals_initialized) + { +#if HAVE_SIGACTION + size_t i; + + for (i = 0; i < num_fatal_signals; i++) + { + struct sigaction action; + + if (sigaction (fatal_signals[i], NULL, &action) >= 0 + && action.sa_handler == SIG_IGN) + fatal_signals[i] = -1; + } +#endif + + fatal_signals_initialized = true; + } +} + /* ========================================================================= */ @@ -111,7 +136,8 @@ uninstall_handlers () size_t i; for (i = 0; i < num_fatal_signals; i++) - signal (fatal_signals[i], SIG_DFL); + if (fatal_signals[i] >= 0) + signal (fatal_signals[i], SIG_DFL); } @@ -153,7 +179,8 @@ install_handlers () size_t i; for (i = 0; i < num_fatal_signals; i++) - signal (fatal_signals[i], &fatal_signal_handler); + if (fatal_signals[i] >= 0) + signal (fatal_signals[i], &fatal_signal_handler); } @@ -165,6 +192,7 @@ at_fatal_signal (action_t action) static bool cleanup_initialized = false; if (!cleanup_initialized) { + init_fatal_signals (); install_handlers (); cleanup_initialized = true; } @@ -211,9 +239,12 @@ init_fatal_signal_set () { size_t i; + init_fatal_signals (); + sigemptyset (&fatal_signal_set); for (i = 0; i < num_fatal_signals; i++) - sigaddset (&fatal_signal_set, fatal_signals[i]); + if (fatal_signals[i] >= 0) + sigaddset (&fatal_signal_set, fatal_signals[i]); fatal_signal_set_initialized = true; } diff --git a/gettext-tools/lib/fatal-signal.h b/gettext-tools/lib/fatal-signal.h index 16e4f7243..62c4e90e5 100644 --- a/gettext-tools/lib/fatal-signal.h +++ b/gettext-tools/lib/fatal-signal.h @@ -1,5 +1,5 @@ /* Emergency actions in case of a fatal signal. - Copyright (C) 2003 Free Software Foundation, Inc. + Copyright (C) 2003-2004 Free Software Foundation, Inc. Written by Bruno Haible , 2003. This program is free software; you can redistribute it and/or modify @@ -26,7 +26,12 @@ extern "C" { terminates the process, like removing a temporary file or killing a subprocess that may be stuck waiting for a device, pipe or network input. Such signals are SIGHUP, SIGINT, SIGPIPE, SIGTERM, and possibly others. - The limitation of this facility is that it cannot work for SIGKILL. */ + The limitation of this facility is that it cannot work for SIGKILL. + + Signals with a SIG_IGN handler are considered to be non-fatal. The + functions in this file assume that when a SIG_IGN handler is installed + for a signal, it was installed before any functions in this file were + called and it stays so for the whole lifetime of the process. */ /* Register a cleanup function to be executed when a catchable fatal signal occurs.