/* * 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); }
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); }