diff options
Diffstat (limited to 'hcid/passkey-agent.c')
-rw-r--r-- | hcid/passkey-agent.c | 55 |
1 files changed, 45 insertions, 10 deletions
diff --git a/hcid/passkey-agent.c b/hcid/passkey-agent.c index e47afe6b..79147ee2 100644 --- a/hcid/passkey-agent.c +++ b/hcid/passkey-agent.c @@ -76,12 +76,14 @@ static DBusHandlerResult request_message(DBusConnection *conn, { DBusMessage *reply; const char *path, *address; + dbus_bool_t numeric; if (!passkey) return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; - if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &path, - DBUS_TYPE_STRING, &address, DBUS_TYPE_INVALID)) { + if (!dbus_message_get_args(msg, NULL, + DBUS_TYPE_STRING, &path, DBUS_TYPE_STRING, &address, + DBUS_TYPE_BOOLEAN, &numeric, DBUS_TYPE_INVALID)) { fprintf(stderr, "Invalid arguments for passkey Request method"); return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } @@ -104,29 +106,56 @@ static DBusHandlerResult request_message(DBusConnection *conn, return DBUS_HANDLER_RESULT_HANDLED; } -static DBusHandlerResult release_message(DBusConnection *conn, +static DBusHandlerResult confirm_message(DBusConnection *conn, DBusMessage *msg, void *data) { DBusMessage *reply; + const char *path, *address, *value; + dbus_bool_t result; - if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_INVALID)) { - fprintf(stderr, "Invalid arguments for passkey Release method"); + if (!passkey) + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + + if (!dbus_message_get_args(msg, NULL, + DBUS_TYPE_STRING, &path, DBUS_TYPE_STRING, &address, + DBUS_TYPE_STRING, &value, DBUS_TYPE_INVALID)) { + fprintf(stderr, "Invalid arguments for passkey Confirm method"); return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } + result = strcmp(value, passkey) == 0 ? TRUE : FALSE; + reply = dbus_message_new_method_return(msg); if (!reply) { fprintf(stderr, "Can't create reply message\n"); return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } - dbus_message_append_args(reply, DBUS_TYPE_INVALID); + dbus_message_append_args(reply, DBUS_TYPE_BOOLEAN, &result, + DBUS_TYPE_INVALID); dbus_connection_send(conn, reply, NULL); dbus_connection_flush(conn); dbus_message_unref(reply); + + return DBUS_HANDLER_RESULT_HANDLED; +} + +static DBusHandlerResult cancel_message(DBusConnection *conn, + DBusMessage *msg, void *data) +{ + return DBUS_HANDLER_RESULT_HANDLED; +} + +static DBusHandlerResult release_message(DBusConnection *conn, + DBusMessage *msg, void *data) +{ + if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_INVALID)) { + fprintf(stderr, "Invalid arguments for passkey Release method"); + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + } if (!__io_canceled) fprintf(stderr, "Passkey service has been released\n"); @@ -142,6 +171,12 @@ static DBusHandlerResult agent_message(DBusConnection *conn, if (dbus_message_is_method_call(msg, "org.bluez.PasskeyAgent", "Request")) return request_message(conn, msg, data); + if (dbus_message_is_method_call(msg, "org.bluez.PasskeyAgent", "Confirm")) + return confirm_message(conn, msg, data); + + if (dbus_message_is_method_call(msg, "org.bluez.PasskeyAgent", "Cancel")) + return cancel_message(conn, msg, data); + if (dbus_message_is_method_call(msg, "org.bluez.PasskeyAgent", "Release")) return release_message(conn, msg, data); @@ -226,7 +261,7 @@ static int unregister_agent(DBusConnection *conn, const char *agent_path, msg = dbus_message_new_method_call("org.bluez", path, INTERFACE, method); if (!msg) { fprintf(stderr, "Can't allocate new method call\n"); - dbus_connection_close(conn); + dbus_connection_unref(conn); exit(1); } @@ -334,7 +369,7 @@ int main(int argc, char *argv[]) } if (register_agent(conn, agent_path, address, use_default) < 0) { - dbus_connection_close(conn); + dbus_connection_unref(conn); exit(1); } @@ -354,7 +389,7 @@ int main(int argc, char *argv[]) sigaction(SIGINT, &sa, NULL); while (!__io_canceled && !__io_terminated) { - if (dbus_connection_read_write_dispatch(conn, 100) != TRUE) + if (dbus_connection_read_write_dispatch(conn, 500) != TRUE) break; } @@ -364,7 +399,7 @@ int main(int argc, char *argv[]) if (passkey) free(passkey); - dbus_connection_close(conn); + dbus_connection_unref(conn); return 0; } |