Report which signal triggered the exit (#187).

This commit is contained in:
Andrew Wood
2026-04-28 22:53:23 +01:00
parent 2a25221eaf
commit 478039f539
5 changed files with 22 additions and 9 deletions
+1
View File
@@ -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])
+1
View File
@@ -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 */
+14 -3
View File
@@ -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"));
}
}
}
+4 -4
View File
@@ -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;
+2 -2
View File
@@ -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;
}