[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