diff options
author | Peter Wu <lekensteyn@gmail.com> | 2013-05-22 11:47:51 +0200 |
---|---|---|
committer | Peter Wu <lekensteyn@gmail.com> | 2013-05-22 11:47:51 +0200 |
commit | 446ac251397defb8d331c0cb82bb8484226155a9 (patch) | |
tree | fd1a44088eb5b5d9c2e4d66da15a9030180d8d65 /ltunify.c | |
parent | 878ed69e40ccab87a110b3fd7c28d4a15c812422 (diff) | |
download | ltunify-446ac251397defb8d331c0cb82bb8484226155a9.tar.gz |
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.
Diffstat (limited to 'ltunify.c')
-rw-r--r-- | ltunify.c | 34 |
1 files changed, 22 insertions, 12 deletions
@@ -30,6 +30,7 @@ #include <glob.h> /* for /dev/hidrawX discovery */ #include <getopt.h> /* for getopt_long */ #include <poll.h> +#include <libgen.h> /* 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; } } } |