diff --git a/src/hcid.h b/src/hcid.h
index df2829a..2c1cbff 100644
--- a/src/hcid.h
+++ b/src/hcid.h
uint8_t mode;
uint8_t discov_interval;
- char deviceid[15]; /* FIXME: */
+
+ uint16_t did_source;
+ uint16_t did_vendor;
+ uint16_t did_product;
+ uint16_t did_version;
};
enum {
diff --git a/src/main.c b/src/main.c
index f01e070..4e0cb5a 100644
--- a/src/main.c
+++ b/src/main.c
return keyfile;
}
+static void parse_did(const char *did)
+{
+ int result;
+ uint16_t vendor, product, version = 0x0000; /* version is optional */
+
+ result = sscanf(did, "%4hx:%4hx:%4hx", &vendor, &product, &version);
+ if (result == EOF || result < 2)
+ return;
+
+ main_opts.did_source = 0x0002;
+ main_opts.did_vendor = vendor;
+ main_opts.did_product = product;
+ main_opts.did_version = version;
+}
+
static void parse_config(GKeyFile *config)
{
GError *err = NULL;
g_clear_error(&err);
} else {
DBG("deviceid=%s", str);
- strncpy(main_opts.deviceid, str,
- sizeof(main_opts.deviceid) - 1);
+ parse_did(str);
g_free(str);
}
}
}
- start_sdp_server(mtu, main_opts.deviceid, SDP_SERVER_COMPAT);
+ start_sdp_server(mtu, SDP_SERVER_COMPAT);
/* Loading plugins has to be done after D-Bus has been setup since
* the plugins might wanna expose some paths on the bus. However the
diff --git a/src/sdpd-server.c b/src/sdpd-server.c
index a92ae2c..1d9509e 100644
--- a/src/sdpd-server.c
+++ b/src/sdpd-server.c
#include <glib.h>
+#include "hcid.h"
#include "log.h"
#include "sdpd.h"
return TRUE;
}
-int start_sdp_server(uint16_t mtu, const char *did, uint32_t flags)
+int start_sdp_server(uint16_t mtu, uint32_t flags)
{
int compat = flags & SDP_SERVER_COMPAT;
int master = flags & SDP_SERVER_MASTER;
return -1;
}
- if (did && strlen(did) > 0) {
- const char *ptr = did;
- uint16_t vid = 0x0000, pid = 0x0000, ver = 0x0000;
-
- vid = (uint16_t) strtol(ptr, NULL, 16);
- ptr = strchr(ptr, ':');
- if (ptr) {
- pid = (uint16_t) strtol(ptr + 1, NULL, 16);
- ptr = strchr(ptr + 1, ':');
- if (ptr)
- ver = (uint16_t) strtol(ptr + 1, NULL, 16);
- register_device_id(vid, pid, ver);
- }
- }
+ if (main_opts.did_source > 0)
+ register_device_id();
io = g_io_channel_unix_new(l2cap_sock);
g_io_channel_set_close_on_unref(io, TRUE);
diff --git a/src/sdpd-service.c b/src/sdpd-service.c
index de11562..eb4b74c 100644
--- a/src/sdpd-service.c
+++ b/src/sdpd-service.c
#include <glib.h>
#include <dbus/dbus.h>
+#include "hcid.h"
#include "sdpd.h"
#include "log.h"
#include "adapter.h"
update_db_timestamp();
}
-void register_device_id(const uint16_t vendor, const uint16_t product,
- const uint16_t version)
+void register_device_id(void)
{
- const uint16_t spec = 0x0102, source = 0x0002;
+ const uint16_t spec = 0x0102;
const uint8_t primary = 1;
sdp_list_t *class_list, *group_list, *profile_list;
uuid_t class_uuid, group_uuid;
sdp_profile_desc_t profile;
sdp_record_t *record = sdp_record_alloc();
- info("Adding device id record for %04x:%04x", vendor, product);
+ info("Adding device id record for %04x:%04x:%04x", main_opts.did_vendor,
+ main_opts.did_product, main_opts.did_version);
- btd_manager_set_did(vendor, product, version);
+ btd_manager_set_did(main_opts.did_vendor, main_opts.did_product,
+ main_opts.did_version);
record->handle = sdp_next_handle();
spec_data = sdp_data_alloc(SDP_UINT16, &spec);
sdp_attr_add(record, 0x0200, spec_data);
- vendor_data = sdp_data_alloc(SDP_UINT16, &vendor);
+ vendor_data = sdp_data_alloc(SDP_UINT16, &main_opts.did_vendor);
sdp_attr_add(record, 0x0201, vendor_data);
- product_data = sdp_data_alloc(SDP_UINT16, &product);
+ product_data = sdp_data_alloc(SDP_UINT16, &main_opts.did_product);
sdp_attr_add(record, 0x0202, product_data);
- version_data = sdp_data_alloc(SDP_UINT16, &version);
+ version_data = sdp_data_alloc(SDP_UINT16, &main_opts.did_version);
sdp_attr_add(record, 0x0203, version_data);
primary_data = sdp_data_alloc(SDP_BOOL, &primary);
sdp_attr_add(record, 0x0204, primary_data);
- source_data = sdp_data_alloc(SDP_UINT16, &source);
+ source_data = sdp_data_alloc(SDP_UINT16, &main_opts.did_source);
sdp_attr_add(record, 0x0205, source_data);
update_db_timestamp();
diff --git a/src/sdpd.h b/src/sdpd.h
index 9f5415f..83d2b03 100644
--- a/src/sdpd.h
+++ b/src/sdpd.h
void register_public_browse_group(void);
void register_server_service(void);
-void register_device_id(const uint16_t vendor, const uint16_t product,
- const uint16_t version);
+void register_device_id(void);
int record_sort(const void *r1, const void *r2);
void sdp_svcdb_reset(void);
#define SDP_SERVER_COMPAT (1 << 0)
#define SDP_SERVER_MASTER (1 << 1)
-int start_sdp_server(uint16_t mtu, const char *did, uint32_t flags);
+int start_sdp_server(uint16_t mtu, uint32_t flags);
void stop_sdp_server(void);
int add_record_to_server(const bdaddr_t *src, sdp_record_t *rec);