From cc862ef9a703782f7fc8a9a20dbfde882776b9b7 Mon Sep 17 00:00:00 2001 From: Alan Griffiths Date: Wed, 9 Jan 2019 10:35:34 +0100 Subject: [PATCH 3/7] Suppress the compiler diagnostic on Alpine Linux caused by a mismatch between the signed type of the ioctl() request parameter and the unsigned type returned by EVIOCGPROP. (See #692) --- src/platforms/evdev/evdev_device_detection.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/platforms/evdev/evdev_device_detection.cpp b/src/platforms/evdev/evdev_device_detection.cpp index f771f1f234..cf844a7f83 100644 --- a/src/platforms/evdev/evdev_device_detection.cpp +++ b/src/platforms/evdev/evdev_device_detection.cpp @@ -48,6 +48,16 @@ struct DeviceInfo uint8_t property_bit_mask[(INPUT_PROP_MAX+1)/8]; }; +namespace +{ +// On Alpine Linux there's a mismatch between the signed type of the ioctl() request parameter and the +// unsigned type returned by EVIOCGPROP. (See #692) +// We use a bit of magic to suppress the compiler diagnostic. +template +auto request_param_type(int (*ioctl)(int, Param1, ...)) -> Param1; +using ioctl_request_t = decltype(request_param_type(&ioctl)); +} + DeviceInfo::DeviceInfo(mir::Fd const& fd) { auto const get_bitmask = [&](int bit, size_t size, uint8_t* buf) -> void @@ -62,7 +72,7 @@ DeviceInfo::DeviceInfo(mir::Fd const& fd) get_bitmask(EV_ABS, sizeof abs_bit_mask, abs_bit_mask); get_bitmask(EV_SW, sizeof sw_bit_mask, sw_bit_mask); - if (ioctl(fd, EVIOCGPROP(sizeof property_bit_mask), property_bit_mask) < 1) + if (ioctl(fd, static_cast(EVIOCGPROP(sizeof property_bit_mask)), property_bit_mask) < 1) BOOST_THROW_EXCEPTION( std::system_error(std::error_code(errno, std::system_category()), "Failed to query devices properties")); } -- 2.20.1