[PATCH libevdev] tools: allow numeric axis values in tweak-device

Peter Hutterer peter.hutterer at who-t.net
Fri Apr 22 00:13:10 UTC 2016


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 at who-t.net>
---
 tools/libevdev-tweak-device.c | 41 +++++++++++++++++++++++++++++++++++++----
 1 file changed, 37 insertions(+), 4 deletions(-)

diff --git a/tools/libevdev-tweak-device.c b/tools/libevdev-tweak-device.c
index fc35c13..a051e08 100644
--- a/tools/libevdev-tweak-device.c
+++ b/tools/libevdev-tweak-device.c
@@ -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;
-- 
2.7.3



More information about the Input-tools mailing list