diff options
author | Werner Koch <wk@gnupg.org> | 2005-05-13 14:37:52 +0200 |
---|---|---|
committer | Werner Koch <wk@gnupg.org> | 2005-05-13 14:37:52 +0200 |
commit | d8718bd67f42652d1e43327b7eb7920414dd5b05 (patch) | |
tree | 32e7175166176c0e4a69c8404edfe58e2bf61c3f /common | |
parent | 2005-05-05 Moritz Schulte <moritz@g10code.com> (diff) | |
download | gnupg2-d8718bd67f42652d1e43327b7eb7920414dd5b05.tar.xz gnupg2-d8718bd67f42652d1e43327b7eb7920414dd5b05.zip |
(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.
Diffstat (limited to 'common')
-rw-r--r-- | common/ChangeLog | 6 | ||||
-rw-r--r-- | common/signal.c | 39 |
2 files changed, 39 insertions, 6 deletions
diff --git a/common/ChangeLog b/common/ChangeLog index 4688d2765..0651f9ead 100644 --- a/common/ChangeLog +++ b/common/ChangeLog @@ -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> * sexputil.c (cmp_simple_canon_sexp): New. diff --git a/common/signal.c b/common/signal.c index 4e773c4c0..97e2c39fe 100644 --- a/common/signal.c +++ b/common/signal.c @@ -1,5 +1,6 @@ /* 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. * @@ -73,10 +74,12 @@ init_one_signal (int sig, RETSIGTYPE (*handler)(int), int check_ign ) static const char * get_signal_name( int signum ) { + /* Note that we can't use strsignal(), because it is not + reentrant. */ #if defined(SYS_SIGLIST_DECLARED) && defined(NSIG) return (signum >= 0 && signum < NSIG) ? sys_siglist[signum] : "?"; #else - return "some signal"; + return NULL; #endif } #endif /*!HAVE_DOSISH_SYSTEM*/ @@ -93,19 +96,43 @@ got_fatal_signal (int sig) if (cleanup_fnc) cleanup_fnc (); - /* better don't translate these messages */ + /* Better don't translate these messages. */ write (2, "\n", 1 ); s = log_get_prefix (NULL); if (s) write(2, s, strlen (s)); write (2, ": ", 2 ); 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); - /* 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); - /* fixme: remove_lockfiles ();*/ + /* Fixme: remove_lockfiles ();*/ #ifdef __riscos__ close_fds (); #endif /* __riscos__ */ |