diff options
author | Luiz Augusto von Dentz <luiz.dentz@openbossa.org> | 2008-11-05 11:56:02 -0300 |
---|---|---|
committer | Luiz Augusto von Dentz <luiz.dentz@openbossa.org> | 2008-11-05 11:56:02 -0300 |
commit | 37f2c163503f053cf4c3f1e2ddb5ffb05b0a347b (patch) | |
tree | 84868490985421e721a16c0f384295991a8759ac | |
parent | a6e82811026f8b2ce6266b4a2ebd95dad118c09f (diff) |
Handle RequestAuthorization on adapter ANY.
-rw-r--r-- | src/adapter.c | 46 |
1 files 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); |