[PATCH] Populate adapter services list

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Attaching patch proposal for review.

/Daniel
From aa9b2a347d19f50575e6b2864f503e9d4540369c Mon Sep 17 00:00:00 2001
From: Daniel Orstadius <daniel.orstadius@xxxxxxxxx>
Date: Tue, 30 Nov 2010 11:42:08 +0200
Subject: [PATCH] Populate adapter services list

In case that service records have been added to bluetoothd before
a new adapter is registered, the added records which are shared by
all adapters (indicated by having an address set to BDADDR_ANY)
need to be added to the services list of the new adapter. This
patch adds a function for this on adapter initialization.

The issue could be reproduced by running bluetoothd and obexd on a
PC and briefly removing the BT dongle. The service records from
obexd would not be present in the adapter's local list (which is
used to set the class of device).
---
 src/adapter.c       |    1 +
 src/sdpd-database.c |   43 +++++++++++++++++++++++++++++++++++++++++++
 src/sdpd.h          |    2 ++
 3 files changed, 46 insertions(+), 0 deletions(-)

diff --git a/src/adapter.c b/src/adapter.c
index 999f369..7d05098 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -2319,6 +2319,7 @@ proceed:
 		return err;
 
 	if (adapter->initialized == FALSE) {
+		sdp_populate_services(&adapter->bdaddr);
 		load_drivers(adapter);
 		clear_blocked(adapter);
 		load_devices(adapter);
diff --git a/src/sdpd-database.c b/src/sdpd-database.c
index da3bc7d..111371d 100644
--- a/src/sdpd-database.c
+++ b/src/sdpd-database.c
@@ -81,6 +81,19 @@ static int access_sort(const void *r1, const void *r2)
 	return rec1->handle - rec2->handle;
 }
 
+static int find_device(const void *r1, const void *r2)
+{
+	const sdp_access_t *rec1 = r1;
+	const sdp_access_t *rec2 = r2;
+
+	if (!rec1 || !rec2) {
+		error("NULL RECORD LIST FATAL");
+		return -1;
+	}
+
+	return bacmp(&rec1->device, &rec2->device);
+}
+
 static void access_free(void *p)
 {
 	free(p);
@@ -306,3 +319,33 @@ uint32_t sdp_next_handle(void)
 
 	return handle;
 }
+
+void sdp_populate_services(bdaddr_t *device)
+{
+	sdp_record_t *rec;
+	sdp_list_t *p;
+	sdp_access_t ref_adr;
+	sdp_access_t *access;
+
+	SDPDBG("");
+
+	if (!access_db)
+		return;
+
+	bacpy(&ref_adr.device, BDADDR_ANY);
+	p = sdp_list_find(access_db, &ref_adr, find_device);
+
+	while (p) {
+		access = (sdp_access_t*) (p->data);
+
+		rec = sdp_record_find(access->handle);
+
+		if (rec) {
+			SDPDBG("adding record with handle %d", access->handle);
+			adapter_service_insert(device, rec);
+		}
+
+		p = p->next ?
+			(sdp_list_find(p->next, &ref_adr, find_device)) : NULL;
+	}
+}
diff --git a/src/sdpd.h b/src/sdpd.h
index f8e6ee7..b69034a 100644
--- a/src/sdpd.h
+++ b/src/sdpd.h
@@ -106,3 +106,5 @@ int remove_record_from_server(uint32_t handle);
 void create_ext_inquiry_response(const char *name,
 					int8_t tx_power, sdp_list_t *services,
 					uint8_t *data);
+
+void sdp_populate_services(bdaddr_t *device);
-- 
1.6.0.4


[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux