summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--audio/main.c18
-rw-r--r--hcid/device.c32
-rw-r--r--hcid/device.h6
-rw-r--r--input/manager.c12
-rw-r--r--network/manager.c18
-rw-r--r--serial/main.c6
6 files changed, 64 insertions, 28 deletions
diff --git a/audio/main.c b/audio/main.c
index 8e4c8055..f0301c12 100644
--- a/audio/main.c
+++ b/audio/main.c
@@ -43,7 +43,8 @@
static DBusConnection *conn;
-static int headset_probe(struct btd_device *device, GSList *records)
+static int headset_probe(struct btd_device_driver *driver,
+ struct btd_device *device, GSList *records)
{
const gchar *path = device_get_path(device);
DBG("path %s", path);
@@ -51,7 +52,8 @@ static int headset_probe(struct btd_device *device, GSList *records)
return 0;
}
-static void headset_remove(struct btd_device *device)
+static void headset_remove(struct btd_device_driver *driver,
+ struct btd_device *device)
{
const gchar *path = device_get_path(device);
DBG("path %s", path);
@@ -64,7 +66,8 @@ static struct btd_device_driver headset_driver = {
.remove = headset_remove,
};
-static int a2dp_probe(struct btd_device *device, GSList *records)
+static int a2dp_probe(struct btd_device_driver *driver,
+ struct btd_device *device, GSList *records)
{
const gchar *path = device_get_path(device);
DBG("path %s", path);
@@ -72,7 +75,8 @@ static int a2dp_probe(struct btd_device *device, GSList *records)
return 0;
}
-static void a2dp_remove(struct btd_device *device)
+static void a2dp_remove(struct btd_device_driver *driver,
+ struct btd_device *device)
{
const gchar *path = device_get_path(device);
DBG("path %s", path);
@@ -85,7 +89,8 @@ static struct btd_device_driver a2dp_driver = {
.remove = a2dp_remove,
};
-static int audio_probe(struct btd_device *device, GSList *records)
+static int audio_probe(struct btd_device_driver *driver,
+ struct btd_device *device, GSList *records)
{
const gchar *path = device_get_path(device);
DBG("path %s", path);
@@ -93,7 +98,8 @@ static int audio_probe(struct btd_device *device, GSList *records)
return 0;
}
-static void audio_remove(struct btd_device *device)
+static void audio_remove(struct btd_device_driver *driver,
+ struct btd_device *device)
{
const gchar *path = device_get_path(device);
DBG("path %s", path);
diff --git a/hcid/device.c b/hcid/device.c
index cfbab920..f83801a4 100644
--- a/hcid/device.c
+++ b/hcid/device.c
@@ -68,12 +68,17 @@
#define DEVICE_INTERFACE "org.bluez.Device"
+static struct btd_driver_data {
+ struct btd_device_driver *driver;
+ void *priv;
+};
+
struct btd_device {
gchar *address;
gchar *path;
struct adapter *adapter;
GSList *uuids;
- GSList *drivers;
+ GSList *drivers; /* List of driver_data */
gboolean temporary;
struct agent *agent;
guint disconn_timer;
@@ -557,9 +562,11 @@ void device_remove(DBusConnection *conn, struct btd_device *device)
debug("Removing device %s", path);
for (list = device->drivers; list; list = list->next) {
- driver = (struct btd_device_driver *) list->data;
+ struct btd_driver_data *driver_data = list->data;
+ driver = driver_data->driver;
- driver->remove(device);
+ driver->remove(driver, device);
+ g_free(driver_data);
}
g_dbus_unregister_interface(conn, path, DEVICE_INTERFACE);
@@ -623,15 +630,20 @@ void device_probe_drivers(struct btd_device *device, GSList *uuids, sdp_list_t *
}
if (records) {
- err = driver->probe(device, records);
+ struct btd_driver_data *driver_data = g_new0(struct btd_driver_data, 1);
+
+ err = driver->probe(driver, device, records);
if (err < 0) {
error("probe failed for driver %s",
driver->name);
+
+ g_free(driver_data);
continue;
}
+ driver_data->driver = driver;
device->drivers = g_slist_append(device->drivers,
- driver);
+ driver_data);
}
}
@@ -650,7 +662,8 @@ void device_remove_drivers(struct btd_device *device, GSList *uuids, sdp_list_t
debug("Remove drivers for %s", device->path);
for (list = device->drivers; list; list = list->next) {
- struct btd_device_driver *driver = list->data;
+ struct btd_driver_data *driver_data = list->data;
+ struct btd_device_driver *driver = driver_data->driver;
const char **uuid;
for (uuid = driver->uuids; *uuid; uuid++) {
@@ -660,9 +673,12 @@ void device_remove_drivers(struct btd_device *device, GSList *uuids, sdp_list_t
if (!match)
continue;
- driver->remove(device);
+ driver->remove(driver, device);
device->drivers = g_slist_remove(device->drivers,
- driver);
+ driver_data);
+
+ g_free(driver_data);
+
sdp_record_t *rec = get_record(recs, *uuid);
delete_record(src, dst, rec->handle);
}
diff --git a/hcid/device.h b/hcid/device.h
index bbb0846f..31480a66 100644
--- a/hcid/device.h
+++ b/hcid/device.h
@@ -48,8 +48,10 @@ uint8_t device_get_auth(struct btd_device *device);
struct btd_device_driver {
const char *name;
const char **uuids;
- int (*probe) (struct btd_device *device, GSList *records);
- void (*remove) (struct btd_device *device);
+ int (*probe) (struct btd_device_driver *driver,
+ struct btd_device *device, GSList *records);
+ void (*remove) (struct btd_device_driver *driver,
+ struct btd_device *device);
};
int btd_register_device_driver(struct btd_device_driver *driver);
diff --git a/input/manager.c b/input/manager.c
index dc7440cd..aaa4a3ba 100644
--- a/input/manager.c
+++ b/input/manager.c
@@ -162,7 +162,8 @@ static int load_stored(const char *source, const char *destination,
return parse_stored_device_info(value, hidp);
}
-int input_probe(struct btd_device *device, GSList *records)
+int input_probe(struct btd_device_driver *driver,
+ struct btd_device *device, GSList *records)
{
struct adapter *adapter = device_get_adapter(device);
const gchar *path = device_get_path(device);
@@ -196,7 +197,8 @@ done:
return input_device_register(connection, &src, &dst, &hidp, path);
}
-void input_remove(struct btd_device *device)
+void input_remove(struct btd_device_driver *driver,
+ struct btd_device *device)
{
const gchar *path = device_get_path(device);
@@ -205,7 +207,8 @@ void input_remove(struct btd_device *device)
input_device_unregister(connection, path);
}
-int headset_input_probe(struct btd_device *device, GSList *records)
+int headset_input_probe(struct btd_device_driver *driver,
+ struct btd_device *device, GSList *records)
{
struct adapter *adapter = device_get_adapter(device);
const gchar *path = device_get_path(device);
@@ -240,7 +243,8 @@ int headset_input_probe(struct btd_device *device, GSList *records)
return fake_input_register(connection, &src, &dst, ch, path);
}
-void headset_input_remove(struct btd_device *device)
+void headset_input_remove(struct btd_device_driver *driver,
+ struct btd_device *device)
{
const gchar *path = device_get_path(device);
diff --git a/network/manager.c b/network/manager.c
index 27573101..616d63c0 100644
--- a/network/manager.c
+++ b/network/manager.c
@@ -98,17 +98,20 @@ static int network_probe(struct btd_device *device, uint16_t id)
return connection_register(path, &src, &dst, id);
}
-static int panu_probe(struct btd_device *device, GSList *records)
+static int panu_probe(struct btd_device_driver *driver,
+ struct btd_device *device, GSList *records)
{
return network_probe(device, BNEP_SVC_PANU);
}
-static int gn_probe(struct btd_device *device, GSList *records)
+static int gn_probe(struct btd_device_driver *driver,
+ struct btd_device *device, GSList *records)
{
return network_probe(device, BNEP_SVC_GN);
}
-static int nap_probe(struct btd_device *device, GSList *records)
+static int nap_probe(struct btd_device_driver *driver,
+ struct btd_device *device, GSList *records)
{
return network_probe(device, BNEP_SVC_NAP);
}
@@ -122,17 +125,20 @@ static void network_remove(struct btd_device *device, uint16_t id)
connection_unregister(path, id);
}
-static void panu_remove(struct btd_device *device)
+static void panu_remove(struct btd_device_driver *driver,
+ struct btd_device *device)
{
network_remove(device, BNEP_SVC_PANU);
}
-static void gn_remove(struct btd_device *device)
+static void gn_remove(struct btd_device_driver *driver,
+ struct btd_device *device)
{
network_remove(device, BNEP_SVC_GN);
}
-static void nap_remove(struct btd_device *device)
+static void nap_remove(struct btd_device_driver *driver,
+ struct btd_device *device)
{
network_remove(device, BNEP_SVC_NAP);
}
diff --git a/serial/main.c b/serial/main.c
index 7a8d01f3..1d7cf228 100644
--- a/serial/main.c
+++ b/serial/main.c
@@ -97,7 +97,8 @@ static GDBusMethodTable serial_methods[] = {
static DBusConnection *conn;
-static int serial_probe(struct btd_device *device, GSList *records)
+static int serial_probe(struct btd_device_driver *driver,
+ struct btd_device *device, GSList *records)
{
const gchar *path = device_get_path(device);
DBG("path %s", path);
@@ -110,7 +111,8 @@ static int serial_probe(struct btd_device *device, GSList *records)
return 0;
}
-static void serial_remove(struct btd_device *device)
+static void serial_remove(struct btd_device_driver *driver,
+ struct btd_device *device)
{
const gchar *path = device_get_path(device);
DBG("path %s", path);