diff --git a/configure.ac b/configure.ac index bdc9aab..7819931 100644 --- a/configure.ac +++ b/configure.ac @@ -34,6 +34,7 @@ AC_CHECK_FUNCS([nanosleep]) AC_CHECK_FUNCS([setitimer]) AC_CHECK_FUNCS([setproctitle]) AC_CHECK_FUNCS([nftw]) +AC_CHECK_FUNCS([strsignal]) AC_CHECK_HEADERS([getopt.h]) AC_CHECK_HEADERS([limits.h]) AC_CHECK_HEADERS([langinfo.h]) diff --git a/src/include/pv-internal.h b/src/include/pv-internal.h index c67c033..def8c6e 100644 --- a/src/include/pv-internal.h +++ b/src/include/pv-internal.h @@ -272,6 +272,7 @@ struct pvstate_s { volatile sig_atomic_t reparse_display; /* whether to re-check format string */ volatile sig_atomic_t terminal_resized; /* whether terminal size needs re-reading */ volatile sig_atomic_t trigger_exit; /* whether an immediate abort is required */ + volatile sig_atomic_t terminating_signal; /* signal number that triggered an exit */ volatile sig_atomic_t clear_tty_tostop_on_exit; /* whether to clear tty TOSTOP on exit */ volatile sig_atomic_t set_tty_echoctl_on_exit; /* whether to set tty ECHOCTL on exit */ volatile sig_atomic_t suspend_stderr; /* whether writing to stderr is suspended */ diff --git a/src/pv/cursor.c b/src/pv/cursor.c index f05b3a5..523dfbd 100644 --- a/src/pv/cursor.c +++ b/src/pv/cursor.c @@ -771,8 +771,19 @@ void pv_crs_fini(pvcursorstate_t cursor, readonly_pvcontrol_t control, pvtransie * Report a signal interrupt, unless the flag allowing it has been cleared * due to another instance already taking responsibility. */ -void pv_report_signal_interrupt(void) +void pv_report_signal_interrupt(int signum) { - if (pv__allow_signal_interrupt_reporting) - pv_error("%s", _("interrupted by signal")); + if (pv__allow_signal_interrupt_reporting) { + char *signal_name = NULL; +#ifdef HAVE_STRSIGNAL + /*@-unrecog @ *//* splint doesn't know strsignal(). */ + signal_name = strsignal(signum); + /*@+unrecog @ */ +#endif + if (NULL != signal_name) { + pv_error("%s: %s", _("exiting due to signal"), signal_name); + } else { + pv_error("%s", _("exiting due to signal")); + } + } } diff --git a/src/pv/loop.c b/src/pv/loop.c index c037568..cdc7bb4 100644 --- a/src/pv/loop.c +++ b/src/pv/loop.c @@ -31,7 +31,7 @@ int pv_remote_transferstate_fetch(pvstate_t, pid_t, /*@null@ */ off_t *, bool); void pv_end_display(void); -void pv_report_signal_interrupt(void); +void pv_report_signal_interrupt(int); #if HAVE_SQRTL @@ -778,7 +778,7 @@ int pv_main_loop(pvstate_t state) if (1 == state->flags.trigger_exit) { state->status.exit_status |= PV_ERROREXIT_SIGNAL; - pv_report_signal_interrupt(); + pv_report_signal_interrupt((int) (state->flags.terminating_signal)); } return state->status.exit_status; @@ -1325,7 +1325,7 @@ int pv_watchfd_loop(pvstate_t state) */ if (1 == state->flags.trigger_exit) { state->status.exit_status |= PV_ERROREXIT_SIGNAL; - pv_report_signal_interrupt(); + pv_report_signal_interrupt((int) (state->flags.terminating_signal)); } /* Free all allocated sub-structures. */ @@ -1469,7 +1469,7 @@ int pv_query_loop(pvstate_t state, pid_t query) if (1 == state->flags.trigger_exit) { state->status.exit_status |= PV_ERROREXIT_SIGNAL; - pv_report_signal_interrupt(); + pv_report_signal_interrupt((int) (state->flags.terminating_signal)); } return state->status.exit_status; diff --git a/src/pv/signal.c b/src/pv/signal.c index b2295a5..1c439cd 100644 --- a/src/pv/signal.c +++ b/src/pv/signal.c @@ -302,12 +302,12 @@ static void pv_sig_winch( /*@unused@ */ __attribute__((unused)) /* * Handle termination signals by setting the abort flag. */ -static void pv_sig_term( /*@unused@ */ __attribute__((unused)) - int s) +static void pv_sig_term(int s) { if (NULL == pv_sig_state) return; pv_sig_state->flags.trigger_exit = 1; + pv_sig_state->flags.terminating_signal = (sig_atomic_t) s; }