From 446ac251397defb8d331c0cb82bb8484226155a9 Mon Sep 17 00:00:00 2001 From: Peter Wu Date: Wed, 22 May 2013 11:47:51 +0200 Subject: ltunify: make driver name matching more obvious Use basename instead of memcmp with some calculations. Move the hiddraw device matching outside a block in preparation for adding multiple match conditions. --- ltunify.c | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) (limited to 'ltunify.c') diff --git a/ltunify.c b/ltunify.c index d39d795..db0d6a4 100644 --- a/ltunify.c +++ b/ltunify.c @@ -30,6 +30,7 @@ #include /* for /dev/hidrawX discovery */ #include /* for getopt_long */ #include +#include /* for basename, used during discovery */ #ifndef PACKAGE_VERSION # define PACKAGE_VERSION "0.1" @@ -1098,23 +1099,32 @@ int open_hidraw(void) { for (i = 0; i < matches.gl_pathc; i++) { ssize_t r; char *name = matches.gl_pathv[i]; + const char *last_comp; - r = readlink(name, buf, sizeof buf); + r = readlink(name, buf, (sizeof buf) - 1); if (r < 0) { perror(name); - } else if ((size_t) r >= sizeof RECEIVER_NAME && - !memcmp(buf + r - sizeof RECEIVER_NAME + 1, RECEIVER_NAME, sizeof RECEIVER_NAME - 1)) { + continue; + } - hiddev_name = name + sizeof "/sys/class/hidraw" - sizeof "/dev"; - memcpy(hiddev_name, "/dev", sizeof "/dev" - 1); - name[strlen(name) - sizeof "/device/driver" + 1] = '\0'; + buf[r] = 0; /* readlink does not NUL-terminate */ + last_comp = basename(buf); - fd = open(hiddev_name, O_RDWR); - if (fd < 0) { - perror(hiddev_name); - } else { - break; - } + if (!strcmp(last_comp, RECEIVER_NAME)) { + /* Logitech receiver c52b and c532 - pass */ + } else { /* unknown driver */ + continue; + } + + hiddev_name = name + sizeof "/sys/class/hidraw" - sizeof "/dev"; + memcpy(hiddev_name, "/dev", sizeof "/dev" - 1); + name[strlen(name) - sizeof "/device/driver" + 1] = '\0'; + + fd = open(hiddev_name, O_RDWR); + if (fd < 0) { + perror(hiddev_name); + } else { + break; } } } -- cgit v1.2.1