diff options
author | Marcel Holtmann <marcel@holtmann.org> | 2006-03-09 22:07:59 +0000 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2006-03-09 22:07:59 +0000 |
commit | 3c1d9df615705539a3d43d46e80f978cf08b9948 (patch) | |
tree | 24f604dc12671aed7013d28ea35513b4c4cb2769 /hcid | |
parent | 0fc8e1ab39592dc632f4b42deeea711c76898bcc (diff) |
Update simple passkey agent registration
Diffstat (limited to 'hcid')
-rw-r--r-- | hcid/passkey-agent.c | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/hcid/passkey-agent.c b/hcid/passkey-agent.c index 9336cd7f..7c1b73c2 100644 --- a/hcid/passkey-agent.c +++ b/hcid/passkey-agent.c @@ -27,8 +27,87 @@ #include <stdio.h> #include <errno.h> +#include <stdlib.h> +#include <signal.h> +#include <string.h> + +#include <dbus/dbus.h> + +static const char *agent_path = "/org/bluez/passkey-agent/"; + +static volatile sig_atomic_t __io_canceled = 0; + +static void sig_term(int sig) +{ + __io_canceled = 1; +} + +DBusHandlerResult agent_message(DBusConnection *conn, DBusMessage *msg, void *data) +{ + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; +} + +static const DBusObjectPathVTable agent_table = { + .message_function = agent_message, +}; int main(int argc, char **argv) { + struct sigaction sa; + DBusConnection* conn; + DBusMessage *msg, *reply; + DBusMessageIter iter; + DBusError err; + + dbus_error_init(&err); + + conn = dbus_bus_get(DBUS_BUS_SYSTEM, &err); + + if (dbus_error_is_set(&err)) { + fprintf(stderr, "Can't get on system bus"); + dbus_error_free(&err); + exit(1); + } + + dbus_connection_register_object_path(conn, agent_path, + &agent_table, NULL); + + msg = dbus_message_new_method_call("org.bluez", "/org/bluez/Manager", + "org.bluez.Security", "RegisterDefaultPasskeyAgent"); + + if (!msg) { + fprintf(stderr, "Can't allocate new method call\n"); + exit(1); + } + + dbus_message_iter_init_append(msg, &iter); + dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &agent_path); + + reply = dbus_connection_send_with_reply_and_block(conn, msg, -1, &err); + + dbus_message_unref(msg); + + if (!reply) { + fprintf(stderr, "Can't register passkey agent\n"); + exit(1); + } + + dbus_message_unref(reply); + + dbus_connection_flush(conn); + + memset(&sa, 0, sizeof(sa)); + sa.sa_flags = SA_NOCLDSTOP; + sa.sa_handler = sig_term; + sigaction(SIGTERM, &sa, NULL); + sigaction(SIGINT, &sa, NULL); + + while (!__io_canceled) { + if (dbus_connection_read_write_dispatch(conn, 100) != TRUE) + break; + } + + dbus_connection_close(conn); + return 0; } |