1
0
mirror of git://git.gnupg.org/gnupg.git synced 2024-06-16 00:29:50 +02:00

(got_fatal_signal): Print the signal number if we can't

get a name for it.
(get_signal_name): Return NULL if no name is available.
This commit is contained in:
Werner Koch 2005-05-13 12:37:52 +00:00
parent 2fb1abb849
commit d8718bd67f
2 changed files with 39 additions and 6 deletions

View File

@ -1,3 +1,9 @@
2005-05-13 Werner Koch <wk@g10code.com>
* signal.c (got_fatal_signal): Print the signal number if we can't
get a name for it.
(get_signal_name): Return NULL if no name is available.
2005-04-17 Werner Koch <wk@g10code.com> 2005-04-17 Werner Koch <wk@g10code.com>
* sexputil.c (cmp_simple_canon_sexp): New. * sexputil.c (cmp_simple_canon_sexp): New.

View File

@ -1,5 +1,6 @@
/* signal.c - signal handling /* signal.c - signal handling
* Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. * Copyright (C) 1998, 1999, 2000, 2001, 2002,
* 2005 Free Software Foundation, Inc.
* *
* This file is part of GnuPG. * This file is part of GnuPG.
* *
@ -73,10 +74,12 @@ init_one_signal (int sig, RETSIGTYPE (*handler)(int), int check_ign )
static const char * static const char *
get_signal_name( int signum ) get_signal_name( int signum )
{ {
/* Note that we can't use strsignal(), because it is not
reentrant. */
#if defined(SYS_SIGLIST_DECLARED) && defined(NSIG) #if defined(SYS_SIGLIST_DECLARED) && defined(NSIG)
return (signum >= 0 && signum < NSIG) ? sys_siglist[signum] : "?"; return (signum >= 0 && signum < NSIG) ? sys_siglist[signum] : "?";
#else #else
return "some signal"; return NULL;
#endif #endif
} }
#endif /*!HAVE_DOSISH_SYSTEM*/ #endif /*!HAVE_DOSISH_SYSTEM*/
@ -93,19 +96,43 @@ got_fatal_signal (int sig)
if (cleanup_fnc) if (cleanup_fnc)
cleanup_fnc (); cleanup_fnc ();
/* better don't translate these messages */ /* Better don't translate these messages. */
write (2, "\n", 1 ); write (2, "\n", 1 );
s = log_get_prefix (NULL); s = log_get_prefix (NULL);
if (s) if (s)
write(2, s, strlen (s)); write(2, s, strlen (s));
write (2, ": ", 2 ); write (2, ": ", 2 );
s = get_signal_name(sig); s = get_signal_name(sig);
write (2, s, strlen(s) ); if (s)
write (2, s, strlen(s) );
else
{
/* We are in a signal handler so we can't use any kind of printf
even not sprintf. USe a straightforward algorithm. */
write (2, "signal ", 7 );
if (sig < 0 || sig >= 100000)
write (2, "?", 1);
else
{
int i, any=0;
for (i=10000; i; i /= 10)
{
if (sig >= i || ((any || i==1) && !(sig/i)))
{
write (2, "0123456789"+(sig/i), 1);
if ((sig/i))
any = 1;
sig %= i;
}
}
}
}
write (2, " caught ... exiting\n", 20); write (2, " caught ... exiting\n", 20);
/* reset action to default action and raise signal again */ /* Reset action to default action and raise signal again */
init_one_signal (sig, SIG_DFL, 0); init_one_signal (sig, SIG_DFL, 0);
/* fixme: remove_lockfiles ();*/ /* Fixme: remove_lockfiles ();*/
#ifdef __riscos__ #ifdef __riscos__
close_fds (); close_fds ();
#endif /* __riscos__ */ #endif /* __riscos__ */