tools: allow numeric axis values in tweak-device
authorPeter Hutterer <peter.hutterer@who-t.net>
Fri, 22 Apr 2016 00:10:39 +0000 (10:10 +1000)
committerPeter Hutterer <peter.hutterer@who-t.net>
Fri, 22 Apr 2016 00:10:39 +0000 (10:10 +1000)
Not all axes a device may have are assigned a semantic name.

https://bugs.freedesktop.org/show_bug.cgi?id=95029

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
tools/libevdev-tweak-device.c

index fc35c1390d10b3b7667e34ff1ed92067a2de973a..a051e0861e65bdab2cbbaca6295eb06513919460 100644 (file)
@@ -24,6 +24,7 @@
 #include <config.h>
 
 #include <getopt.h>
+#include <limits.h>
 #include <stdbool.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -94,6 +95,40 @@ parse_resolution_argument(const char *arg, int *xres, int *yres)
        return true;
 }
 
+static inline bool
+safe_atoi(const char *str, int *val)
+{
+        char *endptr;
+        long v;
+
+        v = strtol(str, &endptr, 10);
+        if (str == endptr)
+                return false;
+        if (*str != '\0' && *endptr != '\0')
+                return false;
+
+        if (v > INT_MAX || v < INT_MIN)
+                return false;
+
+        *val = v;
+        return true;
+}
+
+static int
+parse_event_code(int type, const char *str)
+{
+       int code;
+
+       code = libevdev_event_code_from_name(type, str);
+       if (code != -1)
+               return code;
+
+       if (safe_atoi(str, &code))
+               return code;
+
+       return -1;
+}
+
 static int
 parse_options_abs(int argc, char **argv, unsigned int *changes,
                  int *axis, struct input_absinfo *absinfo)
@@ -122,8 +157,7 @@ parse_options_abs(int argc, char **argv, unsigned int *changes,
 
                switch (c) {
                        case OPT_ABS:
-                               *axis = libevdev_event_code_from_name(EV_ABS,
-                                                                    optarg);
+                               *axis = parse_event_code(EV_ABS, optarg);
                                if (*axis == -1)
                                        goto error;
                                break;
@@ -176,8 +210,7 @@ parse_options_led(int argc, char **argv, int *led, int *led_state)
 
                switch (c) {
                        case OPT_LED:
-                               *led = libevdev_event_code_from_name(EV_LED,
-                                                                    optarg);
+                               *led = parse_event_code(EV_LED, optarg);
                                if (*led == -1)
                                        goto error;
                                break;