]> xenbits.xensource.com Git - xenclient/ioemu.git/commitdiff
Fix the secure auth and add some switching sanity check.
authorJean Guyader <jean.guyader@eu.citrix.com>
Wed, 10 Dec 2008 17:37:13 +0000 (17:37 +0000)
committerJean Guyader <jean.guyader@eu.citrix.com>
Wed, 10 Dec 2008 17:37:13 +0000 (17:37 +0000)
dom0_driver.c

index 1b69d72b671d63484109ef415fabe04a8c88f4f6..386b2949de1bae1b6cd53da088fbb1c2168b08f0 100644 (file)
@@ -78,6 +78,7 @@ struct dom0_driver
     QEMUTimer *xs_timer;
     uint8_t scroll_lock_count;
     int key_status[256];
+    int secure_fd;
 };
 
 struct dom0_driver_xs_info
@@ -107,6 +108,8 @@ static void dom0_driver_redirect_fds(IOHandler *callback)
 {
     int *fd = 0;
 
+    DEBUG("Redirect fds\n");
+
     fd = driver.keyboard_fds;
     while (*fd != -1)
     {
@@ -119,6 +122,11 @@ static void dom0_driver_redirect_fds(IOHandler *callback)
         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,
@@ -260,10 +268,20 @@ static void dom0_driver_detect_secure_auth(int keycode)
         (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");
     }
@@ -283,6 +301,14 @@ static void dom0_key_event(int code, uint32_t keycode)
             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);
 }
 
@@ -324,7 +350,7 @@ static void dom0_get_positions(int *positions)
 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
 };
 
@@ -347,7 +373,7 @@ static void dom0_read_secure(void *opaque)
 {
     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));
@@ -369,11 +395,15 @@ static void dom0_read_secure(void *opaque)
                 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);
@@ -397,6 +427,15 @@ static void dom0_read(void *opaque)
             {
                 /* 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)
                 {