diff options
author | Thomas Wood <thomas.wood@intel.com> | 2015-02-19 13:58:06 +0000 |
---|---|---|
committer | Thomas Wood <thomas.wood@intel.com> | 2015-02-25 16:50:13 +0000 |
commit | 4ff4ea601a0bfeceb7f291af2c3410ad547af760 (patch) | |
tree | 33ea0bb6535b02d9da6861a65332be8deb6b1396 | |
parent | aecad4fc2ea86f5377c443a4f15ea91d3e0d614c (diff) |
lib: print the signal name to stderr when handling a signal
Print the received signal name to stderr when handling a signal. This
uses an array of handled signal names since strsignal() only provides
descriptions.
Signed-off-by: Thomas Wood <thomas.wood@intel.com>
-rw-r--r-- | lib/igt_core.c | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/lib/igt_core.c b/lib/igt_core.c index 75b98f62..adfa597d 100644 --- a/lib/igt_core.c +++ b/lib/igt_core.c @@ -1303,8 +1303,10 @@ static struct { static igt_exit_handler_t exit_handler_fn[MAX_EXIT_HANDLERS]; static bool exit_handler_disabled; static sigset_t saved_sig_mask; -static const int handled_signals[] = - { SIGINT, SIGHUP, SIGTERM, SIGQUIT, SIGPIPE, SIGABRT, SIGSEGV, SIGBUS }; +#define SIGDEF(x) { x, #x, sizeof(#x) - 1 } +static const struct { int number; const char *name; size_t name_len; } handled_signals[] = + { SIGDEF(SIGINT), SIGDEF(SIGHUP), SIGDEF(SIGTERM), SIGDEF(SIGQUIT), + SIGDEF(SIGPIPE), SIGDEF(SIGABRT), SIGDEF(SIGSEGV), SIGDEF(SIGBUS) }; static int install_sig_handler(int sig_num, sighandler_t handler) { @@ -1357,8 +1359,20 @@ static void igt_atexit_handler(void) static void fatal_sig_handler(int sig) { + int i; + restore_all_sig_handler(); + for (i = 0; i < ARRAY_SIZE(handled_signals); i++) { + if (handled_signals[i].number == sig) { + write(STDERR_FILENO, "Received signal ", 16); + write(STDERR_FILENO, handled_signals[i].name, + handled_signals[i].name_len); + write(STDERR_FILENO, ".\n", 2); + break; + } + } + /* * exit_handler_disabled is always false here, since when we set it * we also block signals. @@ -1415,7 +1429,7 @@ void igt_install_exit_handler(igt_exit_handler_t fn) return; for (i = 0; i < ARRAY_SIZE(handled_signals); i++) { - if (install_sig_handler(handled_signals[i], + if (install_sig_handler(handled_signals[i].number, fatal_sig_handler)) goto err; } @@ -1447,7 +1461,7 @@ void igt_disable_exit_handler(void) sigemptyset(&set); for (i = 0; i < ARRAY_SIZE(handled_signals); i++) - sigaddset(&set, handled_signals[i]); + sigaddset(&set, handled_signals[i].number); if (sigprocmask(SIG_BLOCK, &set, &saved_sig_mask)) { perror("sigprocmask"); |