Report which signal triggered the exit (#187).
This commit is contained in:
@@ -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])
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user