From 3dc9968f3ddceb7e255a359a031d8c22892f875a Mon Sep 17 00:00:00 2001 From: Johan Hedberg Date: Fri, 24 Mar 2006 15:58:42 +0000 Subject: Listen for D-Bus client exists with normal passkey agents --- hcid/dbus-security.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/hcid/dbus-security.c b/hcid/dbus-security.c index 6b1446cd..dd238117 100644 --- a/hcid/dbus-security.c +++ b/hcid/dbus-security.c @@ -141,6 +141,25 @@ static int agent_cmp(const struct passkey_agent *a, const struct passkey_agent * return 0; } +static void agent_exited(const char *name, struct hci_dbus_data *adapter) +{ + struct slist *cur, *next; + + debug("Passkey agent %s exited without calling Unregister", name); + + for (cur = adapter->passkey_agents; cur != NULL; cur = next) { + struct passkey_agent *agent = cur->data; + + next = cur->next; + + if (strcmp(agent->name, name)) + continue; + + adapter->passkey_agents = slist_remove(adapter->passkey_agents, agent); + passkey_agent_free(agent); + } +} + static DBusHandlerResult register_agent(DBusConnection *conn, DBusMessage *msg, void *data) { @@ -179,6 +198,12 @@ static DBusHandlerResult register_agent(DBusConnection *conn, return DBUS_HANDLER_RESULT_NEED_MEMORY; } + /* Only add a name listener if there isn't one already for this name */ + ref.addr = NULL; + ref.path = NULL; + if (!slist_find(adapter->passkey_agents, &ref, (cmp_func_t)agent_cmp)) + name_listener_add(conn, ref.name, (name_cb_t)agent_exited, adapter); + adapter->passkey_agents = slist_append(adapter->passkey_agents, agent); return send_reply_and_unref(conn, reply); @@ -219,6 +244,12 @@ static DBusHandlerResult unregister_agent(DBusConnection *conn, adapter->passkey_agents = slist_remove(adapter->passkey_agents, agent); passkey_agent_free(agent); + /* Only remove the name listener if there are no more agents for this name */ + ref.addr = NULL; + ref.path = NULL; + if (!slist_find(adapter->passkey_agents, &ref, (cmp_func_t)agent_cmp)) + name_listener_remove(conn, ref.name, (name_cb_t)agent_exited, adapter); + reply = dbus_message_new_method_return(msg); if (!reply) return DBUS_HANDLER_RESULT_NEED_MEMORY; -- cgit