Diff between 4b3005226554596d0d515b5f8cb196848ab6f819 and 342f1aa194576f9f54f20fd8cc1856bcfb03c588

Changed Files

File Additions Deletions Status
client/agent.c +36 -0 modified

Full Patch

diff --git a/client/agent.c b/client/agent.c
index 498f497..2d9dffd 100644
--- a/client/agent.c
+++ b/client/agent.c
@@ -97,6 +97,20 @@ static void pincode_response(DBusConnection *conn, const char *input)
 							DBUS_TYPE_INVALID);
 }
 
+static void passkey_response(DBusConnection *conn, const char *input)
+{
+	dbus_uint32_t passkey;
+	if (sscanf(input, "%u", &passkey) == 1)
+		g_dbus_send_reply(conn, pending_message, DBUS_TYPE_UINT32,
+						&passkey, DBUS_TYPE_INVALID);
+	else if (!strcmp(input, "no"))
+		g_dbus_send_error(conn, pending_message,
+					"org.bluez.Error.Rejected", NULL);
+	else
+		g_dbus_send_error(conn, pending_message,
+					"org.bluez.Error.Canceled", NULL);
+}
+
 static void confirm_response(DBusConnection *conn, const char *input)
 {
 	if (!strcmp(input, "yes"))
@@ -122,6 +136,8 @@ dbus_bool_t agent_input(DBusConnection *conn, const char *input)
 
 	if (!strcmp(member, "RequestPinCode"))
 		pincode_response(conn, input);
+	else if (!strcmp(member, "RequestPasskey"))
+		passkey_response(conn, input);
 	else if (!strcmp(member, "RequestConfirmation"))
 		confirm_response(conn, input);
 	else if (!strcmp(member, "RequestAuthorization"))
@@ -189,6 +205,23 @@ static DBusMessage *display_pincode(DBusConnection *conn,
 	return dbus_message_new_method_return(msg);
 }
 
+static DBusMessage *request_passkey(DBusConnection *conn,
+					DBusMessage *msg, void *user_data)
+{
+	const char *device;
+
+	rl_printf("Request passkey\n");
+
+	dbus_message_get_args(msg, NULL, DBUS_TYPE_OBJECT_PATH, &device,
+							DBUS_TYPE_INVALID);
+
+	agent_prompt("Enter passkey (number in 0-999999): ");
+
+	pending_message = dbus_message_ref(msg);
+
+	return NULL;
+}
+
 static DBusMessage *display_passkey(DBusConnection *conn,
 					DBusMessage *msg, void *user_data)
 {
@@ -292,6 +325,9 @@ static const GDBusMethodTable methods[] = {
 	{ GDBUS_METHOD("DisplayPinCode",
 			GDBUS_ARGS({ "device", "o" }, { "pincode", "s" }),
 			NULL, display_pincode) },
+	{ GDBUS_ASYNC_METHOD("RequestPasskey",
+			GDBUS_ARGS({ "device", "o" }),
+			GDBUS_ARGS({ "passkey", "u" }), request_passkey) },
 	{ GDBUS_METHOD("DisplayPasskey",
 			GDBUS_ARGS({ "device", "o" }, { "passkey", "u" },
 							{ "entered", "q" }),