OSDN Git Service

autopair: Try a fixed pincode for keyboards rejecting random codes
authorAlex Deymo <deymo@chromium.org>
Thu, 9 May 2013 00:38:02 +0000 (17:38 -0700)
committerJohan Hedberg <johan.hedberg@intel.com>
Fri, 10 May 2013 07:26:19 +0000 (10:26 +0300)
This patch makes the autopair plugin try a fixed "0000" pincode for
keyboards that reject the pincode too fast (less than 500ms). This too
short delay rejecting the pincode means that the user didn't have time
to type the random pincode in the bluetooth keyboard and was the
keyboard who actually rejected it.

plugins/autopair.c

index 4d5e787..24af872 100644 (file)
@@ -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;