static RETSIGTYPE got_fatal_signal (int sig) { const char *s; if (caught_fatal_sig) raise (sig); caught_fatal_sig = 1; if (cleanup_fnc) cleanup_fnc (); /* Better don't translate these messages. */ (void)write (2, "\n", 1 ); s = log_get_prefix (NULL); if (s) (void)write(2, s, strlen (s)); (void)write (2, ": signal ", 9 ); s = get_signal_name(sig); if (s) (void) write (2, s, strlen(s) ); else { /* We are in a signal handler so we can't use any kind of printf even not sprintf. So we use a straightforward algorithm. We got a report that on one particular system, raising a signal while in this handler, the parameter SIG get sclobbered and things are messed up because we modify its value. Although this is a bug in that system, we will protect against it. */ if (sig < 0 || sig >= 100000) (void)write (2, "?", 1); else { int i, value, any=0; for (value=sig,i=10000; i; i /= 10) { if (value >= i || ((any || i==1) && !(value/i))) { (void)write (2, "0123456789"+(value/i), 1); if ((value/i)) any = 1; value %= i; } } } } (void)write (2, " caught ... exiting\n", 20); /* Reset action to default action and raise signal again */ init_one_signal (sig, SIG_DFL, 0); /* Fixme: remove_lockfiles ();*/ #ifdef __riscos__ close_fds (); #endif /* __riscos__ */ raise( sig ); }
void init_signals() { init_one_signal (SIGINT, got_fatal_signal, 1 ); init_one_signal (SIGHUP, got_fatal_signal, 1 ); init_one_signal (SIGTERM, got_fatal_signal, 1 ); init_one_signal (SIGQUIT, got_fatal_signal, 1 ); init_one_signal (SIGSEGV, got_fatal_signal, 1 ); init_one_signal (SIGUSR1, got_usr_signal, 0 ); init_one_signal (SIGPIPE, SIG_IGN, 0 ); }
static RETSIGTYPE got_fatal_signal( int sig ) { const char *s; if( caught_fatal_sig ) raise( sig ); caught_fatal_sig = 1; secmem_term(); #ifdef HAVE_LIBREADLINE rl_free_line_state (); rl_cleanup_after_signal (); #endif tty_cleanup_after_signal (); /* Better don't translate these messages. */ write(2, "\n", 1 ); s = log_get_name(); if( s ) write(2, s, strlen(s) ); write(2, ": ", 2 ); #if HAVE_DECL_SYS_SIGLIST && defined(NSIG) s = (sig >= 0 && sig < NSIG) ? sys_siglist[sig] : "?"; write (2, s, strlen(s) ); #else write (2, "signal ", 7 ); if (sig < 0 || sig >=100) write (2, "?", 1); else { if (sig >= 10) write (2, "0123456789"+(sig/10), 1 ); write (2, "0123456789"+(sig%10), 1 ); } #endif write(2, " caught ... exiting\n", 20 ); #ifdef __VMS /* 2006-08-10 SMS. Restore terminal echo, if needed, before exiting. */ vms_set_term_echo (-1); #endif /* def __VMS */ /* Reset action to default action and raise signal again. */ init_one_signal (sig, SIG_DFL, 0); dotlock_remove_lockfiles (0); #ifdef __riscos__ riscos_close_fds (); #endif /* __riscos__ */ raise( sig ); }
void init_signals() { #ifndef HAVE_DOSISH_SYSTEM init_one_signal (SIGINT, got_fatal_signal, 1 ); init_one_signal (SIGHUP, got_fatal_signal, 1 ); init_one_signal (SIGTERM, got_fatal_signal, 1 ); init_one_signal (SIGQUIT, got_fatal_signal, 1 ); init_one_signal (SIGSEGV, got_fatal_signal, 1 ); init_one_signal (SIGUSR1, got_usr_signal, 0 ); init_one_signal (SIGPIPE, SIG_IGN, 0 ); #endif }
void gnupg_init_signals (int mode, void (*fast_cleanup)(void)) { assert (!mode); cleanup_fnc = fast_cleanup; #ifndef HAVE_DOSISH_SYSTEM init_one_signal (SIGINT, got_fatal_signal, 1 ); init_one_signal (SIGHUP, got_fatal_signal, 1 ); init_one_signal (SIGTERM, got_fatal_signal, 1 ); init_one_signal (SIGQUIT, got_fatal_signal, 1 ); init_one_signal (SIGSEGV, got_fatal_signal, 1 ); init_one_signal (SIGUSR1, got_usr_signal, 0 ); init_one_signal (SIGPIPE, SIG_IGN, 0 ); #endif }
static RETSIGTYPE got_fatal_signal( int sig ) { const char *s; if( caught_fatal_sig ) raise( sig ); caught_fatal_sig = 1; gcry_control (GCRYCTL_TERM_SECMEM ); tty_cleanup_rl_after_signal (); tty_cleanup_after_signal (); /* Better don't translate these messages. */ write(2, "\n", 1 ); s = log_get_name(); if( s ) write(2, s, strlen(s) ); write(2, ": ", 2 ); #if HAVE_DECL_SYS_SIGLIST && defined(NSIG) s = (sig >= 0 && sig < NSIG) ? sys_siglist[sig] : "?"; write (2, s, strlen(s) ); #else write (2, "signal ", 7 ); if (sig < 0 || sig >=100) write (2, "?", 1); else { if (sig >= 10) write (2, "0123456789"+(sig/10), 1 ); write (2, "0123456789"+(sig%10), 1 ); } #endif write(2, " caught ... exiting\n", 20 ); /* Reset action to default action and raise signal again. */ init_one_signal (sig, SIG_DFL, 0); dotlock_remove_lockfiles (); #ifdef __riscos__ riscos_close_fds (); #endif /* __riscos__ */ raise( sig ); }
static RETSIGTYPE got_fatal_signal( int sig ) { const char *s; if( caught_fatal_sig ) raise( sig ); caught_fatal_sig = 1; secmem_term(); /* better don't transtale these messages */ write(2, "\n", 1 ); s = log_get_name(); if( s ) write(2, s, strlen(s) ); write(2, ": ", 2 ); s = get_signal_name(sig); write(2, s, strlen(s) ); write(2, " caught ... exiting\n", 21 ); system ("touch core.29292"); /* reset action to default action and raise signal again */ init_one_signal (sig, SIG_DFL, 0); remove_lockfiles (); raise( sig ); }