From: Jean Guyader Date: Tue, 17 Mar 2009 10:19:23 +0000 (+0000) Subject: dom0_driver,hid-linux: X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=ccbd6714a75a6916ef312edeb45adc8f65a65957;p=xenclient%2Fioemu.git dom0_driver,hid-linux: - Add timeout for the ioctl grab. - Fix secure login --- diff --git a/dom0_driver.c b/dom0_driver.c index fa4fc161..4c3c6062 100644 --- a/dom0_driver.c +++ b/dom0_driver.c @@ -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) diff --git a/hid-linux.c b/hid-linux.c index 6daf5e23..d091c54c 100644 --- a/hid-linux.c +++ b/hid-linux.c @@ -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);