Re: [PATCH] Populate adapter services list

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

 



Updated patch after offline feedback from Johan.

/Daniel
From 42edf146231aa053bbcc97d80fd9dd3aa3f247ec Mon Sep 17 00:00:00 2001
From: Daniel Orstadius <daniel.orstadius@xxxxxxxxx>
Date: Tue, 30 Nov 2010 13:27:57 +0200
Subject: [PATCH] Initialize adapter services list

In case service records have been added to bluetoothd before a new
adapter is registered, the records which are shared by all adapters
(indicated by having the 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 |   24 ++++++++++++++++++++++++
 src/sdpd.h          |    2 ++
 3 files changed, 27 insertions(+), 0 deletions(-)

diff --git a/src/adapter.c b/src/adapter.c
index 999f369..62afc0c 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -2319,6 +2319,7 @@ proceed:
 		return err;
 
 	if (adapter->initialized == FALSE) {
+		sdp_init_services_list(&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..f3538ae 100644
--- a/src/sdpd-database.c
+++ b/src/sdpd-database.c
@@ -306,3 +306,27 @@ uint32_t sdp_next_handle(void)
 
 	return handle;
 }
+
+void sdp_init_services_list(bdaddr_t *device)
+{
+	sdp_list_t *p;
+
+	SDPDBG("");
+
+	for (p = access_db; p != NULL; p = p->next) {
+		sdp_record_t *rec;
+		sdp_access_t *access = p->data;
+
+		if (bacmp(BDADDR_ANY, &access->device))
+			continue;
+
+		rec = sdp_record_find(access->handle);
+
+		if (rec == NULL)
+			continue;
+
+		SDPDBG("adding record with handle %x", access->handle);
+
+		adapter_service_insert(device, rec);
+	}
+}
diff --git a/src/sdpd.h b/src/sdpd.h
index f8e6ee7..0e3dddf 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_init_services_list(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