From df2a06690dc7283a308e521e6ec41155f74a4dad Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Mon, 10 Jul 2017 15:39:34 +1000 Subject: [PATCH] Fix device capability check We now have a lot more bits to cater for, so let's use an array. Broken with 487e66e64d231c13f5afe9551f11907771d4d412 Signed-off-by: Peter Hutterer --- src/libratbag-private.h | 4 +++- src/libratbag.c | 9 ++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/libratbag-private.h b/src/libratbag-private.h index 976744cd..a8625d8f 100644 --- a/src/libratbag-private.h +++ b/src/libratbag-private.h @@ -78,6 +78,8 @@ struct ratbag { enum ratbag_log_priority log_priority; }; +#define MAX_CAP 1000 + struct ratbag_device { char *name; void *userdata; @@ -88,7 +90,7 @@ struct ratbag_device { struct input_id ids; struct ratbag_driver *driver; struct ratbag *ratbag; - unsigned long capabilities; + unsigned long capabilities[NLONGS(MAX_CAP)]; unsigned num_profiles; struct list profiles; diff --git a/src/libratbag.c b/src/libratbag.c index 43a64810..6f52adcf 100644 --- a/src/libratbag.c +++ b/src/libratbag.c @@ -808,17 +808,20 @@ void ratbag_device_set_capability(struct ratbag_device *device, enum ratbag_device_capability cap) { - device->capabilities |= (1UL << cap); + if (cap == RATBAG_DEVICE_CAP_NONE || cap >= MAX_CAP) + abort(); + + long_set_bit(device->capabilities, cap); } LIBRATBAG_EXPORT int ratbag_device_has_capability(const struct ratbag_device *device, enum ratbag_device_capability cap) { - if (cap == RATBAG_DEVICE_CAP_NONE) + if (cap == RATBAG_DEVICE_CAP_NONE || cap >= MAX_CAP) abort(); - return !!(device->capabilities & (1UL << cap)); + return long_bit_is_set(device->capabilities, cap); } static inline enum ratbag_error_code