diff options
| -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;  } | 
