Package: kbd
Version: 1.15.5-1
Severity: wishlist
Tags: upstream patch
Hello.
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.
--- showkey.c 2014-10-21 19:42:28.727985666 +0200
+++ showkey.c.new 2014-10-21 19:48:58.385917875 +0200
@@ -42,7 +42,7 @@
m = _("?UNKNOWN?"); 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"));
}
@@ -89,6 +89,48 @@
exit(1);
}
+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 = "haskV";
@@ -175,35 +217,16 @@
fd = getfd(NULL);
/* the program terminates when there is no input for 10 secs */
- signal(SIGALRM, watch_dog);
+ if (signal(SIGALRM, watch_dog) == SIG_ERR)
+ perror("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], on_other_signals) == SIG_ERR)
+ perror ("signal (other signals)");
get_mode();
if (tcgetattr(fd, &old) == -1)