diff options
author | Johan Hedberg <johan.hedberg@nokia.com> | 2006-08-20 21:41:59 +0000 |
---|---|---|
committer | Johan Hedberg <johan.hedberg@nokia.com> | 2006-08-20 21:41:59 +0000 |
commit | ec3ac41ca8876f36cc8869ab1c384980f793c40f (patch) | |
tree | 54cfad49658e334487dd602dd9cd5219e23454f8 /hcid/dbus-security.c | |
parent | be52c05a25c0cbadcd605b24d66d0c0b682aee18 (diff) |
Preliminary support for passkey agent timeouts
Diffstat (limited to 'hcid/dbus-security.c')
-rw-r--r-- | hcid/dbus-security.c | 73 |
1 files changed, 50 insertions, 23 deletions
diff --git a/hcid/dbus-security.c b/hcid/dbus-security.c index 91a03e5d..c9c6763f 100644 --- a/hcid/dbus-security.c +++ b/hcid/dbus-security.c @@ -39,7 +39,8 @@ #include "dbus.h" #include "hcid.h" -#define TIMEOUT (30 * 1000) /* 30 seconds */ +#define REQUEST_TIMEOUT (30 * 1000) /* 30 seconds */ +#define AGENT_TIMEOUT (1 * 10 * 1000) /* 3 minutes */ static struct passkey_agent *default_agent = NULL; @@ -64,6 +65,9 @@ static void passkey_agent_free(struct passkey_agent *agent) free(req); } + if (agent->timeout) + g_timeout_remove(agent->timeout); + if (!agent->exited) release_agent(agent); @@ -81,6 +85,45 @@ static void passkey_agent_free(struct passkey_agent *agent) free(agent); } +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; + + agent->exited = 1; + + adapter->passkey_agents = slist_remove(adapter->passkey_agents, agent); + passkey_agent_free(agent); + } +} + +static gboolean agent_timeout(struct passkey_agent *agent) +{ + struct hci_dbus_data *pdata = agent->pdata; + + debug("Passkey Agent at %s, %s timed out", agent->name, agent->path); + + if (pdata) + pdata->passkey_agents = slist_remove(pdata->passkey_agents, agent); + + name_listener_remove(agent->conn, agent->name, (name_cb_t)agent_exited, pdata); + + agent->timeout = 0; + + passkey_agent_free(agent); + + return FALSE; +} + static void default_agent_exited(const char *name, void *data) { debug("%s exited without unregistering the default passkey agent", name); @@ -167,27 +210,6 @@ 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; - - agent->exited = 1; - - adapter->passkey_agents = slist_remove(adapter->passkey_agents, agent); - passkey_agent_free(agent); - } -} - static DBusHandlerResult register_agent(DBusConnection *conn, DBusMessage *msg, void *data) { @@ -233,6 +255,11 @@ static DBusHandlerResult register_agent(DBusConnection *conn, if (!slist_find(adapter->passkey_agents, &ref, (cmp_func_t)agent_cmp)) name_listener_add(conn, ref.name, (name_cb_t)agent_exited, adapter); + /* Because of bugs in glib-ectonomy.c this doesn't work yet */ +#if 0 + agent->timeout = g_timeout_add(AGENT_TIMEOUT, (GSourceFunc)agent_timeout, agent); +#endif + adapter->passkey_agents = slist_append(adapter->passkey_agents, agent); return send_reply_and_unref(conn, reply); @@ -486,7 +513,7 @@ static int call_passkey_agent(DBusConnection *conn, DBUS_TYPE_INVALID); if (dbus_connection_send_with_reply(conn, message, - &req->call, TIMEOUT) == FALSE) { + &req->call, REQUEST_TIMEOUT) == FALSE) { error("D-Bus send failed"); goto failed; } |