Description:
 In src/showkey.c, when the keyboard mode is not K_XLATE, a warning is
 displayed that showkey may fail under X.  I suggest to consider
 K_UNICODE as normal as K_XLATE, or even remove this warning since
 getfd() will exit() if X is detected.
 .
 Later, the code calls signal() for every known signal. This fails
 with SIGKILL and SIGSTOP, but this has never been detected because
 the return value is not tested.  I suggest to update the signal list
 from signal(7), store it in an array for readability, and check
 errors.
Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=766240
Author: Nicolas Boulenguez <nicolas@debian.org>

--- a/src/showkey.c
+++ b/src/showkey.c
@@ -50,7 +50,7 @@
 			break;
 	}
 	printf(_("kb mode was %s\n"), m);
-	if (oldkbmode != K_XLATE) {
+	if ((oldkbmode != K_XLATE) && (oldkbmode != K_UNICODE)) {
 		printf(_("[ if you are trying this under X, it might not work\n"
 		         "since the X server is also reading /dev/console ]\n"));
 	}
@@ -94,6 +94,49 @@
 	exit(rc);
 }
 
+static const int other_signals [] = {
+	// Signals described in the original POSIX.1-1990 standard,
+	// except SIGALRM which is handled separately,
+	// and SIGKILL and SIGSTO which cannot be caught.
+	SIGHUP, SIGINT, SIGQUIT, SIGILL, SIGABRT, SIGFPE, SIGSEGV, SIGPIPE,
+	SIGTERM, SIGUSR1, SIGUSR2, SIGCHLD, SIGCONT, SIGTSTP, SIGTTIN, SIGTTOU,
+	// Signals described in SUSv2 and POSIX.1-2001.
+	SIGBUS, SIGPOLL, SIGPROF, SIGSYS, SIGTRAP,
+	SIGURG, SIGVTALRM, SIGXCPU, SIGXFSZ,
+	// Various other signals.
+	#ifdef SIGIOT
+	SIGIOT,
+	#endif
+	#ifdef SIGEMT
+	SIGEMT,
+	#endif
+	#ifdef SIGSTKFLT
+	SIGSTKFLT,
+	#endif
+	#ifdef SIGIO
+	SIGIO,
+	#endif
+	#ifdef SIGCLD
+	SIGCLD,
+	#endif
+	#ifdef SIGPWR
+	SIGPWR,
+	#endif
+	#ifdef SIGINFO
+	SIGINFO,
+	#endif
+	#ifdef SIGLOST
+	SIGLOST,
+	#endif
+	#ifdef SIGWINCH
+	SIGWINCH,
+	#endif
+	#ifdef SIGUNUSED
+	SIGUNUSED,
+	#endif
+};
+
+
 int main(int argc, char *argv[])
 {
 	const char *short_opts          = "haskVt:";
@@ -198,35 +241,19 @@
 		kbd_error(EXIT_FAILURE, 0, _("Couldn't get a file descriptor referring to the console."));
 
 	/* the program terminates when there is no input for 10 secs */
-	signal(SIGALRM, watch_dog);
+	if (signal(SIGALRM, watch_dog) == SIG_ERR) {
+		kbd_error(EXIT_FAILURE, errno, "signal SIGALRM");
+	}
 
 	/*
 	  if we receive a signal, we want to exit nicely, in
 	  order not to leave the keyboard in an unusable mode
 	*/
-	signal(SIGHUP, die);
-	signal(SIGINT, die);
-	signal(SIGQUIT, die);
-	signal(SIGILL, die);
-	signal(SIGTRAP, die);
-	signal(SIGABRT, die);
-	signal(SIGIOT, die);
-	signal(SIGFPE, die);
-	signal(SIGKILL, die);
-	signal(SIGUSR1, die);
-	signal(SIGSEGV, die);
-	signal(SIGUSR2, die);
-	signal(SIGPIPE, die);
-	signal(SIGTERM, die);
-#ifdef SIGSTKFLT
-	signal(SIGSTKFLT, die);
-#endif
-	signal(SIGCHLD, die);
-	signal(SIGCONT, die);
-	signal(SIGSTOP, die);
-	signal(SIGTSTP, die);
-	signal(SIGTTIN, die);
-	signal(SIGTTOU, die);
+	for (i=0; i<sizeof(other_signals)/sizeof(int); i++) {
+		if (signal(other_signals[i], die) == SIG_ERR) {
+			kbd_error(EXIT_FAILURE, errno, "signal %i", other_signals[i]);
+		}
+	}
 
 	get_mode();
 	if (tcgetattr(fd, &old) == -1)
