diff options
| author | Stefan Eßer <se@FreeBSD.org> | 2023-02-06 22:48:47 +0000 |
|---|---|---|
| committer | Stefan Eßer <se@FreeBSD.org> | 2023-02-06 22:48:47 +0000 |
| commit | 4972fb9276389fb87a790b415b1161cff395884c (patch) | |
| tree | fe8ec2f293ad52375ac97028d8e5459039d5576b /sys/dev/kbd | |
| parent | a527c18cd7ba5d4afacbfb85817ca7b8b2487b52 (diff) | |
Diffstat (limited to 'sys/dev/kbd')
| -rw-r--r-- | sys/dev/kbd/kbd.c | 52 |
1 files changed, 48 insertions, 4 deletions
diff --git a/sys/dev/kbd/kbd.c b/sys/dev/kbd/kbd.c index deb7672de7fa..41d6fd5666d8 100644 --- a/sys/dev/kbd/kbd.c +++ b/sys/dev/kbd/kbd.c @@ -790,6 +790,8 @@ genkbd_commonioctl(keyboard_t *kbd, u_long cmd, caddr_t arg) { keymap_t *mapp; okeymap_t *omapp; + accentmap_t *accentmapp; + oaccentmap_t *oaccentmapp; keyarg_t *keyp; fkeyarg_t *fkeyp; int i, j; @@ -898,16 +900,58 @@ genkbd_commonioctl(keyboard_t *kbd, u_long cmd, caddr_t arg) #endif case GIO_DEADKEYMAP: /* get accent key translation table */ - bcopy(kbd->kb_accentmap, arg, sizeof(*kbd->kb_accentmap)); + error = copyout(kbd->kb_accentmap, *(void **)arg, + sizeof(accentmap_t)); + return (error); + break; + case OGIO_DEADKEYMAP: /* get accent key translation table (compat) */ + accentmapp = kbd->kb_accentmap; + oaccentmapp = (oaccentmap_t *)arg; + oaccentmapp->n_accs = accentmapp->n_accs; + for (i = 0; i < NUM_DEADKEYS; i++) { + oaccentmapp->acc[i].accchar = + accentmapp->acc[i].accchar; + for (j = 0; j < NUM_ACCENTCHARS; j++) { + oaccentmapp->acc[i].map[j][0] = + accentmapp->acc[i].map[j][0]; + oaccentmapp->acc[i].map[j][1] = + accentmapp->acc[i].map[j][1]; + } + } break; + case PIO_DEADKEYMAP: /* set accent key translation table */ + case OPIO_DEADKEYMAP: /* set accent key translation table (compat) */ #ifndef KBD_DISABLE_KEYMAP_LOAD - error = accent_change_ok(kbd->kb_accentmap, - (accentmap_t *)arg, curthread); + accentmapp = malloc(sizeof(*accentmapp), M_TEMP, M_WAITOK); + if (cmd == OPIO_DEADKEYMAP) { + oaccentmapp = (oaccentmap_t *)arg; + accentmapp->n_accs = oaccentmapp->n_accs; + for (i = 0; i < NUM_DEADKEYS; i++) { + for (j = 0; j < NUM_ACCENTCHARS; j++) { + accentmapp->acc[i].map[j][0] = + oaccentmapp->acc[i].map[j][0]; + accentmapp->acc[i].map[j][1] = + oaccentmapp->acc[i].map[j][1]; + accentmapp->acc[i].accchar = + oaccentmapp->acc[i].accchar; + } + } + } else { + error = copyin(*(void **)arg, accentmapp, sizeof(*accentmapp)); + if (error != 0) { + free(accentmapp, M_TEMP); + return (error); + } + } + + error = accent_change_ok(kbd->kb_accentmap, accentmapp, curthread); if (error != 0) { + free(accentmapp, M_TEMP); return (error); } - bcopy(arg, kbd->kb_accentmap, sizeof(*kbd->kb_accentmap)); + bcopy(accentmapp, kbd->kb_accentmap, sizeof(*kbd->kb_accentmap)); + free(accentmapp, M_TEMP); break; #else return (ENODEV); |
