summaryrefslogtreecommitdiff
path: root/libevdev/libevdev.c
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2013-06-03 13:59:06 +1000
committerPeter Hutterer <peter.hutterer@who-t.net>2013-06-03 15:25:13 +1000
commit4318b73549506f88100c4c5a83edd718f0dea6d9 (patch)
treea04bcc376299891684135c1715926c9c442beb3c /libevdev/libevdev.c
parenta98c9b3bee6eabcffb31bc6e0878b0209c436b09 (diff)
downloadlibevdev-4318b73549506f88100c4c5a83edd718f0dea6d9.tar.gz
Expose phys/uniq to the caller
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Diffstat (limited to 'libevdev/libevdev.c')
-rw-r--r--libevdev/libevdev.c44
1 files changed, 44 insertions, 0 deletions
diff --git a/libevdev/libevdev.c b/libevdev/libevdev.c
index 0bac662..0d4600b 100644
--- a/libevdev/libevdev.c
+++ b/libevdev/libevdev.c
@@ -180,6 +180,8 @@ libevdev_new_from_fd(int fd, struct libevdev **dev)
void
libevdev_free(struct libevdev *dev)
{
+ free(dev->phys);
+ free(dev->uniq);
queue_free(dev);
free(dev);
}
@@ -204,6 +206,7 @@ libevdev_set_fd(struct libevdev* dev, int fd)
{
int rc;
int i;
+ char buf[256];
if (dev->fd != -1)
return -EBADF;
@@ -216,6 +219,35 @@ libevdev_set_fd(struct libevdev* dev, int fd)
if (rc < 0)
goto out;
+ memset(buf, 0, sizeof(buf));
+ rc = ioctl(fd, EVIOCGPHYS(sizeof(buf) - 1), buf);
+ if (rc < 0) {
+ /* uinput has no phys */
+ if (errno != ENOENT)
+ goto out;
+ } else {
+ dev->phys = calloc(strlen(buf) + 1, sizeof(char));
+ if (!dev->phys) {
+ errno = ENOSPC;
+ goto out;
+ }
+ strcpy(dev->phys, buf);
+ }
+
+ memset(buf, 0, sizeof(buf));
+ rc = ioctl(fd, EVIOCGUNIQ(sizeof(buf) - 1), buf);
+ if (rc < 0) {
+ if (errno != ENOENT)
+ goto out;
+ } else {
+ dev->uniq = calloc(strlen(buf) + 1, sizeof(char));
+ if (!dev->uniq) {
+ errno = ENOSPC;
+ goto out;
+ }
+ strcpy(dev->uniq, buf);
+ }
+
rc = ioctl(fd, EVIOCGID, &dev->ids);
if (rc < 0)
goto out;
@@ -588,6 +620,18 @@ libevdev_get_name(const struct libevdev *dev)
return dev->name;
}
+const char *
+libevdev_get_phys(const struct libevdev *dev)
+{
+ return dev->phys;
+}
+
+const char *
+libevdev_get_uniq(const struct libevdev *dev)
+{
+ return dev->uniq;
+}
+
int libevdev_get_product_id(const struct libevdev *dev)
{
return dev->ids.product;