void sig_init(void) { clk_tck_init(); timer_save_interval = cfg_get_int(SECTION_OPTIONS, NULL, "Save"); if (timer_save_interval < 0) timer_save_interval = TIMER_SAVE_DELAY; else if ((timer_save_interval /= TIMER_INTERVAL) <= 0) timer_save_interval = 1; timer_save_value = timer_save_interval; timer_ticksafety_interval = (clock_t)1 << (sizeof(clock_t) * 8 - 4); timer_ticksafety_interval /= clk_tck; if ((timer_ticksafety_interval /= TIMER_INTERVAL) <= 0) timer_ticksafety_interval = 1; timer_ticksafety_value = timer_ticksafety_interval; atexit(sig_done); sig_install_update(); sig_install_abort(); sig_install_timer(); #if OS_FORK signal(SIGUSR2, sig_handle_status); #endif }
void sig_init(void) { clk_tck_init(); timer_save_interval = cfg_get_int(SECTION_OPTIONS, NULL, "Save"); if (timer_save_interval < 0) timer_save_interval = TIMER_SAVE_DELAY; else if ((timer_save_interval /= TIMER_INTERVAL) <= 0) timer_save_interval = 1; if (cfg_get_param(SECTION_OPTIONS, NULL, "AbortGraceTime")) { abort_grace_time = cfg_get_int(SECTION_OPTIONS, NULL, "AbortGraceTime"); } #if OS_TIMER timer_save_value = timer_save_interval; #elif !defined(BENCH_BUILD) timer_save_value = status_get_time() + timer_save_interval; #endif timer_ticksafety_interval = (clock_t)1 << (sizeof(clock_t) * 8 - 4); timer_ticksafety_interval /= clk_tck; if ((timer_ticksafety_interval /= TIMER_INTERVAL) <= 0) timer_ticksafety_interval = 1; timer_ticksafety_value = timer_ticksafety_interval; atexit(sig_done); sig_install(sig_handle_update, SIGHUP); sig_install_abort(); sig_install_timer(); }
static void sig_handle_abort(int signum) { int saved_errno = errno; check_abort(1); event_abort = event_pending = 1; write_loop(2, "Wait...\r", 8); sig_install_abort(); errno = saved_errno; }
static void sig_handle_abort(int signum) { int saved_errno = errno; #if OS_FORK if (john_main_process) { /* * We assume that our children are running on the same tty with us, so if we * receive a SIGINT they probably do as well without us needing to forward the * signal to them. If we forwarded the signal anyway, this could result in * them receiving the signal twice for a single Ctrl-C keypress and proceeding * with immediate abort without updating the files, which is behavior that we * reserve for (presumably intentional) repeated Ctrl-C keypress. * * We forward the signal as SIGINT even though ours was different (typically a * SIGTERM) in order not to trigger a repeated same signal for children if the * user does e.g. "killall john", which would send SIGTERM directly to children * and also have us forward a signal. */ if (signum != SIGINT) signal_children(SIGINT); } else { static int prev_signum; /* * If it's not the same signal twice in a row, don't proceed with immediate * abort since these two signals could have been triggered by the same killall * (perhaps a SIGTERM from killall directly and a SIGINT as forwarded by our * parent). event_abort would be set back to 1 just below the check_abort() * call. We only reset it to 0 temporarily to skip the immediate abort here. */ if (prev_signum && signum != prev_signum) event_abort = 0; prev_signum = signum; } #endif check_abort(1); event_abort = event_pending = 1; write_loop(2, "Wait...\r", 8); sig_install_abort(); errno = saved_errno; }