From: Andrey Vagin <ava...@openvz.org>

port of 2.6.32-x diff-ms-input-detach-input-from-console
ported by Dmitry Guryanov <dgurya...@parallels.com>

Signed-off-by: Andrey Vagin <ava...@openvz.org>
Signed-off-by: Dmitry Guryanov <dgurya...@parallels.com>

Author: Andrey Vagin
Email: ava...@openvz.org
Subject: kbd: add file kbd_bind in sysfs, which allow unbind keyboard from tty 
(v2)
Date: Tue, 18 Jan 2011 13:15:34 +0300

It's necessary when we want move keyboard to CT.

To unbind keyboard need write "unbind" in kbd_bind.
To bind keyboard need write "all" in kbd_bind.
In future we will can send tty "name", that bind keyboard to specified tty.

https://jira.sw.ru/browse/PCLIN-28731

Was requested by Disney - they wanted CT X user not to affect system console.

+++
ve/device: input_mutex isn't static now

port of 2.6.32-x diff-ms-input-unstatic-input_mutex
ported by Dmitry Guryanov <dgurya...@parallels.com>

Signed-off-by: Andrey Vagin <ava...@openvz.org>
Signed-off-by: Dmitry Guryanov <dgurya...@parallels.com>

Author: Andrey Vagin
Email: ava...@openvz.org
Subject: device: input_mutex isn't static now
Date: Tue, 18 Jan 2011 13:15:33 +0300

 https://jira.sw.ru/browse/PCLIN-28731

(cherry picked from commit e099d5a58856d3639475543d211192123c96574d)
Signed-off-by: Konstantin Khorenko <khore...@virtuozzo.com>

khorenko@: Teradici cards have usb ports which can be used for
keyboard input.
---
 drivers/input/input.c     |  2 +-
 drivers/tty/vt/keyboard.c | 74 +++++++++++++++++++++++++++++++++++++--
 2 files changed, 73 insertions(+), 3 deletions(-)

diff --git a/drivers/input/input.c b/drivers/input/input.c
index ccaeb2426385..4b3fe7f5b6f4 100644
--- a/drivers/input/input.c
+++ b/drivers/input/input.c
@@ -43,7 +43,7 @@ static LIST_HEAD(input_handler_list);
  * be mutually exclusive which simplifies locking in drivers implementing
  * input handlers.
  */
-static DEFINE_MUTEX(input_mutex);
+DEFINE_MUTEX(input_mutex);
 
 static const struct input_value input_value_sync = { EV_SYN, SYN_REPORT, 1 };
 
diff --git a/drivers/tty/vt/keyboard.c b/drivers/tty/vt/keyboard.c
index 4b0d69042ceb..1cafb885ccc1 100644
--- a/drivers/tty/vt/keyboard.c
+++ b/drivers/tty/vt/keyboard.c
@@ -46,6 +46,7 @@
 #include <linux/tty.h>
 #include <linux/uaccess.h>
 #include <linux/vt_kern.h>
+#include <linux/device.h>
 
 #include <asm/irq_regs.h>
 
@@ -1560,7 +1561,7 @@ static bool kbd_match(struct input_handler *handler, 
struct input_dev *dev)
  * likes it, it can open it and get events from it. In this (kbd_connect)
  * function, we should decide which VT to bind that keyboard to initially.
  */
-static int kbd_connect(struct input_handler *handler, struct input_dev *dev,
+static int __kbd_connect(struct input_handler *handler, struct input_dev *dev,
                        const struct input_device_id *id)
 {
        struct input_handle *handle;
@@ -1591,13 +1592,82 @@ static int kbd_connect(struct input_handler *handler, 
struct input_dev *dev,
        return error;
 }
 
-static void kbd_disconnect(struct input_handle *handle)
+static void __kbd_disconnect(struct input_handle *handle)
 {
        input_close_device(handle);
        input_unregister_handle(handle);
        kfree(handle);
 }
 
+extern struct mutex input_mutex;
+/*
+ * To unbind keyboard need write "unbind" in kbd_bind
+ * To bind keyboard to all TTYs need write "all" in kbd_bind (by default)
+ * To bind keyboard to specified TTY... (not implemented)
+ */
+static ssize_t kbd_bind_store(struct device *dev,
+                                struct device_attribute *attr,
+                                const char *buf, size_t len)
+{
+       struct list_head *node;
+       int ret = -EINVAL;
+       struct input_dev *idev;
+       char *s;
+
+       if (buf[len] != '\0')
+               return -EINVAL;
+
+/*     if (!ve_is_super(get_exec_env()))
+               return -EPERM;
+*/
+       s = strchr(buf, '\n');
+       if (s)
+               *s = '\0';
+
+       mutex_lock(&input_mutex);
+       if (!strcmp(buf, "unbind")) {
+               list_for_each(node, &kbd_handler.h_list) {
+                       struct input_handle *handle = container_of(node,
+                                       struct input_handle, h_node);
+                       idev = handle->dev;
+                       if (&idev->dev == dev) {
+                               __kbd_disconnect(handle);
+                               ret = len;
+                               break;
+                       }
+               }
+       } else if (!strcmp(buf, "all")) {
+               idev = container_of(dev, struct input_dev, dev);
+               ret = __kbd_connect(&kbd_handler, idev, NULL);
+               if (!ret)
+                       ret = len;
+       }
+       mutex_unlock(&input_mutex);
+
+       return ret;
+}
+
+static DEVICE_ATTR(kbd_bind, S_IWUSR, NULL , kbd_bind_store);
+
+static int kbd_connect(struct input_handler *handler, struct input_dev *dev,
+                       const struct input_device_id *id)
+{
+       int error;
+       error = device_create_file(&dev->dev, &dev_attr_kbd_bind);
+       if (error)
+               return error;
+       error = __kbd_connect(handler, dev, id);
+       if (error)
+               device_remove_file(&dev->dev, &dev_attr_kbd_bind);
+       return error;
+}
+
+static void kbd_disconnect(struct input_handle *handle)
+{
+       device_remove_file(&handle->dev->dev, &dev_attr_kbd_bind);
+       __kbd_disconnect(handle);
+}
+
 /*
  * Start keyboard handler on the new keyboard by refreshing LED state to
  * match the rest of the system.
-- 
2.31.1

_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to