vt: Add virtual console keyboard mode OFF
authorArthur Taylor <art@ified.ca>
Fri, 4 Feb 2011 21:55:50 +0000 (13:55 -0800)
committerGreg Kroah-Hartman <gregkh@suse.de>
Thu, 17 Feb 2011 19:12:40 +0000 (11:12 -0800)
virtual console: add keyboard mode OFF

Add a new mode for the virtual console keyboard OFF in which all input
other than shift keys is ignored. Prevents vt input buffers from
overflowing when a program opens but doesn't read from a tty, like X11
using evdev for input.

Signed-off-by: Arthur Taylor <art@ified.ca>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/tty/vt/keyboard.c
drivers/tty/vt/vt_ioctl.c
include/linux/kbd_kern.h
include/linux/kd.h

index e95d7876ca6bd573b110b778ffb52574dda62038..6dd3c68c13add15f4a0452f06694fbd7a2c06cf4 100644 (file)
@@ -654,7 +654,8 @@ static void k_spec(struct vc_data *vc, unsigned char value, char up_flag)
        if (value >= ARRAY_SIZE(fn_handler))
                return;
        if ((kbd->kbdmode == VC_RAW ||
-            kbd->kbdmode == VC_MEDIUMRAW) &&
+            kbd->kbdmode == VC_MEDIUMRAW ||
+            kbd->kbdmode == VC_OFF) &&
             value != KVAL(K_SAK))
                return;         /* SAK is allowed even in raw mode */
        fn_handler[value](vc);
@@ -1295,7 +1296,7 @@ static void kbd_keycode(unsigned int keycode, int down, int hw_raw)
        if (rc == NOTIFY_STOP)
                return;
 
-       if (raw_mode && type != KT_SPEC && type != KT_SHIFT)
+       if ((raw_mode || kbd->kbdmode == VC_OFF) && type != KT_SPEC && type != KT_SHIFT)
                return;
 
        (*k_handler[type])(vc, keysym & 0xff, !down);
index 1235ebda6e1c094bba7338e60c180bbd3823d4d3..6bcf05bf49784f1f252a7c793a7391464b052040 100644 (file)
@@ -688,6 +688,9 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
                        kbd->kbdmode = VC_UNICODE;
                        compute_shiftstate();
                        break;
+                 case K_OFF:
+                       kbd->kbdmode = VC_OFF;
+                       break;
                  default:
                        ret = -EINVAL;
                        goto out;
index 506ad20c18f8736b355530cc01fa91ca149fe322..4b0761cc7dd9d448ee22d6a9252405b83e1ef315 100644 (file)
@@ -50,11 +50,12 @@ struct kbd_struct {
 #define VC_CAPSLOCK    2       /* capslock mode */
 #define VC_KANALOCK    3       /* kanalock mode */
 
-       unsigned char kbdmode:2;        /* one 2-bit value */
+       unsigned char kbdmode:3;        /* one 3-bit value */
 #define VC_XLATE       0       /* translate keycodes using keymap */
 #define VC_MEDIUMRAW   1       /* medium raw (keycode) mode */
 #define VC_RAW         2       /* raw (scancode) mode */
 #define VC_UNICODE     3       /* Unicode mode */
+#define VC_OFF         4       /* disabled mode */
 
        unsigned char modeflags:5;
 #define VC_APPLIC      0       /* application key mode */
index 15f2853ea58f70dbbf533198dfb286aa8bf4e73f..c36d8476db555711a7bb921fd783f4e51c7f1359 100644 (file)
@@ -81,6 +81,7 @@ struct unimapinit {
 #define                K_XLATE         0x01
 #define                K_MEDIUMRAW     0x02
 #define                K_UNICODE       0x03
+#define                K_OFF           0x04
 #define KDGKBMODE      0x4B44  /* gets current keyboard mode */
 #define KDSKBMODE      0x4B45  /* sets current keyboard mode */