]> git.scottworley.com Git - keystroke-timestamps/blobdiff - keystroke-timestamps.c
Use the file descriptors from select
[keystroke-timestamps] / keystroke-timestamps.c
index 693560025031b7a521cde6a196b145e90be07ce3..6cb49731cba993b270561b790e55fed2f4f5657f 100644 (file)
@@ -6,6 +6,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <sysexits.h>
 #include <stdlib.h>
 #include <string.h>
 #include <sysexits.h>
+#include <sys/select.h>
 #include <unistd.h>
 
 int main (int argc, char **argv)
 #include <unistd.h>
 
 int main (int argc, char **argv)
@@ -28,20 +29,39 @@ int main (int argc, char **argv)
     if (c != 0) exit(EX_USAGE);
   }
 
     if (c != 0) exit(EX_USAGE);
   }
 
-  int fd = open(device, O_RDONLY);
-  if (fd < 0) {
+  int open_fd = open(device, O_RDONLY);
+  if (open_fd < 0) {
     err(EX_NOINPUT, "Could not open keyboard event file");
   }
     err(EX_NOINPUT, "Could not open keyboard event file");
   }
+  int maxfd = open_fd;
   free(device);
   struct input_event i;
   free(device);
   struct input_event i;
-  while (read(fd, &i, sizeof(i)) == sizeof(i)) {
-    if (i.type == 1 && i.value == 1) {
-      if (print_usec) {
-        printf("%ld.%06ld\n", i.time.tv_sec, i.time.tv_usec);
-      } else {
-        printf("%ld\n", i.time.tv_sec);
+  fd_set all_inputs, ready_inputs;
+  FD_ZERO(&all_inputs);
+  FD_SET(open_fd, &all_inputs);
+  while (1) {
+    ready_inputs = all_inputs;
+    if (select(maxfd+1, &ready_inputs, NULL, NULL, NULL) != 1) {
+      err(EX_IOERR, "select");
+    }
+    for (int fd=0; fd <= maxfd; fd++) {
+      if (FD_ISSET(fd, &ready_inputs)) {
+        int read_return = read(fd, &i, sizeof(i));
+        if (read_return == -1) {
+          err(EX_IOERR, "read");
+        }
+        if (read_return != sizeof(i)) {
+          errx(EX_IOERR, "Unexpected EOF");
+        }
+        if (i.type == 1 && i.value == 1) {
+          if (print_usec) {
+            printf("%ld.%06ld\n", i.time.tv_sec, i.time.tv_usec);
+          } else {
+            printf("%ld\n", i.time.tv_sec);
+          }
+          fflush(stdout);
+        }
       }
       }
-      fflush(stdout);
     }
   }
   return 0;
     }
   }
   return 0;