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