Skip to content

Commit 3a66d4e

Browse files
Klee Dienessignal11
authored andcommitted
linux: Better kernel version detection
Refactor version detection into a function. Handle versions of form X.Y.Z as well as X.Y. Don't do workarounds for old kernels if version cannot be detected.
1 parent 1a42177 commit 3a66d4e

File tree

1 file changed

+24
-15
lines changed

1 file changed

+24
-15
lines changed

linux/hid.c

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,27 @@ struct hid_device_ {
8080

8181
static __u32 kernel_version = 0;
8282

83+
static __u32 detect_kernel_version(void)
84+
{
85+
struct utsname name;
86+
int major, minor, release;
87+
int ret;
88+
89+
uname(&name);
90+
ret = sscanf(name.release, "%d.%d.%d", &major, &minor, &release);
91+
if (ret == 3) {
92+
return KERNEL_VERSION(major, minor, release);
93+
}
94+
95+
ret = sscanf(name.release, "%d.%d", &major, &minor);
96+
if (ret == 2) {
97+
return KERNEL_VERSION(major, minor, 0);
98+
}
99+
100+
printf("Couldn't determine kernel version from version string \"%s\"\n", name.release);
101+
return 0;
102+
}
103+
83104
static hid_device *new_hid_device(void)
84105
{
85106
hid_device *dev = calloc(1, sizeof(hid_device));
@@ -345,6 +366,8 @@ int HID_API_EXPORT hid_init(void)
345366
if (!locale)
346367
setlocale(LC_CTYPE, "");
347368

369+
kernel_version = detect_kernel_version();
370+
348371
return 0;
349372
}
350373

@@ -600,21 +623,6 @@ hid_device * HID_API_EXPORT hid_open_path(const char *path)
600623

601624
dev = new_hid_device();
602625

603-
if (kernel_version == 0) {
604-
struct utsname name;
605-
int major, minor, release;
606-
int ret;
607-
uname(&name);
608-
ret = sscanf(name.release, "%d.%d.%d", &major, &minor, &release);
609-
if (ret == 3) {
610-
kernel_version = major << 16 | minor << 8 | release;
611-
//printf("Kernel Version: %d\n", kernel_version);
612-
}
613-
else {
614-
printf("Couldn't sscanf() version string %s\n", name.release);
615-
}
616-
}
617-
618626
/* OPEN HERE */
619627
dev->device_handle = open(path, O_RDWR);
620628

@@ -700,6 +708,7 @@ int HID_API_EXPORT hid_read_timeout(hid_device *dev, unsigned char *data, size_t
700708
bytes_read = 0;
701709

702710
if (bytes_read >= 0 &&
711+
kernel_version != 0 &&
703712
kernel_version < KERNEL_VERSION(2,6,34) &&
704713
dev->uses_numbered_reports) {
705714
/* Work around a kernel bug. Chop off the first byte. */

0 commit comments

Comments
 (0)