summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2006-03-09 22:07:59 +0000
committerMarcel Holtmann <marcel@holtmann.org>2006-03-09 22:07:59 +0000
commit3c1d9df615705539a3d43d46e80f978cf08b9948 (patch)
tree24f604dc12671aed7013d28ea35513b4c4cb2769
parent0fc8e1ab39592dc632f4b42deeea711c76898bcc (diff)
Update simple passkey agent registration
-rw-r--r--hcid/passkey-agent.c79
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;
}