dst = device_get_address(dev);
session->auth_id = btd_request_authorization(src, dst,
- AVRCP_REMOTE_UUID,
- auth_cb, session);
+ AVRCP_REMOTE_UUID,
+ auth_cb, session, 0);
if (session->auth_id == 0)
goto drop;
(GIOFunc) session_cb, session);
session->auth_id = btd_request_authorization(&src, &dst,
- ADVANCED_AUDIO_UUID,
- auth_cb, session);
+ ADVANCED_AUDIO_UUID,
+ auth_cb, session, 0);
if (session->auth_id == 0) {
avdtp_set_state(session, AVDTP_SESSION_STATE_DISCONNECTED);
goto drop;
server->confirm = g_io_channel_ref(chan);
ret = btd_request_authorization(&src, &dst, HID_UUID,
- auth_callback, server);
+ auth_callback, server, 0);
if (ret != 0)
return;
na->setup->io = g_io_channel_ref(chan);
ret = btd_request_authorization(&src, &dst, BNEP_SVC_UUID,
- auth_cb, na);
+ auth_cb, na, 0);
if (ret == 0) {
error("Refusing connect from %s", address);
setup_destroy(na);
ba2str(&dst, dstaddr);
ret = btd_request_authorization(&src, &dst, SAP_UUID, connect_auth_cb,
- server);
+ server, 0);
if (ret == 0) {
error("Authorization failure");
sap_server_remove_conn(server);
struct btd_device *device;
struct btd_adapter *adapter;
struct agent *agent; /* NULL for queued auths */
+ int fd;
};
struct btd_adapter_pin_cb_iter {
dev_path = btd_device_get_path(device);
if (agent_authorize_service(auth->agent, dev_path, auth->uuid,
- agent_auth_cb, adapter, NULL) < 0) {
+ agent_auth_cb, adapter, NULL, auth->fd) < 0) {
auth->cb(&err, auth->user_data);
goto next;
}
static int adapter_authorize(struct btd_adapter *adapter, const bdaddr_t *dst,
const char *uuid, service_auth_cb cb,
- void *user_data)
+ void *user_data, int fd)
{
struct service_auth *auth;
struct btd_device *device;
auth->device = device;
auth->adapter = adapter;
auth->id = ++id;
+ auth->fd = fd;
auth->svc_id = device_wait_for_svc_complete(device, svc_complete, auth);
g_queue_push_tail(adapter->auths, auth);
guint btd_request_authorization(const bdaddr_t *src, const bdaddr_t *dst,
const char *uuid, service_auth_cb cb,
- void *user_data)
+ void *user_data, int fd)
{
struct btd_adapter *adapter;
GSList *l;
if (!adapter)
return 0;
- return adapter_authorize(adapter, dst, uuid, cb, user_data);
+ return adapter_authorize(adapter, dst, uuid, cb,
+ user_data, fd);
}
for (l = adapters; l != NULL; l = g_slist_next(l)) {
adapter = l->data;
- id = adapter_authorize(adapter, dst, uuid, cb, user_data);
+ id = adapter_authorize(adapter, dst, uuid, cb,
+ user_data, fd);
if (id != 0)
return id;
}
int btd_register_adapter_driver(struct btd_adapter_driver *driver);
void btd_unregister_adapter_driver(struct btd_adapter_driver *driver);
guint btd_request_authorization(const bdaddr_t *src, const bdaddr_t *dst,
- const char *uuid, service_auth_cb cb, void *user_data);
+ const char *uuid, service_auth_cb cb, void *user_data, int fd);
int btd_cancel_authorization(guint id);
int btd_adapter_restore_powered(struct btd_adapter *adapter);
static int agent_call_authorize_service(struct agent_request *req,
const char *device_path,
- const char *uuid)
+ const char *uuid,
+ const int fd)
{
+ DBusMessageIter iter, dict;
struct agent *agent = req->agent;
req->msg = dbus_message_new_method_call(agent->owner, agent->path,
return -ENOMEM;
}
- dbus_message_append_args(req->msg,
- DBUS_TYPE_OBJECT_PATH, &device_path,
- DBUS_TYPE_STRING, &uuid,
- DBUS_TYPE_INVALID);
+ dbus_message_iter_init_append(req->msg, &iter);
+
+ dbus_message_iter_append_basic(&iter, DBUS_TYPE_OBJECT_PATH,
+ &device_path);
+
+ dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &uuid);
+
+ dbus_message_iter_append_basic(&iter, DBUS_TYPE_UNIX_FD, &fd);
if (g_dbus_send_message_with_reply(btd_get_dbus_connection(),
req->msg, &req->call,
}
int agent_authorize_service(struct agent *agent, const char *path,
- const char *uuid, agent_cb cb,
- void *user_data, GDestroyNotify destroy)
+ const char *uuid, agent_cb cb,
+ void *user_data, GDestroyNotify destroy, int fd)
{
struct agent_request *req;
int err;
req = agent_request_new(agent, AGENT_REQUEST_AUTHORIZE_SERVICE, cb,
user_data, destroy);
- err = agent_call_authorize_service(req, path, uuid);
+ err = agent_call_authorize_service(req, path, uuid, fd);
if (err < 0) {
agent_request_free(req, FALSE);
return -ENOMEM;
struct agent *agent_get(const char *owner);
int agent_authorize_service(struct agent *agent, const char *path,
- const char *uuid, agent_cb cb,
- void *user_data, GDestroyNotify destroy);
+ const char *uuid, agent_cb cb,
+ void *user_data, GDestroyNotify destroy, int fd);
int agent_request_pincode(struct agent *agent, struct btd_device *device,
agent_pincode_cb cb, gboolean secure,
GError *gerr = NULL;
bdaddr_t src, dst;
char addr[18];
+ int fd;
bt_io_get(io, &gerr,
BT_IO_OPT_SOURCE_BDADDR, &src,
if (conn == NULL)
return;
+ fd = g_io_channel_unix_get_fd(conn->io);
conn->auth_id = btd_request_authorization(&src, &dst, uuid, ext_auth,
- conn);
+ conn, fd);
if (conn->auth_id == 0) {
error("%s authorization failure", ext->name);
ext_io_destroy(conn);