From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on sa.local.altlinux.org X-Spam-Level: X-Spam-Status: No, score=0.7 required=5.0 tests=DATE_IN_PAST_24_48, DKIM_SIGNED, DKIM_VALID,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS autolearn=no autolearn_force=no version=3.4.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=message-id:sender:from:date:subject:to; bh=hnU9rCvP+aptkPO8B6xtpsitHzT3ZxRsH5eul6l0Ja4=; b=q7ALJm7IP5zVJS8fqQpQ40gsBU0kf6ZaPCrxj5GvSyBv/Hg/rsnZrIF0BPvvz3HrKF I47dU2r9w8wV291HsuQ4crgqobIHqi9J0SvSGOpl47UfEdvxKTIJTLCSZY5GB3TkA6YV fzk5SLq9jHOPtDIlFQ7pPH+UMbsCpYK+LEd292BZqeJ17IE25dQYACiGKrqxDX2sv+e4 k/tmA8nPDzXwIq7SZzz9ywCHG/AMu5Ab5MNxYo97NDOrHwDn54btGrae6A1nZwCgKXH+ +8x6t55v66moJKJOxP514P1JlG3WbdQfPDUu1QjNT0Dl3YYrcfTzfTDXiVFUO9URxF05 3Ypg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:message-id:sender:from:date:subject:to; bh=hnU9rCvP+aptkPO8B6xtpsitHzT3ZxRsH5eul6l0Ja4=; b=YDTXkyKRjyPvDcmuaF0SaJWBTlOocwPxTXeIH2n06aJmiqqQeZb8Zohzmdn/kSleP2 aZAnRV/NmsYs/Z6lvRq013ijtpJ0vXdweeU/8Lf8zUGekFd6Ro05MYXYwe0btuyST0Mo x0s16+k+ExLu3L4ex/nmMSAIZLZ+k0mCBEqWXabGmSbskXEqn+ttfPS8TWwLVBMi1RFv yNYEAde4u+SjDpu5vog8uzVCEdqgCyARp5MbAWZMMNIOcXicjtGcwZhH0ly2LB1e95Vi +/Jeu7Ud16iy4q9bxFqrKiNpGXMPuiYDmWAFApIApRbZu6oYsGx2g6EUqIjfbyjXpr6J C5Nw== X-Gm-Message-State: APjAAAUzxxgz+bsse66RQsh0rC/RDzFHleZCJJg8EaCd4N0vKAcSOAvF YeDKVvNcBbzCu5laTpZM1tqwE1sg X-Google-Smtp-Source: APXvYqzI9Kw+OetXxuoBUHTXfLsJzpY8cOj4X/wvZbdQ4Nk4IQ/gJWIjkJdY0ZPXwFn8lyhnTbXbGw== X-Received: by 2002:a1c:415:: with SMTP id 21mr3296210wme.109.1556192139562; Thu, 25 Apr 2019 04:35:39 -0700 (PDT) Message-ID: <5cc19b8a.1c69fb81.6f70f.d8f0@mx.google.com> Sender: =?UTF-8?B?UsOpY3pleSBCw6FsaW50?= From: Balint Reczey X-Google-Original-From: Balint Reczey Date: Tue, 23 Apr 2019 17:38:07 +0200 To: kbd@lists.altlinux.org Subject: [kbd] [PATCH] kbd_mode: Add -f option and deny dangerous mode switches without it X-BeenThere: kbd@lists.altlinux.org X-Mailman-Version: 2.1.12 Precedence: list Reply-To: Linux console tools development discussion List-Id: Linux console tools development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 25 Apr 2019 11:35:42 -0000 Archived-At: List-Archive: kbd_mode(1) already had a warning but kbd_mode still performed all mode changes even when they made keyboards unusable. The added flag let's the callers try safe changes or force the risky ones. This change may break scripts but the broken scripts most likely made the keyboard unusable and should be updated. Original bug report at: https://bugs.launchpad.net/ubuntu/+source/kbd/+bug/520546 Signed-off-by: Balint Reczey --- docs/man/man1/kbd_mode.1 | 8 +++-- src/kbd_mode.c | 65 ++++++++++++++++++++++++++++------------ 2 files changed, 52 insertions(+), 21 deletions(-) diff --git a/docs/man/man1/kbd_mode.1 b/docs/man/man1/kbd_mode.1 index 960b36c..f605c02 100644 --- a/docs/man/man1/kbd_mode.1 +++ b/docs/man/man1/kbd_mode.1 @@ -7,6 +7,8 @@ kbd_mode \- report or set the keyboard mode [ .I -a | -u | -k | -s ] [ +.I -f +] [ .I -C CONSOLE ] .SH DESCRIPTION @@ -36,11 +38,13 @@ kbd_mode operates on the console specified by the "\-C" option; if there is none, the console associated with stdin is used. Warning: changing the keyboard mode, other than between ASCII and -Unicode, will probably make your keyboard unusable. +Unicode, will probably make your keyboard unusable. Set the "\-f" option +to force such changes. This command is only meant for use (say via remote login) when some program left your keyboard in the wrong state. Note that in some obsolete versions of this program the "\-u" -option was a synonym for "\-s". +option was a synonym for "\-s" and older versions of this program may +not recognize the "\-f" option. .SH "SEE ALSO" .BR loadkeys (1) diff --git a/src/kbd_mode.c b/src/kbd_mode.c index 5d291b7..956ea51 100644 --- a/src/kbd_mode.c +++ b/src/kbd_mode.c @@ -20,13 +20,34 @@ static void __attribute__((noreturn)) usage(void) { - fprintf(stderr, _("usage: kbd_mode [-a|-u|-k|-s] [-C device]\n")); + fprintf(stderr, _("usage: kbd_mode [-a|-u|-k|-s] [-f] [-C device]\n")); exit(EXIT_FAILURE); } +static void +fprint_mode(FILE *stream, int mode) +{ + switch (mode) { + case K_RAW: + fprintf(stream, _("The keyboard is in raw (scancode) mode\n")); + break; + case K_MEDIUMRAW: + fprintf(stream, _("The keyboard is in mediumraw (keycode) mode\n")); + break; + case K_XLATE: + fprintf(stream, _("The keyboard is in the default (ASCII) mode\n")); + break; + case K_UNICODE: + fprintf(stream, _("The keyboard is in Unicode (UTF-8) mode\n")); + break; + default: + fprintf(stream, _("The keyboard is in some unknown mode\n")); + } +} + int main(int argc, char *argv[]) { - int fd, mode, c, n = 0; + int fd, mode, orig_mode, c, n = 0, force = 0; char *console = NULL; set_progname(argv[0]); @@ -38,7 +59,7 @@ int main(int argc, char *argv[]) if (argc == 2 && !strcmp(argv[1], "-V")) print_version_and_exit(); - while ((c = getopt(argc, argv, "auskC:")) != EOF) { + while ((c = getopt(argc, argv, "auskfC:")) != EOF) { switch (c) { case 'a': if (n > 0) @@ -64,6 +85,9 @@ int main(int argc, char *argv[]) mode = K_MEDIUMRAW; n++; break; + case 'f': + force = 1; + break; case 'C': if (!optarg || !optarg[0]) usage(); @@ -82,25 +106,28 @@ int main(int argc, char *argv[]) if (ioctl(fd, KDGKBMODE, &mode)) { kbd_error(EXIT_FAILURE, errno, "ioctl KDGKBMODE"); } - switch (mode) { - case K_RAW: - printf(_("The keyboard is in raw (scancode) mode\n")); - break; - case K_MEDIUMRAW: - printf(_("The keyboard is in mediumraw (keycode) mode\n")); - break; - case K_XLATE: - printf(_("The keyboard is in the default (ASCII) mode\n")); - break; - case K_UNICODE: - printf(_("The keyboard is in Unicode (UTF-8) mode\n")); - break; - default: - printf(_("The keyboard is in some unknown mode\n")); - } + fprint_mode(stdout, mode); return EXIT_SUCCESS; } + if (force == 0) { + /* only perform safe mode switches */ + if (ioctl(fd, KDGKBMODE, &orig_mode)) { + kbd_error(EXIT_FAILURE, errno, "ioctl KDGKBMODE"); + } + + if (mode == orig_mode) { + /* skip mode change */ + return EXIT_SUCCESS; + } + + if ((mode == K_XLATE && orig_mode != K_UNICODE) || (mode == K_UNICODE && orig_mode != K_XLATE)) { + fprint_mode(stderr, orig_mode); + fprintf(stderr, _("Changing to the requested mode may make " + "your keyboard unusable, please use -f to force the change.\n")); + return EXIT_FAILURE; + } + } if (ioctl(fd, KDSKBMODE, mode)) { kbd_error(EXIT_FAILURE, errno, "ioctl KDSKBMODE"); } -- 2.17.1