From 37f2c163503f053cf4c3f1e2ddb5ffb05b0a347b Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Wed, 5 Nov 2008 11:56:02 -0300 Subject: Handle RequestAuthorization on adapter ANY. --- src/adapter.c | 46 ++++++++++++++++++++++++++++++++++++---------- 1 file changed, 36 insertions(+), 10 deletions(-) diff --git a/src/adapter.c b/src/adapter.c index 39a63526..b874e12a 100644 --- a/src/adapter.c +++ b/src/adapter.c @@ -3293,31 +3293,23 @@ static void agent_auth_cb(struct agent *agent, DBusError *derr, void *user_data) g_free(auth); } -int btd_request_authorization(const bdaddr_t *src, const bdaddr_t *dst, +static int btd_adapter_authorize(struct btd_adapter *adapter, const bdaddr_t *dst, const char *uuid, service_auth_cb cb, void *user_data) { struct service_auth *auth; - struct btd_adapter *adapter; struct btd_device *device; struct agent *agent; char address[18]; gboolean trusted; const gchar *dev_path; - if (src == NULL || dst == NULL) - return -EINVAL; - - adapter = manager_find_adapter(src); - if (!adapter) - return -EPERM; - /* Device connected? */ if (!g_slist_find_custom(adapter->active_conn, dst, active_conn_find_by_bdaddr)) return -ENOTCONN; ba2str(dst, address); - trusted = read_trust(src, address, GLOBAL_TRUST); + trusted = read_trust(&adapter->bdaddr, address, GLOBAL_TRUST); if (trusted) { cb(NULL, user_data); @@ -3348,6 +3340,40 @@ int btd_request_authorization(const bdaddr_t *src, const bdaddr_t *dst, return agent_authorize(agent, dev_path, uuid, agent_auth_cb, auth); } +int btd_request_authorization(const bdaddr_t *src, const bdaddr_t *dst, + const char *uuid, service_auth_cb cb, void *user_data) +{ + struct btd_adapter *adapter; + GSList *adapters; + + if (src == NULL || dst == NULL) + return -EINVAL; + + if (bacmp(src, BDADDR_ANY) != 0) + goto proceed; + + /* Handle request authorization for ANY adapter */ + adapters = manager_get_adapters(); + + for (; adapters; adapters = adapters->next) { + int err; + adapter = adapters->data; + + err = btd_adapter_authorize(adapter, dst, uuid, cb, user_data); + if (err == 0) + return 0; + } + + return -EPERM; + +proceed: + adapter = manager_find_adapter(src); + if (!adapter) + return -EPERM; + + return btd_adapter_authorize(adapter, dst, uuid, cb, user_data); +} + int btd_cancel_authorization(const bdaddr_t *src, const bdaddr_t *dst) { struct btd_adapter *adapter = manager_find_adapter(src); -- cgit