]> git.scottworley.com Git - keystroke-timestamps/blobdiff - keystroke-timestamps.c
Section header comments
[keystroke-timestamps] / keystroke-timestamps.c
index 36d1cfcd1a24390e128c4627ffabf5c0f95d18ba..73ce86ebecd3b393beac5a323d608f46b33294be 100644 (file)
@@ -5,7 +5,6 @@
 #include <linux/input.h>
 #include <stdio.h>
 #include <stdlib.h>
-#include <string.h>
 #include <sysexits.h>
 #include <sys/select.h>
 #include <unistd.h>
 int main (int argc, char **argv)
 {
   int print_usec = 0;
-  char* device = strdup("/dev/input/by-path/*kbd*");
+  char* device = "/dev/input/by-path/*kbd*";
+  char* output = NULL;
   struct option long_options[] = {
     {"device", required_argument, 0,            'd' },
+    {"output", required_argument, 0,            'o' },
     {"usec",   no_argument,       &print_usec,  1   },
     {0,        0,                 0,            0   },
   };
@@ -23,13 +24,28 @@ int main (int argc, char **argv)
     int c = getopt_long(argc, argv, "", long_options, NULL);
     if (c == -1) break;
     if (c == 'd') {
-      free(device);
-      device = strdup(optarg);
+      device = optarg;
+      continue;
+    }
+    if (c == 'o') {
+      output = optarg;
       continue;
     }
     if (c != 0) exit(EX_USAGE);
   }
 
+  /* Open output file */
+  FILE *output_file;
+  if (output == NULL) {
+    output_file = stdout;
+  } else {
+    output_file = fopen(output, "a");
+    if (output_file == NULL) {
+      err(EX_CANTCREAT, "Could not open output file: %s", output);
+    }
+  }
+
+  /* Open device inputs */
   fd_set all_inputs;
   FD_ZERO(&all_inputs);
   int maxfd = 0;
@@ -41,19 +57,19 @@ int main (int argc, char **argv)
   if (glob_return != 0) {
     err(EX_NOINPUT, "Could not glob keyboard event file(s): %s", device);
   }
-  free(device);
   for (unsigned i = 0; i < glob_result.gl_pathc; i++) {
-    int open_fd = open(glob_result.gl_pathv[i], O_RDONLY);
-    if (open_fd < 0) {
+    int device_fd = open(glob_result.gl_pathv[i], O_RDONLY);
+    if (device_fd < 0) {
       err(EX_NOINPUT, "Could not open keyboard event file: %s", glob_result.gl_pathv[i]);
     }
-    if (open_fd > maxfd) {
-      maxfd = open_fd;
+    if (device_fd > maxfd) {
+      maxfd = device_fd;
     }
-    FD_SET(open_fd, &all_inputs);
+    FD_SET(device_fd, &all_inputs);
   }
   globfree(&glob_result);
 
+  /* Report keystroke timestamps */
   struct input_event i;
   while (1) {
     fd_set ready_inputs = all_inputs;
@@ -71,11 +87,11 @@ int main (int argc, char **argv)
         }
         if (i.type == 1 && i.value == 1) {
           if (print_usec) {
-            printf("%ld.%06ld\n", i.time.tv_sec, i.time.tv_usec);
+            fprintf(output_file, "%ld.%06ld\n", i.time.tv_sec, i.time.tv_usec);
           } else {
-            printf("%ld\n", i.time.tv_sec);
+            fprintf(output_file, "%ld\n", i.time.tv_sec);
           }
-          fflush(stdout);
+          fflush(output_file);
         }
       }
     }