diff options
Diffstat (limited to '')
-rw-r--r-- | source/n/bluez/passkey-agent.c (renamed from source/n/bluez-utils/add-passkey.c) | 120 |
1 files changed, 72 insertions, 48 deletions
diff --git a/source/n/bluez-utils/add-passkey.c b/source/n/bluez/passkey-agent.c index b9dcbb517..8ac91d27d 100644 --- a/source/n/bluez-utils/add-passkey.c +++ b/source/n/bluez/passkey-agent.c @@ -1,11 +1,8 @@ /* - * add-passkey.c: - * registers as an agent for the bluez bluetooth linux stack, the code is - * shamelessly stolen from bluez source found at http://bluez.sf.net * * BlueZ - Bluetooth protocol stack for Linux * - * Copyright (C) 2005-2006 Marcel Holtmann <marcel@holtmann.org> + * Copyright (C) 2004-2008 Marcel Holtmann <marcel@holtmann.org> * * * This program is free software; you can redistribute it and/or modify @@ -40,12 +37,11 @@ #define INTERFACE "org.bluez.Security" -// FIXME assumption -#define PASSKEYMAXLENGTH 255 - static char *passkey = NULL; static char *address = NULL; +static int do_reject = 0; + static volatile sig_atomic_t __io_canceled = 0; static volatile sig_atomic_t __io_terminated = 0; @@ -70,6 +66,7 @@ static DBusHandlerResult agent_filter(DBusConnection *conn, } if (!strcmp(name, "org.bluez") && *new == '\0') { + fprintf(stderr, "Passkey service has been terminated\n"); __io_terminated = 1; } @@ -81,25 +78,36 @@ 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; } + if (do_reject) { + reply = dbus_message_new_error(msg, + "org.bluez.Error.Rejected", ""); + goto send; + } + reply = dbus_message_new_method_return(msg); if (!reply) { fprintf(stderr, "Can't create reply message\n"); - return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + return DBUS_HANDLER_RESULT_NEED_MEMORY; } + printf("Passkey request for device %s\n", address); + dbus_message_append_args(reply, DBUS_TYPE_STRING, &passkey, DBUS_TYPE_INVALID); +send: dbus_connection_send(conn, reply, NULL); dbus_connection_flush(conn); @@ -109,35 +117,63 @@ static DBusHandlerResult request_message(DBusConnection *conn, return DBUS_HANDLER_RESULT_HANDLED; } -static DBusHandlerResult release_message(DBusConnection *conn, +static DBusHandlerResult cancel_message(DBusConnection *conn, DBusMessage *msg, void *data) { DBusMessage *reply; + const char *path, *address; - if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_INVALID)) { - fprintf(stderr, "Invalid arguments for passkey Release method"); + if (!dbus_message_get_args(msg, NULL, + DBUS_TYPE_STRING, &path, DBUS_TYPE_STRING, &address, + DBUS_TYPE_INVALID)) { + fprintf(stderr, "Invalid arguments for passkey Confirm method"); return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } + printf("Request canceled for device %s\n", address); + reply = dbus_message_new_method_return(msg); if (!reply) { fprintf(stderr, "Can't create reply message\n"); - return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + return DBUS_HANDLER_RESULT_NEED_MEMORY; } - dbus_message_append_args(reply, DBUS_TYPE_INVALID); - dbus_connection_send(conn, reply, NULL); dbus_connection_flush(conn); dbus_message_unref(reply); + return DBUS_HANDLER_RESULT_HANDLED; +} + +static DBusHandlerResult release_message(DBusConnection *conn, + DBusMessage *msg, void *data) +{ + DBusMessage *reply; + + 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"); __io_terminated = 1; + reply = dbus_message_new_method_return(msg); + if (!reply) { + fprintf(stderr, "Can't create reply message\n"); + return DBUS_HANDLER_RESULT_NEED_MEMORY; + } + + dbus_connection_send(conn, reply, NULL); + + dbus_connection_flush(conn); + + dbus_message_unref(reply); + return DBUS_HANDLER_RESULT_HANDLED; } @@ -147,6 +183,9 @@ 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", "Cancel")) + return cancel_message(conn, msg, data); + if (dbus_message_is_method_call(msg, "org.bluez.PasskeyAgent", "Release")) return release_message(conn, msg, data); @@ -166,7 +205,7 @@ static int register_agent(DBusConnection *conn, const char *agent_path, if (!dbus_connection_register_object_path(conn, agent_path, &agent_table, NULL)) { - fprintf(stderr, "Can't register path object path for agent\n"); + fprintf(stderr, "Can't register object path for agent\n"); return -1; } @@ -231,7 +270,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); } @@ -268,21 +307,16 @@ static int unregister_agent(DBusConnection *conn, const char *agent_path, static void usage(void) { -// printf("Bluetooth passkey agent ver %s\n\n", VERSION); + printf("Bluetooth passkey agent ver %s\n\n", VERSION); printf("Usage:\n" - "\tadd-passkey [--passkey-fd n] [--default] [--path agent-path] [address]\n" - "\n" - "add-passkey will read from passkey-fd (default: stdin) adding a default passkey\n" - "if --default is given, or for a specific address if supplied on commandline.\n\n" - "--default or address are mandatory.\n" - "this program is based on bluez passkey-agent.c from http://bluez.sf.net\n" + "\tpasskey-agent [--default] [--path agent-path] <passkey> [address]\n" "\n"); } static struct option main_options[] = { - { "passkey-fd", 1, 0, 'f'}, { "default", 0, 0, 'd' }, + { "reject", 0, 0, 'r' }, { "path", 1, 0, 'p' }, { "help", 0, 0, 'h' }, { 0, 0, 0, 0 } @@ -293,19 +327,19 @@ int main(int argc, char *argv[]) struct sigaction sa; DBusConnection *conn; char match_string[128], default_path[128], *agent_path = NULL; - int opt, use_default = 0, passkey_fd = 0; - char *tmppasskey; + int opt, use_default = 0; snprintf(default_path, sizeof(default_path), "/org/bluez/passkey_agent_%d", getpid()); - while ((opt = getopt_long(argc, argv, "+fdp:h", main_options, NULL)) != EOF) { + while ((opt = getopt_long(argc, argv, "+dp:h", main_options, NULL)) != EOF) { switch(opt) { - case 'f': - passkey_fd = atoi(optarg); case 'd': use_default = 1; break; + case 'r': + do_reject = 1; + break; case 'p': if (optarg[0] != '/') { fprintf(stderr, "Invalid path\n"); @@ -324,24 +358,14 @@ int main(int argc, char *argv[]) argc -= optind; argv += optind; optind = 0; - - if (argc < 1 && !use_default) { + + if (argc < 1) { usage(); exit(1); } - - passkey = malloc(PASSKEYMAXLENGTH * sizeof(char)); - - if (!read(passkey_fd, passkey, PASSKEYMAXLENGTH)) { - fprintf(stderr, "Unable to read passkey from fd %d\n", passkey_fd); - exit(1); - } - - if (tmppasskey = index(passkey, '\n')) { - *tmppasskey = '\0'; - } - address = (argc > 0) ? strdup(argv[0]) : NULL; + passkey = strdup(argv[0]); + address = (argc > 1) ? strdup(argv[1]) : NULL; if (!use_default && !address) { usage(); @@ -358,7 +382,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); } @@ -378,7 +402,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; } @@ -388,7 +412,7 @@ int main(int argc, char *argv[]) if (passkey) free(passkey); - dbus_connection_close(conn); + dbus_connection_unref(conn); return 0; } |