Beispiel #1
0
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 );
}
Beispiel #2
0
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 );
}
Beispiel #3
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 );
}
Beispiel #4
0
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
}
Beispiel #5
0
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
}
Beispiel #6
0
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 );
}
Beispiel #7
0
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 );
}