]> xenbits.xensource.com Git - xenclient/ioemu.git/commitdiff
dom0_driver,hid-linux:
authorJean Guyader <jean.guyader@eu.citrix.com>
Tue, 17 Mar 2009 10:19:23 +0000 (10:19 +0000)
committerJean Guyader <jean.guyader@eu.citrix.com>
Tue, 17 Mar 2009 10:19:23 +0000 (10:19 +0000)
- Add timeout for the ioctl grab.
- Fix secure login

dom0_driver.c
hid-linux.c

index fa4fc161c24bd475cbb43b5133257be24cc2520c..4c3c60623ad30c62472395bff83110145bdf23f5 100644 (file)
@@ -224,11 +224,6 @@ static void dom0_driver_key_switch(int new_slot)
     xenstore_write_dom0_driver("command", buff);
 }
 
-static void dom0_driver_key_switch_1(void)
-{
-    dom0_driver_key_switch(1);
-}
-
 static void dom0_driver_read_secure(int ascii)
 {
     int write_sz;
@@ -339,7 +334,7 @@ static int dom0_driver_failover_switch(void *opaque)
     if (!vga_passthrough)
        return 0;
 
-        if (mouse.state == -1)
+    if (mouse.state == -1)
     {
        DEBUG("No state grab the device\n");
        dom0_gr_devices(1, DOM0_KEYBOARD);
@@ -657,6 +652,12 @@ void dom0_driver_switch_bind(void)
        binds[1] = KEY_1 + i;
        dom0_driver_handler->add_binding(binds, dom0_driver_switch, (void*)(i + 1));
     }
+
+    binds[0] = KEY_LEFTCTRL;
+    binds[1] = KEY_LEFTALT;
+    binds[2] = KEY_BACKSPACE;
+    binds[3] = -1;
+    dom0_driver_handler->add_binding(binds, dom0_driver_detect_secure_auth, NULL);
 }
 
 void dom0_driver_init(const char *position)
index 6daf5e23222776bf1049f1001940aa26519f85c9..d091c54c44d61622e354eb5f5538f62b6e1fd888 100644 (file)
@@ -70,6 +70,7 @@ static struct hid_linux_driver
     char       *controller_paths[HID_LINUX_MAX_DEV];
     int                mouse_button_state;
     int                key_status[256];
+    void       (*secure_key)(int ascii);
 } hid_linux_driver;
 
 struct hid_linux_binding
@@ -208,17 +209,7 @@ static void hid_linux_key_inject(int code, uint32_t keycode)
        kbd_put_keycode(keycode & 0x7f);
 }
 
-void hid_linux_reset_keyboard(void)
-{
-    int i = 0;
 
-    for (i = 0; i < 256; i++)
-       if (hid_linux_driver.key_status[i])
-       {
-           hid_linux_key_inject(0, i);
-           hid_linux_driver.key_status[i] = 0;
-       }
-}
 
 static void hid_linux_key_event(int code, uint32_t keycode)
 {
@@ -228,21 +219,6 @@ static void hid_linux_key_event(int code, uint32_t keycode)
     hid_linux_key_inject(code, keycode);
 }
 
-void hid_linux_secure_keyboard(void (*cb)(int ascii))
-{
-}
-
-static void hid_linux_redirect_fds(int *fd, IOHandler *cb)
-{
-    assert(fd != NULL);
-
-    while (*fd != -1)
-    {
-       qemu_set_fd_handler(*fd, cb, NULL, fd);
-       fd++;
-    }
-}
-
 static void hid_linux_read(void *opaque)
 {
     struct input_event  event[5];
@@ -332,20 +308,80 @@ static void hid_linux_read(void *opaque)
     }
 }
 
+void hid_linux_reset_keyboard(void)
+{
+    int i = 0;
+
+    for (i = 0; i < 256; i++)
+       if (hid_linux_driver.key_status[i])
+       {
+           hid_linux_key_inject(0, i);
+           hid_linux_driver.key_status[i] = 0;
+       }
+}
+
+
+
+static void hid_linux_redirect_fds(int *fd, IOHandler *cb)
+{
+    assert(fd != NULL);
+
+    while (*fd != -1)
+    {
+       qemu_set_fd_handler(*fd, cb, NULL, fd);
+       fd++;
+    }
+}
+
+static void hid_linux_secure_read(void *opaque)
+{
+    struct input_event  event[5];
+    int                 i = 0;
+    int                 read_sz = 0;
+    int                 fd = *(int *)opaque;
+
+    assert(hid_linux_driver.secure_key);
+
+    read_sz = read(fd, event, sizeof (event));
+    for (i = 0; i < read_sz / (sizeof (struct input_event)); i++)
+       if (event[i].type == EV_KEY && event[i].code < BTN_MOUSE &&
+               event[i].value > 0)
+           hid_linux_driver.secure_key(keycode2ascii(event[i].code));
+}
+
+
+void hid_linux_secure_keyboard(void (*cb)(int ascii))
+{
+    hid_linux_driver.secure_key = cb;
+    if (cb)
+       hid_linux_redirect_fds(hid_linux_driver.keyboard_fds,
+               hid_linux_secure_read);
+    else
+       hid_linux_redirect_fds(hid_linux_driver.keyboard_fds,
+               hid_linux_read);
+}
+
 static int hid_linux_grab_devices(int grab, int *fd)
 {
     int rc = 0;
+    int try = 10;
 
     assert(fd != NULL && *fd != -1);
     for (; *fd != -1; fd++)
     {
-       if ((rc = ioctl(*fd, EVIOCGRAB, grab)) == -1)
+       while (try--)
        {
-           char *er;
-           er = strerror(errno);
-           DEBUG("ioctl(%d, EVOCGRAB) failed, %s\n", *fd, er);
-           return 0;
+           if ((rc = ioctl(*fd, EVIOCGRAB, grab)) == -1)
+           {
+               char *er;
+               er = strerror(errno);
+               DEBUG("ioctl(%d, EVOCGRAB) failed, %s\n", *fd, er);
+               return 0;
+           }
+           else
+               break;
        }
+       assert(try);
 
        DEBUG("ioctl(%d, EVOCGRAB) succed\n", *fd);