diff options
Diffstat (limited to 'input')
-rw-r--r-- | input/device.c | 14 | ||||
-rw-r--r-- | input/storage.c | 34 | ||||
-rw-r--r-- | input/storage.h | 2 |
3 files changed, 44 insertions, 6 deletions
diff --git a/input/device.c b/input/device.c index 6e701862..2d05d264 100644 --- a/input/device.c +++ b/input/device.c @@ -85,8 +85,9 @@ struct pending_connect { }; struct input_device { - bdaddr_t src; - bdaddr_t dst; + bdaddr_t src; + bdaddr_t dst; + char *name; uint8_t major; uint8_t minor; struct hidp_connadd_req hidp; /* FIXME: Use dynamic alloc? */ @@ -121,6 +122,11 @@ static struct input_device *input_device_new(bdaddr_t *src, bdaddr_t *dst, uint3 idev->major = (cls >> 8) & 0x1f; idev->minor = (cls >> 2) & 0x3f; + read_device_name(src, dst, &idev->name); + + /* FIXME: hidp could be alloc dynamically */ + snprintf(idev->hidp.name, 128, "%s", idev->name); + return idev; } @@ -139,6 +145,8 @@ static void input_device_free(struct input_device *idev) { if (!idev) return; + if (idev->name) + g_free(idev->name); if (idev->hidp.rd_data) g_free(idev->hidp.rd_data); if (idev->fake) @@ -594,7 +602,7 @@ static gboolean rfcomm_connect_cb(GIOChannel *chan, GIOCondition cond, * first to report volume gain key events */ - fake->uinput = uinput_create("Fake input"); + fake->uinput = uinput_create(idev->name); if (fake->uinput < 0) { err = errno; goto failed; diff --git a/input/storage.c b/input/storage.c index be5ab3e3..fd8d4bcb 100644 --- a/input/storage.c +++ b/input/storage.c @@ -71,7 +71,6 @@ int parse_stored_device_info(const char *str, struct hidp_connadd_req *req) &vendor, &product, &version, &subclass, &country, &parser, &req->flags, &pos); - desc = &str[pos]; len = strlen(desc); if (len <= 0) @@ -84,8 +83,6 @@ int parse_stored_device_info(const char *str, struct hidp_connadd_req *req) req->country = country; req->parser = parser; - /* FIXME: Retrieve the name from the filesystem file "names" */ - req->rd_size = len / 2; req->rd_data = g_try_malloc0(req->rd_size); if (!req->rd_data) { @@ -174,6 +171,37 @@ int store_device_info(bdaddr_t *src, bdaddr_t *dst, struct hidp_connadd_req *req return err; } +int read_device_name(bdaddr_t *local, bdaddr_t *peer, char **name) +{ + char filename[PATH_MAX + 1], addr[18], *str; + int len; + + create_filename(filename, PATH_MAX, local, "names"); + + ba2str(peer, addr); + str = textfile_get(filename, addr); + if (!str) + return -ENOENT; + + len = strlen(str); + + /* HID max name size is 128 chars */ + if (len < 128) { + *name = str; + return 0; + } + + *name = g_try_malloc0(128); + if (!*name) + return -ENOMEM; + + snprintf(*name, 128, "%s", str); + + free(str); + + return 0; +} + int encrypt_link(bdaddr_t *src, bdaddr_t *dst) { char filename[PATH_MAX + 1]; diff --git a/input/storage.h b/input/storage.h index 09a696cf..60df915d 100644 --- a/input/storage.h +++ b/input/storage.h @@ -32,4 +32,6 @@ int store_device_info(bdaddr_t *src, bdaddr_t *dst, int parse_stored_device_info(const char *str, struct hidp_connadd_req *req); +int read_device_name(bdaddr_t *local, bdaddr_t *peer, char **name); + int encrypt_link(bdaddr_t *src, bdaddr_t *dst); |