Пример #1
0
/*
 * Signal handling for most loops where we can be interrupted
 * by user pressing ^C/^Break (generating SIGINT/SIGBREAK).
 */
int _sock_sig_setup (void)
{
#if (USE_SIGMASK)
  static sigset_t old_mask, new_mask;
#endif
  int i;

  if (signal_depth > 0 ||
      ++signal_depth > 1)
     return (0);

  _sock_start_timer();

#if (USE_SIGMASK)
  sigemptyset (&new_mask);
#endif

  for (i = 0; i < DIM(sig_tab); i++)
  {
    int sig = sig_tab[i].sig_num;

    sig_tab[i].caught = FALSE;

#if (USE_SIGMASK)
    sigaddset (&new_mask, sig);
    sigprocmask (SIG_SETMASK, &new_mask, &old_mask);
#else
    sig_tab[i].old = signal (sig, sig_catch);
#endif
  }
  return (0);
}
Пример #2
0
int _sock_sig_setup (void)
{
    volatile int sig;

    if (signal_depth > 0)
        return (0);

    if (++signal_depth > 1)
        return (0);

    _sock_start_timer();
    wat_brkmode = wathndlcbrk;
    wathndlcbrk = 0;
    watcbroke   = 0;

    sigalrm_caught = sigbrk_caught  = 0;
    sigint_caught  = sigquit_caught = 0;

    old_sigint = signal (SIGINT, sig_catch);

#if defined(SIGQUIT)
    old_sigquit = signal (SIGQUIT, sig_catch);
#endif

#if defined(SIGBREAK)
    old_sigbrk = signal (SIGBREAK, sig_catch);
#endif

#if defined(SIGPIPE)
    old_sigpipe = signal (SIGPIPE, sig_catch);
#endif

#if defined(SIGALRM) && TRAP_SIGALRM
    old_sigalrm = signal (SIGALRM, sig_catch);
    block_sigalrm();
#endif

    sig = setjmp (sig_jmp);
    if (sig == 0)
        return (0);


    /* We'll get here only when sig_catch() calls longjmp()
     */
    SOCK_DEBUGF ((NULL, ", interrupted by %s\n", sig_name(sig)));
    _sock_sig_restore();
    return (-1);
}