diff options
Diffstat (limited to 'daemon/echo.c')
-rw-r--r-- | daemon/echo.c | 61 |
1 files changed, 57 insertions, 4 deletions
diff --git a/daemon/echo.c b/daemon/echo.c index a06359e2..41c67559 100644 --- a/daemon/echo.c +++ b/daemon/echo.c @@ -43,6 +43,12 @@ #include "dbus.h" #include "logging.h" +struct auth_data { + DBusConnection *conn; + GIOChannel *io; + char *address; +}; + static gboolean session_event(GIOChannel *chan, GIOCondition cond, gpointer data) { unsigned char buf[672]; @@ -61,41 +67,81 @@ static gboolean session_event(GIOChannel *chan, GIOCondition cond, gpointer data return TRUE; } +static void cancel_authorization(DBusConnection *conn, const char *address) +{ + DBusMessage *msg; + const char *string = ""; + + info("Canceling authorization for %s", address); + + msg = dbus_message_new_method_call("org.bluez", "/org/bluez", + "org.bluez.Database", "CancelAuthorizationRequest"); + if (!msg) { + error("Allocation of method message failed"); + return; + } + + dbus_message_append_args(msg, DBUS_TYPE_STRING, &address, + DBUS_TYPE_STRING, &string, DBUS_TYPE_INVALID); + + dbus_connection_send(conn, msg, NULL); + + dbus_message_unref(msg); +} + static void authorization_callback(DBusPendingCall *call, void *data) { DBusMessage *reply = dbus_pending_call_steal_reply(call); - GIOChannel *io = data; + struct auth_data *auth = data; DBusError err; dbus_error_init(&err); if (dbus_set_error_from_message(&err, reply)) { error("Access denied: %s", err.message); + if (dbus_error_has_name(&err, DBUS_ERROR_NO_REPLY)) + cancel_authorization(auth->conn, auth->address); dbus_error_free(&err); } else { info("Accepting incoming connection"); - g_io_add_watch(io, G_IO_IN | G_IO_HUP | G_IO_ERR, + g_io_add_watch(auth->io, G_IO_IN | G_IO_HUP | G_IO_ERR, session_event, NULL); } - g_io_channel_unref(io); + g_io_channel_unref(auth->io); dbus_message_unref(reply); } +static void authorization_free(void *data) +{ + struct auth_data *auth = data; + + g_free(auth->address); + g_free(auth); +} + static int request_authorization(DBusConnection *conn, GIOChannel *io, const char *address) { DBusMessage *msg; DBusPendingCall *pending; + struct auth_data *auth; const char *string = ""; info("Requesting authorization for %s", address); + auth = g_try_malloc0(sizeof(*auth)); + if (!auth) { + error("Allocation of auth object failed"); + return -1; + } + msg = dbus_message_new_method_call("org.bluez", "/org/bluez", "org.bluez.Database", "RequestAuthorization"); if (!msg) { error("Allocation of method message failed"); + g_free(auth); return -1; } @@ -104,10 +150,17 @@ static int request_authorization(DBusConnection *conn, if (dbus_connection_send_with_reply(conn, msg, &pending, -1) == FALSE) { error("Sending of authorization request failed"); + dbus_message_unref(msg); + g_free(auth); return -1; } - dbus_pending_call_set_notify(pending, authorization_callback, io, NULL); + auth->conn = conn; + auth->io = io; + auth->address = g_strdup(address); + + dbus_pending_call_set_notify(pending, authorization_callback, + auth, authorization_free); dbus_pending_call_unref(pending); |