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>
        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);
        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);
 
                        kbd->kbdmode = VC_UNICODE;
                        compute_shiftstate();
                        break;
+                 case K_OFF:
+                       kbd->kbdmode = VC_OFF;
+                       break;
                  default:
                        ret = -EINVAL;
                        goto out;
 
 #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 */
 
 #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 */