summaryrefslogtreecommitdiffstats
path: root/adb
diff options
context:
space:
mode:
authorMike Lockwood <lockwood@android.com>2009-07-08 09:43:49 -0400
committerMike Lockwood <lockwood@android.com>2009-07-08 10:28:38 -0400
commit3d9b265b7d34d886a2f44e486c25e402d7df791b (patch)
tree781cdfb29be6982ca49f8c7fc0aaa3158f242bd9 /adb
parentb3edd0720ea26ef02763e7446d1bafb85546b38e (diff)
downloadsystem_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.c44
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;
+ }
}
}