From 2f9fbeeb5931cda983aa72ed9a53b1f22d0aa85d Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Thu, 11 Sep 2008 14:21:09 -0300 Subject: Fix problem that occurs when a device is removed but agent requests are not cancelled. --- src/agent.c | 11 +++++++++++ src/agent.h | 2 ++ src/device.c | 5 +++++ 3 files changed, 18 insertions(+) diff --git a/src/agent.c b/src/agent.c index 6b7c8d03..d514d191 100644 --- a/src/agent.c +++ b/src/agent.c @@ -780,6 +780,17 @@ gboolean agent_matches(struct agent *agent, const char *name, const char *path) return FALSE; } +gboolean agent_is_busy(struct agent *agent, void *user_data) +{ + if (agent->request) + return FALSE; + + if (user_data && user_data != agent->request->user_data) + return FALSE; + + return TRUE; +} + void agent_exit(void) { dbus_connection_unref(connection); diff --git a/src/agent.h b/src/agent.h index 3846d14e..b94c1ed1 100644 --- a/src/agent.h +++ b/src/agent.h @@ -62,6 +62,8 @@ int agent_display_passkey(struct agent *agent, struct btd_device *device, int agent_cancel(struct agent *agent); +gboolean agent_is_busy(struct agent *agent, void *user_data); + uint8_t agent_get_io_capability(struct agent *agent); gboolean agent_matches(struct agent *agent, const char *name, const char *path); diff --git a/src/device.c b/src/device.c index 52fae4ed..5c8208de 100644 --- a/src/device.c +++ b/src/device.c @@ -111,10 +111,15 @@ static GSList *device_drivers = NULL; static void device_free(gpointer user_data) { struct btd_device *device = user_data; + struct btd_adapter *adapter = device->adapter; + struct agent *agent = adapter_get_agent(adapter); if (device->agent) agent_destroy(device->agent, FALSE); + if (agent && agent_is_busy(agent, device)) + agent_cancel(agent); + g_slist_foreach(device->uuids, (GFunc) g_free, NULL); g_slist_free(device->uuids); -- cgit