Diff between 63581e155c94261ed582740a91488849e30014a6 and dc3a5865012d3b70be6c123fdca422becc419db0

Changed Files

File Additions Deletions Status
plugins/autopair.c +16 -1 modified

Full Patch

diff --git a/plugins/autopair.c b/plugins/autopair.c
index 4d5e787..24af872 100644
--- a/plugins/autopair.c
+++ b/plugins/autopair.c
@@ -87,8 +87,23 @@ static ssize_t autopair_pincb(struct btd_adapter *adapter,
 		switch ((class & 0xc0) >> 6) {
 		case 0x01:		/* Keyboard */
 		case 0x03:		/* Combo keyboard/pointing device */
-			if (attempt > 1)
+			/* For keyboards rejecting the first random code
+			 * in less than 500ms, try a fixed code. */
+			if (attempt > 1 &&
+				device_bonding_last_duration(device) < 500) {
+				/* Don't try more than one dumb code */
+				if (attempt > 2)
+					return 0;
+				/* Try "0000" as the code for the second
+				 * attempt. */
+				memcpy(pinbuf, "0000", 4);
+				return 4;
+			}
+
+			/* Never try more than 3 random pincodes. */
+			if (attempt >= 4)
 				return 0;
+
 			snprintf(pinstr, sizeof(pinstr), "%06d",
 						rand() % 1000000);
 			*display = TRUE;