diff -ru bluez-utils-3.7.orig/hcid/passkey-agent.c bluez-utils-3.7/hcid/passkey-agent.c --- bluez-utils-3.7.orig/hcid/passkey-agent.c 2006-04-28 14:30:59.000000000 +0000 +++ bluez-utils-3.7/hcid/passkey-agent.c 2006-10-12 19:23:52.000000000 +0000 @@ -21,6 +21,7 @@ * */ +#define DBUS_API_SUBJECT_TO_CHANGE #ifdef HAVE_CONFIG_H #include <config.h> #endif @@ -76,12 +77,17 @@ { DBusMessage *reply; const char *path, *address; + char *buffer; + FILE *pin; + unsigned int buflen; + int status; + char *s_passkey; 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)) { + DBUS_TYPE_STRING, &address, DBUS_TYPE_INVALID)) { fprintf(stderr, "Invalid arguments for passkey Request method"); return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } @@ -91,8 +97,34 @@ fprintf(stderr, "Can't create reply message\n"); return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } + buflen=strlen(passkey)+256; + if(buflen<=256) + { + fprintf(stderr, "Invalid pin-helper argument, aborting."); + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + } + buffer=malloc(buflen); + if(buffer==NULL) + { + fprintf(stderr, "Error allocating memory (malloc), aborting."); + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + } + sprintf(buffer, "%s %s %s", passkey, "in", address); + pin=popen(buffer, "r"); + wait(&status); + fgets(buffer, 256, pin); + if(buffer[1]!='P' && buffer[1]!='I' && buffer[2]!='N') + { + free(buffer); + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + } + pclose(pin); + s_passkey=&buffer[4]; + if(s_passkey[strlen(s_passkey)-1]=='\n') s_passkey[strlen(s_passkey)-1]='\0'; + fprintf(stderr, "Found passkey: \"%s\"\n", s_passkey); - dbus_message_append_args(reply, DBUS_TYPE_STRING, &passkey, + + dbus_message_append_args(reply, DBUS_TYPE_STRING, &s_passkey , DBUS_TYPE_INVALID); dbus_connection_send(conn, reply, NULL); @@ -100,7 +132,7 @@ dbus_connection_flush(conn); dbus_message_unref(reply); - + free(buffer); return DBUS_HANDLER_RESULT_HANDLED; } @@ -263,10 +295,10 @@ static void usage(void) { - printf("Bluetooth passkey agent ver %s\n\n", VERSION); + printf("Bluetooth passkey agent ver %s with \"exec\" patch from Marco Gulino (http://www.kmobiletools.org/node/228)\n\n", VERSION); printf("Usage:\n" - "\tpasskey-agent [--default] [--path agent-path] <passkey> [address]\n" + "\tpasskey-agent [--default] [--path agent-path] <path-to-pin-helper> [address]\n" "\n"); }