diff options
author | Mike Lockwood <lockwood@android.com> | 2009-07-08 09:43:49 -0400 |
---|---|---|
committer | Mike Lockwood <lockwood@android.com> | 2009-07-08 10:28:38 -0400 |
commit | 3d9b265b7d34d886a2f44e486c25e402d7df791b (patch) | |
tree | 781cdfb29be6982ca49f8c7fc0aaa3158f242bd9 /adb | |
parent | b3edd0720ea26ef02763e7446d1bafb85546b38e (diff) | |
download | system_core-3d9b265b7d34d886a2f44e486c25e402d7df791b.zip system_core-3d9b265b7d34d886a2f44e486c25e402d7df791b.tar.gz system_core-3d9b265b7d34d886a2f44e486c25e402d7df791b.tar.bz2 |
adb: Use correct language ID when retrieving USB serial number.
Fixes http://code.google.com/p/android/issues/detail?id=2609
Signed-off-by: Mike Lockwood <lockwood@android.com>
Diffstat (limited to 'adb')
-rw-r--r-- | adb/usb_linux.c | 44 |
1 files changed, 32 insertions, 12 deletions
diff --git a/adb/usb_linux.c b/adb/usb_linux.c index 32ce0a9..95c2ce6 100644 --- a/adb/usb_linux.c +++ b/adb/usb_linux.c @@ -269,26 +269,46 @@ static int find_usb_device(const char *base, if (device->iSerialNumber) { struct usbdevfs_ctrltransfer ctrl; __u16 buffer[128]; - int result; + __u16 languages[128]; + int i, result; + int languageCount = 0; - memset(buffer, 0, sizeof(buffer)); + memset(languages, 0, sizeof(languages)); memset(&ctrl, 0, sizeof(ctrl)); + // read list of supported languages ctrl.bRequestType = USB_DIR_IN|USB_TYPE_STANDARD|USB_RECIP_DEVICE; ctrl.bRequest = USB_REQ_GET_DESCRIPTOR; - ctrl.wValue = (USB_DT_STRING << 8) | device->iSerialNumber; + ctrl.wValue = (USB_DT_STRING << 8) | 0; ctrl.wIndex = 0; - ctrl.wLength = sizeof(buffer); - ctrl.data = buffer; + ctrl.wLength = sizeof(languages); + ctrl.data = languages; result = ioctl(fd, USBDEVFS_CONTROL, &ctrl); - if (result > 0) { - int i; - // skip first word, and copy the rest to the serial string, changing shorts to bytes. - result /= 2; - for (i = 1; i < result; i++) - serial[i - 1] = buffer[i]; - serial[i - 1] = 0; + if (result > 0) + languageCount = (result - 2) / 2; + + for (i = 1; i <= languageCount; i++) { + memset(buffer, 0, sizeof(buffer)); + memset(&ctrl, 0, sizeof(ctrl)); + + ctrl.bRequestType = USB_DIR_IN|USB_TYPE_STANDARD|USB_RECIP_DEVICE; + ctrl.bRequest = USB_REQ_GET_DESCRIPTOR; + ctrl.wValue = (USB_DT_STRING << 8) | device->iSerialNumber; + ctrl.wIndex = languages[i]; + ctrl.wLength = sizeof(buffer); + ctrl.data = buffer; + + result = ioctl(fd, USBDEVFS_CONTROL, &ctrl); + if (result > 0) { + int i; + // skip first word, and copy the rest to the serial string, changing shorts to bytes. + result /= 2; + for (i = 1; i < result; i++) + serial[i - 1] = buffer[i]; + serial[i - 1] = 0; + break; + } } } |