From nobody Fri Jul 07 05:10:32 2023 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4Qy1gX6R2rz4mDvV; Fri, 7 Jul 2023 05:10:32 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4Qy1gX6GsKz4Hc8; Fri, 7 Jul 2023 05:10:32 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1688706632; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=DOmtHgkhtRodxOxF8+8OljT3RQ+2i0xNGKMcUH+VEg4=; b=UK3EDR5aU4xAlVOYg2HvbqRCWuNSPBPlHvNvWkzmAtyI9E8GoT+XvuoDZKkXyg4U0waDAN JUvxKzadm1aD7KQXmBhwxHZu2TaaDF+VE5dttyR0+QJiH00n6buU4H814QkgbleuZtRK8t Ze628KlKP+WwZdrxhxtV1Gml6TX/xQNzAhEhKtc1AiYJyO5YaAvp0W4GkYm/zcvHsWNCv2 NxJ0u4P94uit2egODaA/rWVmOluOQP2C7eRo4M5ectNATpqVILK1vF7UUSI0u1cSH0k9CK jC5VFwVpYo+XHp3b/x4+9I4EJctqiP8wMdNpZmzKFg9k9f+/dvgQFVTcHSATcw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1688706632; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=DOmtHgkhtRodxOxF8+8OljT3RQ+2i0xNGKMcUH+VEg4=; b=EzgkJ2uyZqp0dQ3OMXtUhcFTDhftt3ar3upez4yYRAOOUrzrravrm5Ujolp8q1pqssQjEG j5WxUPUNMQ0x6uw+hp7+Livi5fYQO3MWGCCTgky7y2zq8MthEdSm8k83sDet0XbafCuDM9 1GAIeHhfbZnCzI91IuY/Q8eGsjqZZP9u0U+yLtSb0RlAeD/GbN2WBQ3Rsh0IS/yKmUED30 ps1v8CeRNFT2q4KEflEOOw6XMy8lIjyZCQpKPfBzJpwjKIkeHu7db+NwLS6KbekLKfa0LD 9wJOECNTXiOG/80aYqvyjOZGTlkfOMlof5o73nCAluI36rrT0iEMkRmm99TWPw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1688706632; a=rsa-sha256; cv=none; b=K3H5d02oNO+9SPi3XdxG7zrM6aECNhP3frEeq2EFv/jgGuuXo78tdKO7HFj3myE1C9LoK3 hA9g5epalCGCGoQOW+IStIirngE8joc9PGm+FLRp0CkaIfQhJ95zqfeSppzBUONRsokl9Y qIhDn4ITUmIXuvx0vcM0QYvzSmqK60if8qKcnMnmwoonptCrEPAPIWq1hI5wQ3BYLPViSc YUv4KNPgJNqjhvF6P6TmcK0F3qXRWbo9zJUoVCXMLdN3yDbGDT1ADnO3j8yi89Hy0ltOCR fGVSJc4AGQRLsgjZXoL8TVbtG/8K0xzHAemPq5DiPRvUeO4NVA6IRJEp6H/rVQ== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4Qy1gX53PBzRBB; Fri, 7 Jul 2023 05:10:32 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.17.1/8.17.1) with ESMTP id 3675AW6r051153; Fri, 7 Jul 2023 05:10:32 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.17.1/8.17.1/Submit) id 3675AWZS051152; Fri, 7 Jul 2023 05:10:32 GMT (envelope-from git) Date: Fri, 7 Jul 2023 05:10:32 GMT Message-Id: <202307070510.3675AWZS051152@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Warner Losh Subject: git: 971bac5ace7a - main - kbd: consolidate kb interfaces (phase one) List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: imp X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 971bac5ace7a3c2262349fa2808188a11a5ffeed Auto-Submitted: auto-generated X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by imp: URL: https://cgit.FreeBSD.org/src/commit/?id=971bac5ace7a3c2262349fa2808188a11a5ffeed commit 971bac5ace7a3c2262349fa2808188a11a5ffeed Author: Michael AuthorDate: 2023-07-07 02:32:45 +0000 Commit: Warner Losh CommitDate: 2023-07-07 05:10:18 +0000 kbd: consolidate kb interfaces (phase one) Refactor to eliminate duplicated rate and delay tables, with minor style tweaks for changed lines. Remove an obsolete comment about needing to convert from microseconds to ticks (that's done elsewhere). Remove traiing whitespace in kbdcontrol.c. Except for the new warning, no change in behavior Sponsored by: DSS GmbH Reviewed by: imp [minor style tweaks as well] Pull Request: https://github.com/freebsd/pull/683 Differential Revision: https://reviews.freebsd.org/D38818 --- sys/dev/adb/adb_kbd.c | 12 ++------- sys/dev/atkbdc/atkbd.c | 18 +++++--------- sys/dev/gpio/gpiokeys.c | 10 ++------ sys/dev/hid/hkbd.c | 10 ++------ sys/dev/kbdmux/kbdmux.c | 23 +++++------------ sys/dev/usb/input/ukbd.c | 10 ++------ sys/dev/vkbd/vkbd.c | 18 +++++--------- sys/sys/kbio.h | 7 ++++++ usr.sbin/kbdcontrol/kbdcontrol.c | 53 +++++++++++++++++++++------------------- 9 files changed, 61 insertions(+), 100 deletions(-) diff --git a/sys/dev/adb/adb_kbd.c b/sys/dev/adb/adb_kbd.c index 62fb70cd51f7..2bc5a79a7e2b 100644 --- a/sys/dev/adb/adb_kbd.c +++ b/sys/dev/adb/adb_kbd.c @@ -688,18 +688,10 @@ akbd_check_char(keyboard_t *kbd) static int set_typematic(keyboard_t *kbd, int code) { - /* These numbers are in microseconds, so convert to ticks */ - - static int delays[] = { 250, 500, 750, 1000 }; - static int rates[] = { 34, 38, 42, 46, 50, 55, 59, 63, - 68, 76, 84, 92, 100, 110, 118, 126, - 136, 152, 168, 184, 200, 220, 236, 252, - 272, 304, 336, 368, 400, 440, 472, 504 }; - if (code & ~0x7f) return EINVAL; - kbd->kb_delay1 = delays[(code >> 5) & 3]; - kbd->kb_delay2 = rates[code & 0x1f]; + kbd->kb_delay1 = kbdelays[(code >> 5) & 3]; + kbd->kb_delay2 = kbrates[code & 0x1f]; return 0; } diff --git a/sys/dev/atkbdc/atkbd.c b/sys/dev/atkbdc/atkbd.c index 0c9f2592d6b8..dcb5805982ff 100644 --- a/sys/dev/atkbdc/atkbd.c +++ b/sys/dev/atkbdc/atkbd.c @@ -1571,22 +1571,16 @@ get_kbd_id(KBDC kbdc) return ((id2 << 8) | id1); } -static int delays[] = { 250, 500, 750, 1000 }; -static int rates[] = { 34, 38, 42, 46, 50, 55, 59, 63, - 68, 76, 84, 92, 100, 110, 118, 126, - 136, 152, 168, 184, 200, 220, 236, 252, - 272, 304, 336, 368, 400, 440, 472, 504 }; - static int typematic_delay(int i) { - return delays[(i >> 5) & 3]; + return (kbdelays[(i >> 5) & 3]); } static int typematic_rate(int i) { - return rates[i & 0x1f]; + return (kbrates[i & 0x1f]); } static int @@ -1595,13 +1589,13 @@ typematic(int delay, int rate) int value; int i; - for (i = nitems(delays) - 1; i > 0; --i) { - if (delay >= delays[i]) + for (i = nitems(kbdelays) - 1; i > 0; --i) { + if (delay >= kbdelays[i]) break; } value = i << 5; - for (i = nitems(rates) - 1; i > 0; --i) { - if (rate >= rates[i]) + for (i = nitems(kbrates) - 1; i > 0; --i) { + if (rate >= kbrates[i]) break; } value |= i; diff --git a/sys/dev/gpio/gpiokeys.c b/sys/dev/gpio/gpiokeys.c index 86f684535be9..e21b53db9a4c 100644 --- a/sys/dev/gpio/gpiokeys.c +++ b/sys/dev/gpio/gpiokeys.c @@ -975,17 +975,11 @@ gpiokeys_poll(keyboard_t *kbd, int on) static int gpiokeys_set_typematic(keyboard_t *kbd, int code) { - static const int delays[] = {250, 500, 750, 1000}; - static const int rates[] = {34, 38, 42, 46, 50, 55, 59, 63, - 68, 76, 84, 92, 100, 110, 118, 126, - 136, 152, 168, 184, 200, 220, 236, 252, - 272, 304, 336, 368, 400, 440, 472, 504}; - if (code & ~0x7f) { return (EINVAL); } - kbd->kb_delay1 = delays[(code >> 5) & 3]; - kbd->kb_delay2 = rates[code & 0x1f]; + kbd->kb_delay1 = kbdelays[(code >> 5) & 3]; + kbd->kb_delay2 = kbrates[code & 0x1f]; return (0); } diff --git a/sys/dev/hid/hkbd.c b/sys/dev/hid/hkbd.c index 6d9ad52469bb..922256a8f23b 100644 --- a/sys/dev/hid/hkbd.c +++ b/sys/dev/hid/hkbd.c @@ -1832,17 +1832,11 @@ hkbd_set_typematic(keyboard_t *kbd, int code) #ifdef EVDEV_SUPPORT struct hkbd_softc *sc = kbd->kb_data; #endif - static const int delays[] = {250, 500, 750, 1000}; - static const int rates[] = {34, 38, 42, 46, 50, 55, 59, 63, - 68, 76, 84, 92, 100, 110, 118, 126, - 136, 152, 168, 184, 200, 220, 236, 252, - 272, 304, 336, 368, 400, 440, 472, 504}; - if (code & ~0x7f) { return (EINVAL); } - kbd->kb_delay1 = delays[(code >> 5) & 3]; - kbd->kb_delay2 = rates[code & 0x1f]; + kbd->kb_delay1 = kbdelays[(code >> 5) & 3]; + kbd->kb_delay2 = kbrates[code & 0x1f]; #ifdef EVDEV_SUPPORT if (sc->sc_evdev != NULL) evdev_push_repeats(sc->sc_evdev, kbd); diff --git a/sys/dev/kbdmux/kbdmux.c b/sys/dev/kbdmux/kbdmux.c index 71f5dc7295e7..97ea7ba14a62 100644 --- a/sys/dev/kbdmux/kbdmux.c +++ b/sys/dev/kbdmux/kbdmux.c @@ -963,17 +963,6 @@ kbdmux_check_char(keyboard_t *kbd) static int kbdmux_ioctl(keyboard_t *kbd, u_long cmd, caddr_t arg) { - static int delays[] = { - 250, 500, 750, 1000 - }; - - static int rates[] = { - 34, 38, 42, 46, 50, 55, 59, 63, - 68, 76, 84, 92, 100, 110, 118, 126, - 136, 152, 168, 184, 200, 220, 236, 252, - 272, 304, 336, 368, 400, 440, 472, 504 - }; - kbdmux_state_t *state = (kbdmux_state_t *) kbd->kb_data; kbdmux_kbd_t *k; keyboard_info_t *ki; @@ -1206,14 +1195,14 @@ kbdmux_ioctl(keyboard_t *kbd, u_long cmd, caddr_t arg) int i; /* lookup delay */ - for (i = sizeof(delays)/sizeof(delays[0]) - 1; i > 0; i --) - if (((int *)arg)[0] >= delays[i]) + for (i = nitems(kbdelays) - 1; i > 0; i--) + if (((int *)arg)[0] >= kbdelays[i]) break; mode = i << 5; /* lookup rate */ - for (i = sizeof(rates)/sizeof(rates[0]) - 1; i > 0; i --) - if (((int *)arg)[1] >= rates[i]) + for (i = nitems(kbrates) - 1; i > 0; i--) + if (((int *)arg)[1] >= kbrates[i]) break; mode |= i; } else @@ -1225,8 +1214,8 @@ kbdmux_ioctl(keyboard_t *kbd, u_long cmd, caddr_t arg) return (EINVAL); } - kbd->kb_delay1 = delays[(mode >> 5) & 3]; - kbd->kb_delay2 = rates[mode & 0x1f]; + kbd->kb_delay1 = kbdelays[(mode >> 5) & 3]; + kbd->kb_delay2 = kbrates[mode & 0x1f]; #ifdef EVDEV_SUPPORT if (state->ks_evdev != NULL && evdev_rcpt_mask & EVDEV_RCPT_KBDMUX) diff --git a/sys/dev/usb/input/ukbd.c b/sys/dev/usb/input/ukbd.c index 0e964da3ef19..0dd6d41f7a8d 100644 --- a/sys/dev/usb/input/ukbd.c +++ b/sys/dev/usb/input/ukbd.c @@ -2002,17 +2002,11 @@ ukbd_set_typematic(keyboard_t *kbd, int code) #ifdef EVDEV_SUPPORT struct ukbd_softc *sc = kbd->kb_data; #endif - static const int delays[] = {250, 500, 750, 1000}; - static const int rates[] = {34, 38, 42, 46, 50, 55, 59, 63, - 68, 76, 84, 92, 100, 110, 118, 126, - 136, 152, 168, 184, 200, 220, 236, 252, - 272, 304, 336, 368, 400, 440, 472, 504}; - if (code & ~0x7f) { return (EINVAL); } - kbd->kb_delay1 = delays[(code >> 5) & 3]; - kbd->kb_delay2 = rates[code & 0x1f]; + kbd->kb_delay1 = kbdelays[(code >> 5) & 3]; + kbd->kb_delay2 = kbrates[code & 0x1f]; #ifdef EVDEV_SUPPORT if (sc->sc_evdev != NULL) evdev_push_repeats(sc->sc_evdev, kbd); diff --git a/sys/dev/vkbd/vkbd.c b/sys/dev/vkbd/vkbd.c index ebf9b09996c2..bb91c85b2718 100644 --- a/sys/dev/vkbd/vkbd.c +++ b/sys/dev/vkbd/vkbd.c @@ -1305,22 +1305,16 @@ vkbd_poll(keyboard_t *kbd, int on) * Local functions */ -static int delays[] = { 250, 500, 750, 1000 }; -static int rates[] = { 34, 38, 42, 46, 50, 55, 59, 63, - 68, 76, 84, 92, 100, 110, 118, 126, - 136, 152, 168, 184, 200, 220, 236, 252, - 272, 304, 336, 368, 400, 440, 472, 504 }; - static int typematic_delay(int i) { - return (delays[(i >> 5) & 3]); + return (kbdelays[(i >> 5) & 3]); } static int typematic_rate(int i) { - return (rates[i & 0x1f]); + return (kbrates[i & 0x1f]); } static int @@ -1329,13 +1323,13 @@ typematic(int delay, int rate) int value; int i; - for (i = nitems(delays) - 1; i > 0; i --) { - if (delay >= delays[i]) + for (i = nitems(kbdelays) - 1; i > 0; i--) { + if (delay >= kbdelays[i]) break; } value = i << 5; - for (i = nitems(rates) - 1; i > 0; i --) { - if (rate >= rates[i]) + for (i = nitems(kbrates) - 1; i > 0; i--) { + if (rate >= kbrates[i]) break; } value |= i; diff --git a/sys/sys/kbio.h b/sys/sys/kbio.h index 80a58bf8e51e..3b632bf96361 100644 --- a/sys/sys/kbio.h +++ b/sys/sys/kbio.h @@ -70,6 +70,13 @@ struct keyboard_info { }; typedef struct keyboard_info keyboard_info_t; +/* keyboard repeat rate mapping table */ +static const int kbdelays[] = { 250, 500, 750, 1000 }; +static const int kbrates[] = { 34, 38, 42, 46, 50, + 55, 59, 63, 68, 76, 84, 92, 100, 110, 118, 126, + 136, 152, 168, 184, 200, 220, 236, 252, 272, 304, 336, + 368, 400, 440, 472, 504 }; + /* add/remove keyboard to/from mux */ #define KBADDKBD _IOW('K', 68, keyboard_info_t) /* add keyboard */ #define KBRELKBD _IOW('K', 69, keyboard_info_t) /* release keyboard */ diff --git a/usr.sbin/kbdcontrol/kbdcontrol.c b/usr.sbin/kbdcontrol/kbdcontrol.c index 4f3be144132b..614734e6123a 100644 --- a/usr.sbin/kbdcontrol/kbdcontrol.c +++ b/usr.sbin/kbdcontrol/kbdcontrol.c @@ -40,6 +40,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include "path.h" @@ -70,13 +71,13 @@ static const char ctrl_names[32][4] = { static const char acc_names[15][5] = { "dgra", "dacu", "dcir", "dtil", "dmac", "dbre", "ddot", - "duml", "dsla", "drin", "dced", "dapo", "ddac", "dogo", + "duml", "dsla", "drin", "dced", "dapo", "ddac", "dogo", "dcar", }; static const char acc_names_u[15][5] = { "DGRA", "DACU", "DCIR", "DTIL", "DMAC", "DBRE", "DDOT", - "DUML", "DSLA", "DRIN", "DCED", "DAPO", "DDAC", "DOGO", + "DUML", "DSLA", "DRIN", "DCED", "DAPO", "DDAC", "DOGO", "DCAR", }; @@ -107,13 +108,8 @@ static const char fkey_table[96][MAXFK] = { /* 93-96 */ "" , "" , "" , "" , }; -static const int delays[] = {250, 500, 750, 1000}; -static const int repeats[] = { 34, 38, 42, 46, 50, 55, 59, 63, - 68, 76, 84, 92, 100, 110, 118, 126, - 136, 152, 168, 184, 200, 220, 236, 252, - 272, 304, 336, 368, 400, 440, 472, 504}; -static const int ndelays = (sizeof(delays) / sizeof(int)); -static const int nrepeats = (sizeof(repeats) / sizeof(int)); +static const int ndelays = nitems(kbdelays); +static const int nrepeats = nitems(kbrates); static int hex = 0; static int paths_configured = 0; static int token; @@ -298,7 +294,7 @@ get_definition_line(FILE *file, keymap_t *keymap, accentmap_t *accentmap) if (token < 0) token = yylex(); - switch (token) { + switch (token) { case TNUM: c = get_key_definition_line(keymap); if (c < 0) @@ -751,7 +747,7 @@ dump_key_definition(char *name, keymap_t *keymap) dump_entry(keymap->key[i].map[j]); } printf("}, 0x%02X,0x%02X },\n", - (unsigned)keymap->key[i].spcl, + (unsigned)keymap->key[i].spcl, (unsigned)keymap->key[i].flgs); } printf("} };\n\n"); @@ -764,7 +760,7 @@ dump_accent_definition(char *name, accentmap_t *accentmap) int c; printf("static accentmap_t accentmap_%s = { %d", - name, accentmap->n_accs); + name, accentmap->n_accs); if (accentmap->n_accs <= 0) { printf(" };\n\n"); return; @@ -785,7 +781,7 @@ dump_accent_definition(char *name, accentmap_t *accentmap) } else printf(" 0x%02x, {", c); for (j = 0; j < NUM_ACCENTCHARS; j++) { - c = accentmap->acc[i].map[j][0]; + c = accentmap->acc[i].map[j][0]; if (c == 0) break; if ((j > 0) && ((j % 4) == 0)) @@ -793,7 +789,7 @@ dump_accent_definition(char *name, accentmap_t *accentmap) if (isascii(c) && isprint(c)) printf(" { '%c',", c); else - printf(" { 0x%02x,", c); + printf(" { 0x%02x,", c); printf("0x%02x },", accentmap->acc[i].map[j][1]); } printf(" }, },\n"); @@ -900,8 +896,8 @@ load_keymap(char *opt, int dumponly) fclose(file); return; } - if ((accentmap.n_accs > 0) - && (ioctl(0, PIO_DEADKEYMAP, &accentmap) < 0)) { + if ((accentmap.n_accs > 0) + && (ioctl(0, PIO_DEADKEYMAP, &accentmap) < 0)) { #ifdef OPIO_DEADKEYMAP to_old_accentmap(&accentmap, &oaccentmap); if (ioctl(0, OPIO_DEADKEYMAP, &oaccentmap) < 0) @@ -1058,14 +1054,20 @@ set_keyrates(char *opt) int r, d; if (!strcmp(opt, "slow")) { - delay = 1000, repeat = 500; - d = 3, r = 31; + delay = 1000; + repeat = 504; + d = 3; + r = 31; } else if (!strcmp(opt, "normal")) { - delay = 500, repeat = 125; - d = 1, r = 15; + delay = 500; + repeat = 126; + d = 1; + r = 15; } else if (!strcmp(opt, "fast")) { - delay = repeat = 0; - d = r = 0; + delay = 0; + repeat = 0; + d = 0; + r = 0; } else { int n; char *v1; @@ -1081,11 +1083,11 @@ badopt: return; } for (n = 0; n < ndelays - 1; n++) - if (delay <= delays[n]) + if (delay <= kbdelays[n]) break; d = n; for (n = 0; n < nrepeats - 1; n++) - if (repeat <= repeats[n]) + if (repeat <= kbrates[n]) break; r = n; } @@ -1093,6 +1095,7 @@ badopt: arg[0] = delay; arg[1] = repeat; if (ioctl(0, KDSETREPEAT, arg)) { + warn("fallback, setting keyboard rate via legacy interface (KDSETRAD), will be removed soon"); if (ioctl(0, KDSETRAD, (d << 5) | r)) warn("setting keyboard rate"); } @@ -1151,7 +1154,7 @@ set_keyboard(char *device) } /* * The keyboard device driver won't release the keyboard by - * the following ioctl, but it automatically will, when the device + * the following ioctl, but it automatically will, when the device * is closed. So, we don't check error here. */ ioctl(fd, CONS_RELKBD, 0);