FreeBSD Bugzilla – Attachment 131359 Details for
Bug 175425
[patch] kbdcontrol(1) printout about kbdmux isn't informative
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
patch-kbd-mux-contents.txt
patch-kbd-mux-contents.txt (text/plain; charset=UTF-8), 6.15 KB, created by
Yuri Victorovich
on 2013-01-21 19:12:07 UTC
(
hide
)
Description:
patch-kbd-mux-contents.txt
Filename:
MIME Type:
Creator:
Yuri Victorovich
Created:
2013-01-21 19:12:07 UTC
Size:
6.15 KB
patch
obsolete
>Index: sys/dev/kbdmux/kbdmux.c >=================================================================== >--- sys/dev/kbdmux/kbdmux.c (revision 245708) >+++ sys/dev/kbdmux/kbdmux.c (working copy) >@@ -943,6 +943,9 @@ > kbdmux_state_t *state = (kbdmux_state_t *) kbd->kb_data; > kbdmux_kbd_t *k; > keyboard_info_t *ki; >+ keyboard_info_array_t *kia; >+ keyboard_info_t *kia_limit; >+ int ki_count; > int error = 0, mode; > #ifdef COMPAT_FREEBSD6 > int ival; >@@ -1049,6 +1052,35 @@ > KBDMUX_UNLOCK(state); > break; > >+ case KBLSTKBD: /* list mux contents */ >+ kia = (keyboard_info_array_t *) arg; >+ >+ if (kia == NULL || kia->len <= 0) >+ return (EINVAL); /* bad input */ >+ >+ KBDMUX_LOCK(state); >+ >+ kia_limit = (keyboard_info_t *) ((char*)arg+kia->len); >+ ki = kia->kbs; >+ ki_count = 0; >+ SLIST_FOREACH(k, &state->ks_kbds, next) { >+ if (ki+1 > kia_limit) >+ break; >+ ki->kb_index = k->kbd->kb_index; >+ (void) strcpy(ki->kb_name, k->kbd->kb_name); >+ ki->kb_unit = k->kbd->kb_unit; >+ ki->kb_type = k->kbd->kb_type; >+ ki->kb_config = k->kbd->kb_config; >+ ki->kb_flags = k->kbd->kb_flags; >+ >+ ki++; >+ ki_count++; >+ } >+ kia->len = ki_count; >+ >+ KBDMUX_UNLOCK(state); >+ break; >+ > case KDGKBMODE: /* get kyboard mode */ > KBDMUX_LOCK(state); > *(int *)arg = state->ks_mode; >Index: sys/dev/syscons/syscons.c >=================================================================== >--- sys/dev/syscons/syscons.c (revision 245708) >+++ sys/dev/syscons/syscons.c (working copy) >@@ -1349,6 +1349,7 @@ > > case KBADDKBD: /* add/remove keyboard to/from mux */ > case KBRELKBD: >+ case KBLSTKBD: > error = kbdd_ioctl(sc->kbd, cmd, data); > if (error == ENOIOCTL) > error = ENODEV; >Index: sys/sys/kbio.h >=================================================================== >--- sys/sys/kbio.h (revision 245708) >+++ sys/sys/kbio.h (working copy) >@@ -70,9 +70,16 @@ > }; > typedef struct keyboard_info keyboard_info_t; > >+struct keyboard_info_array { >+ int len; /* array kbs[] length */ >+ keyboard_info_t kbs[1]; /* variable size array */ >+} __packed; >+typedef struct keyboard_info_array keyboard_info_array_t; >+ > /* 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 */ >+#define KBLSTKBD _IOWRE('K', 70) /* list mux */ > > /* see console.h for the definition of the following ioctl */ > #ifdef notdef >Index: usr.sbin/kbdcontrol/kbdcontrol.1 >=================================================================== >--- usr.sbin/kbdcontrol/kbdcontrol.1 (revision 245708) >+++ usr.sbin/kbdcontrol/kbdcontrol.1 (working copy) >@@ -146,6 +146,8 @@ > Use hexadecimal numbers in keyboard map dump. > .It Fl i > Print brief information about the keyboard. >+.It Fl I >+Print contents of the keyboard multiplexer. > .It Fl K > Disconnect the keyboard from the console. > You need to use the >Index: usr.sbin/kbdcontrol/kbdcontrol.c >=================================================================== >--- usr.sbin/kbdcontrol/kbdcontrol.c (revision 245708) >+++ usr.sbin/kbdcontrol/kbdcontrol.c (working copy) >@@ -138,6 +138,7 @@ > void set_keyboard(char *device); > void set_keyrates(char *opt); > void show_kbd_info(void); >+void show_mux_info(void); > void usage(void) __dead2; > > char * >@@ -1011,6 +1012,22 @@ > return "unknown"; > } > >+static void >+print_kbd_info(keyboard_info_t *info) >+{ >+ printf("%.*s%d, type:%s (%d)\n", >+ (int)sizeof(info->kb_name), info->kb_name, info->kb_unit, >+ get_kbd_type_name(info->kb_type), info->kb_type); >+} >+ >+static void >+print_kbd_info_extended(keyboard_info_t *info) >+{ >+ printf("kbd%d:\n", info->kb_index); >+ printf(" "); >+ print_kbd_info(info); >+} >+ > void > show_kbd_info(void) > { >@@ -1020,13 +1037,41 @@ > warn("unable to obtain keyboard information"); > return; > } >- printf("kbd%d:\n", info.kb_index); >- printf(" %.*s%d, type:%s (%d)\n", >- (int)sizeof(info.kb_name), info.kb_name, info.kb_unit, >- get_kbd_type_name(info.kb_type), info.kb_type); >+ print_kbd_info_extended(&info); > } > > void >+show_mux_info(void) >+{ >+ int i; >+ keyboard_info_t info_mux; >+ >+ keyboard_info_array_t *info_arr = (keyboard_info_array_t*) >+ malloc(IOCPARM_MAX); >+ info_arr->len = IOCPARM_MAX; >+ >+ if (ioctl(0, KDGKBINFO, &info_mux) == -1) { >+ warn("unable to obtain keyboard information"); >+ free(info_arr); >+ return; >+ } >+ if (ioctl(0, KBLSTKBD, info_arr) == -1) { >+ warn("unable to obtain keyboard multiplexer information"); >+ free(info_arr); >+ return; >+ } >+ >+ printf("Keyboard multiplexor kbd%d: ", info_mux.kb_index); >+ print_kbd_info(&info_mux); >+ for (i=0; i<info_arr->len; i++) { >+ printf(" part[%i]: kbd%d: ", i, info_arr->kbs[i].kb_index); >+ print_kbd_info(&info_arr->kbs[i]); >+ } >+ >+ free(info_arr); >+} >+ >+void > set_keyboard(char *device) > { > keyboard_info_t info; >@@ -1050,10 +1095,7 @@ > ioctl(fd, CONS_RELKBD, 0); > close(fd); > #if 1 >- printf("kbd%d\n", info.kb_index); >- printf(" %.*s%d, type:%s (%d)\n", >- (int)sizeof(info.kb_name), info.kb_name, info.kb_unit, >- get_kbd_type_name(info.kb_type), info.kb_type); >+ print_kbd_info_extended(&info); > #endif > > if (ioctl(0, CONS_SETKBD, info.kb_index) == -1) >@@ -1074,10 +1116,7 @@ > return; > } > #if 1 >- printf("kbd%d\n", info.kb_index); >- printf(" %.*s%d, type:%s (%d)\n", >- (int)sizeof(info.kb_name), info.kb_name, info.kb_unit, >- get_kbd_type_name(info.kb_type), info.kb_type); >+ print_kbd_info_extended(&info); > #endif > if (ioctl(0, CONS_RELKBD, 0) == -1) > warn("unable to release the keyboard"); >@@ -1098,10 +1137,7 @@ > return; > } > #if 1 >- printf("kbd%d\n", info.kb_index); >- printf(" %.*s%d, type:%s (%d)\n", >- (int)sizeof(info.kb_name), info.kb_name, info.kb_unit, >- get_kbd_type_name(info.kb_type), info.kb_type); >+ print_kbd_info_extended(&info); > #endif > /* > * split kbd into name and unit. find the right most part of the >@@ -1163,7 +1199,7 @@ > { > int opt; > >- while((opt = getopt(argc, argv, "A:a:b:df:iKk:Fl:L:r:x")) != -1) >+ while((opt = getopt(argc, argv, "A:a:b:df:iIKk:Fl:L:r:x")) != -1) > switch(opt) { > case 'A': > case 'a': >@@ -1191,6 +1227,9 @@ > case 'i': > show_kbd_info(); > break; >+ case 'I': >+ show_mux_info(); >+ break; > case 'K': > release_keyboard(); > break;
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 175425
:
131357
|
131358
| 131359