summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--input/device.c5
-rw-r--r--src/device.c13
-rw-r--r--src/storage.c36
-rw-r--r--src/storage.h10
4 files changed, 41 insertions, 23 deletions
diff --git a/input/device.c b/input/device.c
index 8391326e..388fe9e2 100644
--- a/input/device.c
+++ b/input/device.c
@@ -606,6 +606,7 @@ static int hidp_add_connection(const struct input_device *idev,
struct fake_hid *fake_hid;
struct fake_input *fake;
sdp_record_t *rec;
+ uint16_t source;
char src_addr[18], dst_addr[18];
int err;
@@ -628,8 +629,8 @@ static int hidp_add_connection(const struct input_device *idev,
extract_hid_record(rec, req);
sdp_record_free(rec);
- read_pnp(src_addr, dst_addr, &req->vendor, &req->product,
- &req->version);
+ read_device_id(src_addr, dst_addr, &source,
+ &req->vendor, &req->product, &req->version);
fake_hid = get_fake_hid(req->vendor, req->product);
if (fake_hid) {
diff --git a/src/device.c b/src/device.c
index eadc9d51..c9d1d310 100644
--- a/src/device.c
+++ b/src/device.c
@@ -831,9 +831,12 @@ static void update_services(struct browse_req *req, sdp_list_t *recs)
continue;
if (!strcasecmp(uuid_str, PNP_UUID)) {
- uint16_t vendor, product, version;
+ uint16_t source, vendor, product, version;
sdp_data_t *pdlist;
+ pdlist = sdp_data_get(rec, SDP_ATTR_VENDOR_ID_SOURCE);
+ source = pdlist ? pdlist->val.uint16 : 0x0000;
+
pdlist = sdp_data_get(rec, SDP_ATTR_VENDOR_ID);
vendor = pdlist ? pdlist->val.uint16 : 0x0000;
@@ -843,12 +846,12 @@ static void update_services(struct browse_req *req, sdp_list_t *recs)
pdlist = sdp_data_get(rec, SDP_ATTR_VERSION);
version = pdlist ? pdlist->val.uint16 : 0x0000;
- if (vendor || product || version)
- store_pnp(srcaddr, dstaddr, vendor, product,
- version);
+ if (source || vendor || product || version)
+ store_device_id(srcaddr, dstaddr, source,
+ vendor, product, version);
}
- /* Driver uuid found */
+ /* Driver UUID found */
l = g_slist_find_custom(req->uuids, uuid_str,
(GCompareFunc) strcasecmp);
if (l) {
diff --git a/src/storage.c b/src/storage.c
index 559c3b12..22a2eb78 100644
--- a/src/storage.c
+++ b/src/storage.c
@@ -779,7 +779,6 @@ sdp_record_t *fetch_record(const gchar *src, const gchar *dst, const uint32_t ha
snprintf(key, sizeof(key), "%17s#%08X", dst, handle);
str = textfile_get(filename, key);
-
if (!str)
return NULL;
@@ -811,34 +810,43 @@ int delete_record(const gchar *src, const gchar *dst, const uint32_t handle)
return textfile_del(filename, key);
}
-int store_pnp(const gchar *src, const gchar *dst, const uint16_t vendor,
- const uint16_t product, const uint16_t version)
+int store_device_id(const gchar *src, const gchar *dst,
+ const uint16_t source, const uint16_t vendor,
+ const uint16_t product, const uint16_t version)
{
char filename[PATH_MAX + 1], str[15];
- create_name(filename, PATH_MAX, STORAGEDIR, src, "pnp");
+ create_name(filename, PATH_MAX, STORAGEDIR, src, "did");
create_file(filename, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
- snprintf(str, sizeof(str), "%04X %04X %04X", vendor, product, version);
+ snprintf(str, sizeof(str), "%04X %04X %04X %04X", source,
+ vendor, product, version);
return textfile_put(filename, dst, str);
}
-int read_pnp(const gchar *src, const gchar *dst, uint32_t *vendor,
- uint16_t *product, uint16_t *version)
+int read_device_id(const gchar *src, const gchar *dst,
+ uint16_t *source, uint16_t *vendor,
+ uint16_t *product, uint16_t *version)
{
char filename[PATH_MAX + 1];
- char *str, *product_str, *version_str;
+ char *str, *vendor_str, *product_str, *version_str;
- create_name(filename, PATH_MAX, STORAGEDIR, src, "pnp");
+ create_name(filename, PATH_MAX, STORAGEDIR, src, "did");
str = textfile_get(filename, dst);
-
if (!str)
return -ENOENT;
- product_str = strchr(str, ' ');
+ vendor_str = strchr(str, ' ');
+ if (!vendor_str) {
+ free(str);
+ return -ENOENT;
+ }
+ *(vendor_str++) = 0;
+
+ product_str = strchr(vendor_str, ' ');
if (!product_str) {
free(str);
return -ENOENT;
@@ -852,8 +860,11 @@ int read_pnp(const gchar *src, const gchar *dst, uint32_t *vendor,
}
*(version_str++) = 0;
+ if (source)
+ *source = (uint16_t) strtol(str, NULL, 16);
+
if (vendor)
- *vendor = (uint16_t) strtol(str, NULL, 16);
+ *vendor = (uint16_t) strtol(vendor_str, NULL, 16);
if (product)
*product = (uint16_t) strtol(product_str, NULL, 16);
@@ -862,5 +873,6 @@ int read_pnp(const gchar *src, const gchar *dst, uint32_t *vendor,
*version = (uint16_t) strtol(version_str, NULL, 16);
free(str);
+
return 0;
}
diff --git a/src/storage.h b/src/storage.h
index a4eb82da..85c9398c 100644
--- a/src/storage.h
+++ b/src/storage.h
@@ -60,7 +60,9 @@ int store_record(const gchar *src, const gchar *dst, sdp_record_t *rec);
sdp_record_t *fetch_record(const gchar *src, const gchar *dst, const uint32_t handle);
int delete_record(const gchar *src, const gchar *dst, const uint32_t handle);
-int store_pnp(const gchar *src, const gchar *dst, const uint16_t vendor,
- const uint16_t product, const uint16_t version);
-int read_pnp(const gchar *src, const gchar *dst, uint32_t *vendor,
- uint16_t *product, uint16_t *version);
+int store_device_id(const gchar *src, const gchar *dst,
+ const uint16_t source, const uint16_t vendor,
+ const uint16_t product, const uint16_t version);
+int read_device_id(const gchar *src, const gchar *dst,
+ uint16_t *source, uint16_t *vendor,
+ uint16_t *product, uint16_t *version);