diff options
author | Peter Hutterer <peter.hutterer@who-t.net> | 2017-09-26 15:21:59 +1000 |
---|---|---|
committer | Adam Jackson <ajax@redhat.com> | 2017-12-13 10:06:02 -0500 |
commit | 5a5b6d6cca469521daa6ac9087f3589b7489ab55 (patch) | |
tree | c092f69aed5ebbbb50d4a2874b116a2bab54c9b5 /config | |
parent | 8817747c8587d75c14e00069e8f26e3edb671013 (diff) |
config/udev: consider ID_INPUT_FOO=0 as 'unset'
Historically we didn't need to care about this case but more devices are
having invalid types set and they cannot be unset with a hwdb entry (which
doesn't handle the empty string). Allow for "0" to mean "unset" because
anything else would be crazy anyway.
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
(cherry picked from commit 5aad81445c8c3d6b7b30d503cfe26027fa482870)
Diffstat (limited to 'config')
-rw-r--r-- | config/udev.c | 65 |
1 files changed, 32 insertions, 33 deletions
diff --git a/config/udev.c b/config/udev.c index 932f230c7..e198e8609 100644 --- a/config/udev.c +++ b/config/udev.c @@ -134,7 +134,8 @@ device_added(struct udev_device *udev_device) } #endif - if (!udev_device_get_property_value(udev_device, "ID_INPUT")) { + value = udev_device_get_property_value(udev_device, "ID_INPUT"); + if (value && !strcmp(value, "0")) { LogMessageVerb(X_INFO, 10, "config/udev: ignoring device %s without " "property ID_INPUT set\n", path); @@ -237,38 +238,36 @@ device_added(struct udev_device *udev_device) else if (!strcmp(key, "ID_VENDOR")) { LOG_PROPERTY(path, key, value); attrs.vendor = strdup(value); - } - else if (!strcmp(key, "ID_INPUT_KEY")) { - LOG_PROPERTY(path, key, value); - attrs.flags |= ATTR_KEY; - } - else if (!strcmp(key, "ID_INPUT_KEYBOARD")) { - LOG_PROPERTY(path, key, value); - attrs.flags |= ATTR_KEYBOARD; - } - else if (!strcmp(key, "ID_INPUT_MOUSE")) { - LOG_PROPERTY(path, key, value); - attrs.flags |= ATTR_POINTER; - } - else if (!strcmp(key, "ID_INPUT_JOYSTICK")) { - LOG_PROPERTY(path, key, value); - attrs.flags |= ATTR_JOYSTICK; - } - else if (!strcmp(key, "ID_INPUT_TABLET")) { - LOG_PROPERTY(path, key, value); - attrs.flags |= ATTR_TABLET; - } - else if (!strcmp(key, "ID_INPUT_TABLET_PAD")) { - LOG_PROPERTY(path, key, value); - attrs.flags |= ATTR_TABLET_PAD; - } - else if (!strcmp(key, "ID_INPUT_TOUCHPAD")) { - LOG_PROPERTY(path, key, value); - attrs.flags |= ATTR_TOUCHPAD; - } - else if (!strcmp(key, "ID_INPUT_TOUCHSCREEN")) { - LOG_PROPERTY(path, key, value); - attrs.flags |= ATTR_TOUCHSCREEN; + } else if (!strncmp(key, "ID_INPUT_", 9)) { + const struct pfmap { + const char *property; + unsigned int flag; + } map[] = { + { "ID_INPUT_KEY", ATTR_KEY }, + { "ID_INPUT_KEYBOARD", ATTR_KEYBOARD }, + { "ID_INPUT_MOUSE", ATTR_POINTER }, + { "ID_INPUT_JOYSTICK", ATTR_JOYSTICK }, + { "ID_INPUT_TABLET", ATTR_TABLET }, + { "ID_INPUT_TABLET_PAD", ATTR_TABLET_PAD }, + { "ID_INPUT_TOUCHPAD", ATTR_TOUCHPAD }, + { "ID_INPUT_TOUCHSCREEN", ATTR_TOUCHSCREEN }, + { NULL, 0 }, + }; + + /* Anything but the literal string "0" is considered a + * boolean true. The empty string isn't a thing with udev + * properties anyway */ + if (value && strcmp(value, "0")) { + const struct pfmap *m = map; + + while (m->property != NULL) { + if (!strcmp(m->property, key)) { + LOG_PROPERTY(path, key, value); + attrs.flags |= m->flag; + } + m++; + } + } } } |