QEMUTimer *xs_timer;
uint8_t scroll_lock_count;
int key_status[256];
+ int secure_fd;
};
struct dom0_driver_xs_info
{
int *fd = 0;
+ DEBUG("Redirect fds\n");
+
fd = driver.keyboard_fds;
while (*fd != -1)
{
qemu_set_fd_handler(*fd, callback, NULL, fd);
fd++;
}
+ if (callback == dom0_read)
+ {
+ DEBUG("End of the secure mode\n");
+ close(driver.secure_fd);
+ }
}
static void dom0_driver_read_xs_info(struct dom0_driver_xs_info *info,
(driver.key_status[KEY_BACKSPACE]))
{
struct stat s;
+ int sas_ascii = 1, ret = 0;;
DEBUG("Received SAS keystroke\n");
- if (stat("/var/lib/xenmgr/keys", &s) == 0)
- dom0_driver_redirect_fds(dom0_read_secure);
+ if ((driver.secure_fd = open("/var/lib/xenmgr/keys", O_WRONLY)) > 0)
+ {
+ DEBUG("write SAS ascii code\n");
+ if ((ret = write(driver.secure_fd, &sas_ascii, 1)) == 1)
+ {
+ DEBUG("Redirect fds to secure callback\n");
+ dom0_driver_redirect_fds(dom0_read_secure);
+ }
+ DEBUG("writing SAS ret %d\n", ret);
+
+ }
else
DEBUG("xenmgr file is not there\n");
}
dom0_driver_detect_secure_auth(keycode);
}
+ dom0_driver_read_xs_info(&keyboard, DOM0_KEYBOARD);
+ if (keyboard.state == 0)
+ {
+ dom0_driver_xs_write("state", 1, DOM0_KEYBOARD);
+ dom0_driver_xs_write("domid", domid, DOM0_KEYBOARD);
+ }
+
+
dom0_key_inject(code, keycode);
}
static const int ascii2keycode_table[] =
{
KEY_A, KEY_B, KEY_C, KEY_D, KEY_E, KEY_F, KEY_G, KEY_H, KEY_I, KEY_J, KEY_K,
- KEY_L, KEY_M, KEY_N, KEY_M, KEY_O, KEY_P, KEY_Q, KEY_R, KEY_S, KEY_T, KEY_U,
+ KEY_L, KEY_M, KEY_N, KEY_O, KEY_P, KEY_Q, KEY_R, KEY_S, KEY_T, KEY_U,
KEY_V, KEY_W, KEY_X, KEY_Y, KEY_Z
};
{
int fd = *(int *)opaque;
struct input_event event[5];
- int read_sz, i;
+ int read_sz, write_sz = 1, i;
char ascii = 0;
read_sz = read(fd, event, sizeof (event));
default:
ascii = keycode2ascii(event[i].code);
}
- DEBUG("Send %d to xenmgr (keycode was %d)\n", ascii, event[i].code);
- if (event[i].code == KEY_ESC)
- break;
+ if (ascii)
+ {
+ DEBUG("Send %d to xenmgr (keycode was %d)\n", ascii, event[i].code);
+ write_sz = write(driver.secure_fd, &ascii, 1);
+ if (event[i].code == KEY_ESC || write_sz != 1)
+ break;
+ }
}
- if (read_sz <= 0 || event[i].code == KEY_ESC)
+ if (read_sz <= 0 || event[i].code == KEY_ESC || write_sz != 1)
{
dom0_driver_reset_keyboard();
dom0_driver_redirect_fds(dom0_read);
{
/* Mouse Key */
int type = 0;
+ struct dom0_driver_xs_info mouse;
+
+ dom0_driver_read_xs_info(&mouse, DOM0_MOUSE);
+ if (mouse.state == 0)
+ {
+ dom0_driver_xs_write("state", 1, DOM0_MOUSE);
+ dom0_driver_xs_write("domid", domid, DOM0_MOUSE);
+ }
+
switch(event[i].code)
{