libevdev: move input event logging very close to read().

We want to be sure we aren't missing any input events, even if they
come in with odd timestamps.

BUG=chromium-os:33601
TEST=tested on device; dumped log looked correct

Change-Id: I9c6e99b7bed6580b84f50cfa80766a8eb08489d4
Reviewed-on: https://gerrit.chromium.org/gerrit/30637
Commit-Ready: Andrew de los Reyes <adlr@chromium.org>
Reviewed-by: Andrew de los Reyes <adlr@chromium.org>
Tested-by: Andrew de los Reyes <adlr@chromium.org>
diff --git a/src/libevdev.c b/src/libevdev.c
index 45914c9..19dfb5e 100644
--- a/src/libevdev.c
+++ b/src/libevdev.c
@@ -44,6 +44,7 @@
 
 int EvdevRead(EvdevPtr evdev) {
   struct input_event ev[NUM_EVENTS];
+  EventStatePtr evstate = evdev->evstate;
   int i;
   int len;
   bool sync_evdev_state = false;
@@ -53,6 +54,16 @@
     if (len <= 0)
       return errno;
 
+    /* Read as many whole struct input_event objects as we can into the
+       circular buffer */
+    if (evstate->debug_buf) {
+      for (i = 0; i < len / sizeof(*ev); i++) {
+        evstate->debug_buf[evstate->debug_buf_tail] = ev[i];
+        evstate->debug_buf_tail =
+            (evstate->debug_buf_tail + 1) % DEBUG_BUF_SIZE;
+      }
+    }
+
     /* kernel always delivers complete events, so len must be sizeof *ev */
     if (len % sizeof(*ev))
       return errno;