summaryrefslogtreecommitdiffstats
path: root/hcid/dbus-security.c
diff options
context:
space:
mode:
authorJohan Hedberg <johan.hedberg@nokia.com>2006-03-24 15:58:42 +0000
committerJohan Hedberg <johan.hedberg@nokia.com>2006-03-24 15:58:42 +0000
commit3dc9968f3ddceb7e255a359a031d8c22892f875a (patch)
tree484b66acf8f9204f6dceee13749fb1cd78f32637 /hcid/dbus-security.c
parent8bc26371882b7ebaaa25ca0c2ce81b1f719daeea (diff)
Listen for D-Bus client exists with normal passkey agents
Diffstat (limited to 'hcid/dbus-security.c')
-rw-r--r--hcid/dbus-security.c31
1 files changed, 31 insertions, 0 deletions
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;