1a09fbd164d2e088bc5433d310e25640ae048d47dXavier Ducrohet/*
2a09fbd164d2e088bc5433d310e25640ae048d47dXavier Ducrohet * Copyright (C) 2009 The Android Open Source Project
3a09fbd164d2e088bc5433d310e25640ae048d47dXavier Ducrohet *
4a09fbd164d2e088bc5433d310e25640ae048d47dXavier Ducrohet * Licensed under the Apache License, Version 2.0 (the "License");
5a09fbd164d2e088bc5433d310e25640ae048d47dXavier Ducrohet * you may not use this file except in compliance with the License.
6a09fbd164d2e088bc5433d310e25640ae048d47dXavier Ducrohet * You may obtain a copy of the License at
7a09fbd164d2e088bc5433d310e25640ae048d47dXavier Ducrohet *
8a09fbd164d2e088bc5433d310e25640ae048d47dXavier Ducrohet *      http://www.apache.org/licenses/LICENSE-2.0
9a09fbd164d2e088bc5433d310e25640ae048d47dXavier Ducrohet *
10a09fbd164d2e088bc5433d310e25640ae048d47dXavier Ducrohet * Unless required by applicable law or agreed to in writing, software
11a09fbd164d2e088bc5433d310e25640ae048d47dXavier Ducrohet * distributed under the License is distributed on an "AS IS" BASIS,
12a09fbd164d2e088bc5433d310e25640ae048d47dXavier Ducrohet * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a09fbd164d2e088bc5433d310e25640ae048d47dXavier Ducrohet * See the License for the specific language governing permissions and
14a09fbd164d2e088bc5433d310e25640ae048d47dXavier Ducrohet * limitations under the License.
15a09fbd164d2e088bc5433d310e25640ae048d47dXavier Ducrohet */
16a09fbd164d2e088bc5433d310e25640ae048d47dXavier Ducrohet
17a09fbd164d2e088bc5433d310e25640ae048d47dXavier Ducrohet#include "usb_vendors.h"
18a09fbd164d2e088bc5433d310e25640ae048d47dXavier Ducrohet
19a09fbd164d2e088bc5433d310e25640ae048d47dXavier Ducrohet#include <stdio.h>
200eabf64ce0c649e4ef691ae1b70cb20d599dd429Christopher Ferris#include <stdlib.h>
21a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet
22a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet#ifdef _WIN32
230eabf64ce0c649e4ef691ae1b70cb20d599dd429Christopher Ferris#  ifndef WIN32_LEAN_AND_MEAN
240eabf64ce0c649e4ef691ae1b70cb20d599dd429Christopher Ferris#    define WIN32_LEAN_AND_MEAN
250eabf64ce0c649e4ef691ae1b70cb20d599dd429Christopher Ferris#  endif
26a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet#  include "windows.h"
27a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet#  include "shlobj.h"
28a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet#else
29a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet#  include <unistd.h>
30a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet#  include <sys/stat.h>
31a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet#endif
32a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet
33a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet#include "sysdeps.h"
34a09fbd164d2e088bc5433d310e25640ae048d47dXavier Ducrohet#include "adb.h"
35a09fbd164d2e088bc5433d310e25640ae048d47dXavier Ducrohet
36a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet#define ANDROID_PATH            ".android"
37a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet#define ANDROID_ADB_INI         "adb_usb.ini"
38a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet
39a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet#define TRACE_TAG               TRACE_USB
40a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet
41293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross/* Keep the list below sorted alphabetically by #define name */
427953b89e8d68565d15791618146a712231683d09Robert CH Chou// Acer's USB Vendor ID
437953b89e8d68565d15791618146a712231683d09Robert CH Chou#define VENDOR_ID_ACER          0x0502
4463f0f5117bb8ca781a8d9c9a66f5cba755e6005eDanielMo// Allwinner's USB Vendor ID
4563f0f5117bb8ca781a8d9c9a66f5cba755e6005eDanielMo#define VENDOR_ID_ALLWINNER     0x1F3A
46d5dab6d5f85e7c03f08614918088a33ce73abcf5DanielMo// Amlogic's USB Vendor ID
47d5dab6d5f85e7c03f08614918088a33ce73abcf5DanielMo#define VENDOR_ID_AMLOGIC       0x1b8e
48293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross// AnyDATA's USB Vendor ID
49293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross#define VENDOR_ID_ANYDATA       0x16D5
50293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross// Archos's USB Vendor ID
51293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross#define VENDOR_ID_ARCHOS        0x0E79
5289aff1d22662c64cc2de384e7e2c699e4d1d5d47Xavier Ducrohet// Asus's USB Vendor ID
5389aff1d22662c64cc2de384e7e2c699e4d1d5d47Xavier Ducrohet#define VENDOR_ID_ASUS          0x0b05
54293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross// BYD's USB Vendor ID
55293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross#define VENDOR_ID_BYD           0x1D91
56293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross// Compal's USB Vendor ID
57fd18127eb7f1b900beb72be35bbe9163bf95995aherman_lin#define VENDOR_ID_COMPAL        0x04B7
58fd18127eb7f1b900beb72be35bbe9163bf95995aherman_lin// Compalcomm's USB Vendor ID
59fd18127eb7f1b900beb72be35bbe9163bf95995aherman_lin#define VENDOR_ID_COMPALCOMM    0x1219
60293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross// Dell's USB Vendor ID
61293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross#define VENDOR_ID_DELL          0x413c
62293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross// ECS's USB Vendor ID
63293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross#define VENDOR_ID_ECS           0x03fc
64fdd189c64ee5afe01f11072255a44fe57b965f57DanielMo// EMERGING_TECH's USB Vendor ID
65fdd189c64ee5afe01f11072255a44fe57b965f57DanielMo#define VENDOR_ID_EMERGING_TECH 0x297F
666e39bace17ef089beb143f6324807b9d33df366cJon Sawyer// Emerson's USB Vendor ID
676e39bace17ef089beb143f6324807b9d33df366cJon Sawyer#define VENDOR_ID_EMERSON       0x2207
68293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross// Foxconn's USB Vendor ID
69293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross#define VENDOR_ID_FOXCONN       0x0489
70293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross// Fujitsu's USB Vendor ID
71293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross#define VENDOR_ID_FUJITSU       0x04C5
72cbe19cec6192837582906d885dafe1945d6a7f4cXavier Ducrohet// Funai's USB Vendor ID
73cbe19cec6192837582906d885dafe1945d6a7f4cXavier Ducrohet#define VENDOR_ID_FUNAI         0x0F1C
74293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross// Garmin-Asus's USB Vendor ID
75293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross#define VENDOR_ID_GARMIN_ASUS   0x091E
767a5c1463ba386fd14e97c9fb4e058129763b60c1Joe Bass// Gigabyte's USB Vendor ID
777a5c1463ba386fd14e97c9fb4e058129763b60c1Joe Bass#define VENDOR_ID_GIGABYTE      0x0414
78319d8c1d1f5e11e971125bb244e9afca25bce592Volker Moesker// Gigaset's USB Vendor ID
79319d8c1d1f5e11e971125bb244e9afca25bce592Volker Moesker#define VENDOR_ID_GIGASET       0x1E85
804f8d3be3b2a78813a0769ec787a29789c27cf21exuefeng cai// GIONEE's USB Vendor ID
814f8d3be3b2a78813a0769ec787a29789c27cf21exuefeng cai#define VENDOR_ID_GIONEE        0x271D
82293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross// Google's USB Vendor ID
83293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross#define VENDOR_ID_GOOGLE        0x18d1
84293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross// Haier's USB Vendor ID
85293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross#define VENDOR_ID_HAIER         0x201E
86293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross// Harris's USB Vendor ID
87293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross#define VENDOR_ID_HARRIS        0x19A5
88293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross// Hisense's USB Vendor ID
89293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross#define VENDOR_ID_HISENSE       0x109b
908c4c8e8988411449ecb2f50c25d3e4188e81e7c0DanielMo// Honeywell's USB Vendor ID
918c4c8e8988411449ecb2f50c25d3e4188e81e7c0DanielMo#define VENDOR_ID_HONEYWELL     0x0c2e
925ff167ca1121a2d598aa7564449950076f42a5caJon Sawyer// HP's USB Vendor ID
935ff167ca1121a2d598aa7564449950076f42a5caJon Sawyer#define VENDOR_ID_HP            0x03f0
94293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross// HTC's USB Vendor ID
95293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross#define VENDOR_ID_HTC           0x0bb4
96293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross// Huawei's USB Vendor ID
97293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross#define VENDOR_ID_HUAWEI        0x12D1
98293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross// INQ Mobile's USB Vendor ID
99293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross#define VENDOR_ID_INQ_MOBILE    0x2314
100293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross// Intel's USB Vendor ID
101293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross#define VENDOR_ID_INTEL         0x8087
1022b6612ff96eaf4ad5debda7af5d2a9bdb04c417dDanielMo// Intermec's USB Vendor ID
1032b6612ff96eaf4ad5debda7af5d2a9bdb04c417dDanielMo#define VENDOR_ID_INTERMEC      0x067e
104292e86230ee0eabb9c9bed902bc3b3941437341dMike Lockwood// IRiver's USB Vendor ID
105292e86230ee0eabb9c9bed902bc3b3941437341dMike Lockwood#define VENDOR_ID_IRIVER        0x2420
106aa61854645ffed8595507463820e81aa0aa8f2fdMike Lockwood// K-Touch's USB Vendor ID
107aa61854645ffed8595507463820e81aa0aa8f2fdMike Lockwood#define VENDOR_ID_K_TOUCH       0x24E3
108293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross// KT Tech's USB Vendor ID
109293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross#define VENDOR_ID_KT_TECH       0x2116
110293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross// Kobo's USB Vendor ID
111293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross#define VENDOR_ID_KOBO          0x2237
112293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross// Kyocera's USB Vendor ID
113293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross#define VENDOR_ID_KYOCERA       0x0482
114293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross// Lab126's USB Vendor ID
115293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross#define VENDOR_ID_LAB126        0x1949
116293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross// Lenovo's USB Vendor ID
117293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross#define VENDOR_ID_LENOVO        0x17EF
118293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross// LenovoMobile's USB Vendor ID
119293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross#define VENDOR_ID_LENOVOMOBILE  0x2006
120293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross// LG's USB Vendor ID
121293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross#define VENDOR_ID_LGE           0x1004
122293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross// Lumigon's USB Vendor ID
123293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross#define VENDOR_ID_LUMIGON       0x25E3
124293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross// Motorola's USB Vendor ID
125293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross#define VENDOR_ID_MOTOROLA      0x22b8
126293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross// MSI's USB Vendor ID
127293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross#define VENDOR_ID_MSI           0x0DB0
128293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross// MTK's USB Vendor ID
129293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross#define VENDOR_ID_MTK           0x0e8d
130293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross// NEC's USB Vendor ID
131293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross#define VENDOR_ID_NEC           0x0409
132293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross// B&N Nook's USB Vendor ID
133293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross#define VENDOR_ID_NOOK          0x2080
134293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross// Nvidia's USB Vendor ID
135293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross#define VENDOR_ID_NVIDIA        0x0955
136293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross// OPPO's USB Vendor ID
137293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross#define VENDOR_ID_OPPO          0x22D9
138293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross// On-The-Go-Video's USB Vendor ID
139293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross#define VENDOR_ID_OTGV          0x2257
140293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross// OUYA's USB Vendor ID
141293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross#define VENDOR_ID_OUYA          0x2836
142293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross// Pantech's USB Vendor ID
143293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross#define VENDOR_ID_PANTECH       0x10A9
144aa61854645ffed8595507463820e81aa0aa8f2fdMike Lockwood// Pegatron's USB Vendor ID
145aa61854645ffed8595507463820e81aa0aa8f2fdMike Lockwood#define VENDOR_ID_PEGATRON      0x1D4D
146293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross// Philips's USB Vendor ID
147293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross#define VENDOR_ID_PHILIPS       0x0471
148293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross// Panasonic Mobile Communication's USB Vendor ID
149293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross#define VENDOR_ID_PMC           0x04DA
150dd52e8c57b5026f70a3ec390d2f9a7809ebd2d85Xavier Ducrohet// Positivo's USB Vendor ID
151dd52e8c57b5026f70a3ec390d2f9a7809ebd2d85Xavier Ducrohet#define VENDOR_ID_POSITIVO      0x1662
15276b526a2cad8f42717c48ad5d451dfc09d5a6d6fDanielMo// Prestigio's USB Vendor ID
15376b526a2cad8f42717c48ad5d451dfc09d5a6d6fDanielMo#define VENDOR_ID_PRESTIGIO     0x29e4
154293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross// Qisda's USB Vendor ID
155293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross#define VENDOR_ID_QISDA         0x1D45
156293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross// Qualcomm's USB Vendor ID
157293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross#define VENDOR_ID_QUALCOMM      0x05c6
158746f3243f6d30ab51a36dcfea76eac3ba29ac625Xavier Ducrohet// Quanta's USB Vendor ID
159746f3243f6d30ab51a36dcfea76eac3ba29ac625Xavier Ducrohet#define VENDOR_ID_QUANTA        0x0408
160d0057c006b5bdfec6e6322d2b80a985a6359d8f3DanielMo// Rockchip's USB Vendor ID
161d0057c006b5bdfec6e6322d2b80a985a6359d8f3DanielMo#define VENDOR_ID_ROCKCHIP      0x2207
162293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross// Samsung's USB Vendor ID
163293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross#define VENDOR_ID_SAMSUNG       0x04e8
164293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross// Sharp's USB Vendor ID
165293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross#define VENDOR_ID_SHARP         0x04dd
166293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross// SK Telesys's USB Vendor ID
167293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross#define VENDOR_ID_SK_TELESYS    0x1F53
168ae1f0094309b9bad62ff7de32820c78f66f2c07aBao Haojun// Smartisan's USB Vendor ID
169ae1f0094309b9bad62ff7de32820c78f66f2c07aBao Haojun#define VENDOR_ID_SMARTISAN     0x29a9
170746f3243f6d30ab51a36dcfea76eac3ba29ac625Xavier Ducrohet// Sony's USB Vendor ID
171746f3243f6d30ab51a36dcfea76eac3ba29ac625Xavier Ducrohet#define VENDOR_ID_SONY          0x054C
172293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross// Sony Ericsson's USB Vendor ID
173293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross#define VENDOR_ID_SONY_ERICSSON 0x0FCE
174293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross// T & A Mobile Phones' USB Vendor ID
175293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross#define VENDOR_ID_T_AND_A       0x1BBB
176402c2b98889e02a9b558b02a0bc28bd85fb36b31DanielMo// TechFaith's USB Vendor ID
177402c2b98889e02a9b558b02a0bc28bd85fb36b31DanielMo#define VENDOR_ID_TECHFAITH     0x1d09
178d1e39491f063626e026304ba8abe084cc43c94daXavier Ducrohet// Teleepoch's USB Vendor ID
179d1e39491f063626e026304ba8abe084cc43c94daXavier Ducrohet#define VENDOR_ID_TELEEPOCH     0x2340
180293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross// Texas Instruments's USB Vendor ID
181293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross#define VENDOR_ID_TI            0x0451
182293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross// Toshiba's USB Vendor ID
183293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross#define VENDOR_ID_TOSHIBA       0x0930
18456266c75e2089500c30fcbc97f0d46df47f87f00Wing Tseng// Unowhy's USB Vendor ID
18556266c75e2089500c30fcbc97f0d46df47f87f00Wing Tseng#define VENDOR_ID_UNOWHY        0x2A49
186293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross// Vizio's USB Vendor ID
187293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross#define VENDOR_ID_VIZIO         0xE040
18864a602942e159c73ceee5c584064f364137d1f47Wing Tseng// Wacom's USB Vendor ID
18964a602942e159c73ceee5c584064f364137d1f47Wing Tseng#define VENDOR_ID_WACOM         0x0531
190293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross// Xiaomi's USB Vendor ID
191293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross#define VENDOR_ID_XIAOMI        0x2717
192c1b6b153dc7c535294a63a215a018d0824813757DanielMo// YotaDevices's USB Vendor ID
193c1b6b153dc7c535294a63a215a018d0824813757DanielMo#define VENDOR_ID_YOTADEVICES   0x2916
194293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross// Yulong Coolpad's USB Vendor ID
195293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross#define VENDOR_ID_YULONG_COOLPAD 0x1EBF
196293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross// ZTE's USB Vendor ID
197293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross#define VENDOR_ID_ZTE           0x19D2
198293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross/* Keep the list above sorted alphabetically by #define name */
199293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross
200a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet/** built-in vendor list */
201293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross/* Keep the list below sorted alphabetically */
202a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohetint builtInVendorIds[] = {
2037953b89e8d68565d15791618146a712231683d09Robert CH Chou    VENDOR_ID_ACER,
20463f0f5117bb8ca781a8d9c9a66f5cba755e6005eDanielMo    VENDOR_ID_ALLWINNER,
205d5dab6d5f85e7c03f08614918088a33ce73abcf5DanielMo    VENDOR_ID_AMLOGIC,
206293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross    VENDOR_ID_ANYDATA,
207293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross    VENDOR_ID_ARCHOS,
20889aff1d22662c64cc2de384e7e2c699e4d1d5d47Xavier Ducrohet    VENDOR_ID_ASUS,
209293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross    VENDOR_ID_BYD,
210293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross    VENDOR_ID_COMPAL,
211fd18127eb7f1b900beb72be35bbe9163bf95995aherman_lin    VENDOR_ID_COMPALCOMM,
212293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross    VENDOR_ID_DELL,
213293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross    VENDOR_ID_ECS,
214fdd189c64ee5afe01f11072255a44fe57b965f57DanielMo    VENDOR_ID_EMERGING_TECH,
2156e39bace17ef089beb143f6324807b9d33df366cJon Sawyer    VENDOR_ID_EMERSON,
216293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross    VENDOR_ID_FOXCONN,
217293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross    VENDOR_ID_FUJITSU,
218cbe19cec6192837582906d885dafe1945d6a7f4cXavier Ducrohet    VENDOR_ID_FUNAI,
219293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross    VENDOR_ID_GARMIN_ASUS,
2207a5c1463ba386fd14e97c9fb4e058129763b60c1Joe Bass    VENDOR_ID_GIGABYTE,
221319d8c1d1f5e11e971125bb244e9afca25bce592Volker Moesker    VENDOR_ID_GIGASET,
2224f8d3be3b2a78813a0769ec787a29789c27cf21exuefeng cai    VENDOR_ID_GIONEE,
223293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross    VENDOR_ID_GOOGLE,
224293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross    VENDOR_ID_HAIER,
225293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross    VENDOR_ID_HARRIS,
226293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross    VENDOR_ID_HISENSE,
2278c4c8e8988411449ecb2f50c25d3e4188e81e7c0DanielMo    VENDOR_ID_HONEYWELL,
2285ff167ca1121a2d598aa7564449950076f42a5caJon Sawyer    VENDOR_ID_HP,
229293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross    VENDOR_ID_HTC,
230293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross    VENDOR_ID_HUAWEI,
231293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross    VENDOR_ID_INQ_MOBILE,
232293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross    VENDOR_ID_INTEL,
2332b6612ff96eaf4ad5debda7af5d2a9bdb04c417dDanielMo    VENDOR_ID_INTERMEC,
234292e86230ee0eabb9c9bed902bc3b3941437341dMike Lockwood    VENDOR_ID_IRIVER,
235293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross    VENDOR_ID_KOBO,
236aa61854645ffed8595507463820e81aa0aa8f2fdMike Lockwood    VENDOR_ID_K_TOUCH,
237293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross    VENDOR_ID_KT_TECH,
238293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross    VENDOR_ID_KYOCERA,
239293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross    VENDOR_ID_LAB126,
240293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross    VENDOR_ID_LENOVO,
241293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross    VENDOR_ID_LENOVOMOBILE,
242293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross    VENDOR_ID_LGE,
243293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross    VENDOR_ID_LUMIGON,
244293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross    VENDOR_ID_MOTOROLA,
245293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross    VENDOR_ID_MSI,
246293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross    VENDOR_ID_MTK,
247293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross    VENDOR_ID_NEC,
248293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross    VENDOR_ID_NOOK,
249293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross    VENDOR_ID_NVIDIA,
250293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross    VENDOR_ID_OPPO,
251293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross    VENDOR_ID_OTGV,
252293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross    VENDOR_ID_OUYA,
253293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross    VENDOR_ID_PANTECH,
254aa61854645ffed8595507463820e81aa0aa8f2fdMike Lockwood    VENDOR_ID_PEGATRON,
255293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross    VENDOR_ID_PHILIPS,
256293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross    VENDOR_ID_PMC,
257dd52e8c57b5026f70a3ec390d2f9a7809ebd2d85Xavier Ducrohet    VENDOR_ID_POSITIVO,
25876b526a2cad8f42717c48ad5d451dfc09d5a6d6fDanielMo    VENDOR_ID_PRESTIGIO,
259293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross    VENDOR_ID_QISDA,
260293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross    VENDOR_ID_QUALCOMM,
261746f3243f6d30ab51a36dcfea76eac3ba29ac625Xavier Ducrohet    VENDOR_ID_QUANTA,
262d0057c006b5bdfec6e6322d2b80a985a6359d8f3DanielMo    VENDOR_ID_ROCKCHIP,
263293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross    VENDOR_ID_SAMSUNG,
264293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross    VENDOR_ID_SHARP,
265293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross    VENDOR_ID_SK_TELESYS,
266ae1f0094309b9bad62ff7de32820c78f66f2c07aBao Haojun    VENDOR_ID_SMARTISAN,
267746f3243f6d30ab51a36dcfea76eac3ba29ac625Xavier Ducrohet    VENDOR_ID_SONY,
268293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross    VENDOR_ID_SONY_ERICSSON,
269293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross    VENDOR_ID_T_AND_A,
270402c2b98889e02a9b558b02a0bc28bd85fb36b31DanielMo    VENDOR_ID_TECHFAITH,
271d1e39491f063626e026304ba8abe084cc43c94daXavier Ducrohet    VENDOR_ID_TELEEPOCH,
272293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross    VENDOR_ID_TI,
273293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross    VENDOR_ID_TOSHIBA,
27456266c75e2089500c30fcbc97f0d46df47f87f00Wing Tseng    VENDOR_ID_UNOWHY,
275293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross    VENDOR_ID_VIZIO,
27664a602942e159c73ceee5c584064f364137d1f47Wing Tseng    VENDOR_ID_WACOM,
277293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross    VENDOR_ID_XIAOMI,
278c1b6b153dc7c535294a63a215a018d0824813757DanielMo    VENDOR_ID_YOTADEVICES,
279293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross    VENDOR_ID_YULONG_COOLPAD,
280293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross    VENDOR_ID_ZTE,
281a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet};
282293717c364f325c1b60a28fa5913cec0a99ba03dColin Cross/* Keep the list above sorted alphabetically */
283a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet
284a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet#define BUILT_IN_VENDOR_COUNT    (sizeof(builtInVendorIds)/sizeof(builtInVendorIds[0]))
285a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet
286a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet/* max number of supported vendor ids (built-in + 3rd party). increase as needed */
287a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet#define VENDOR_COUNT_MAX         128
288a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet
289a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohetint vendorIds[VENDOR_COUNT_MAX];
290a09fbd164d2e088bc5433d310e25640ae048d47dXavier Ducrohetunsigned vendorIdCount = 0;
291a09fbd164d2e088bc5433d310e25640ae048d47dXavier Ducrohet
292a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohetint get_adb_usb_ini(char* buff, size_t len);
293a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet
294a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohetvoid usb_vendors_init(void)
295a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet{
296a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet    if (VENDOR_COUNT_MAX < BUILT_IN_VENDOR_COUNT) {
297a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet        fprintf(stderr, "VENDOR_COUNT_MAX not big enough for built-in vendor list.\n");
298a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet        exit(2);
299a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet    }
300a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet
301a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet    /* add the built-in vendors at the beginning of the array */
302a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet    memcpy(vendorIds, builtInVendorIds, sizeof(builtInVendorIds));
303a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet
304a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet    /* default array size is the number of built-in vendors */
305a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet    vendorIdCount = BUILT_IN_VENDOR_COUNT;
306a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet
307a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet    if (VENDOR_COUNT_MAX == BUILT_IN_VENDOR_COUNT)
308a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet        return;
309a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet
310a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet    char temp[PATH_MAX];
311a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet    if (get_adb_usb_ini(temp, sizeof(temp)) == 0) {
312a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet        FILE * f = fopen(temp, "rt");
313a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet
314a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet        if (f != NULL) {
315a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet            /* The vendor id file is pretty basic. 1 vendor id per line.
316a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet               Lines starting with # are comments */
317a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet            while (fgets(temp, sizeof(temp), f) != NULL) {
318a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet                if (temp[0] == '#')
319a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet                    continue;
320a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet
321a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet                long value = strtol(temp, NULL, 0);
322a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet                if (errno == EINVAL || errno == ERANGE || value > INT_MAX || value < 0) {
323a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet                    fprintf(stderr, "Invalid content in %s. Quitting.\n", ANDROID_ADB_INI);
324a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet                    exit(2);
325a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet                }
326a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet
327a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet                vendorIds[vendorIdCount++] = (int)value;
328a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet
329a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet                /* make sure we don't go beyond the array */
330a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet                if (vendorIdCount == VENDOR_COUNT_MAX) {
331a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet                    break;
332a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet                }
333a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet            }
33460529e39bb5d5c1a797394fe78201c0454080ee4Chris Dearman            fclose(f);
335a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet        }
336a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet    }
337a09fbd164d2e088bc5433d310e25640ae048d47dXavier Ducrohet}
338a09fbd164d2e088bc5433d310e25640ae048d47dXavier Ducrohet
339a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet/* Utils methods */
340a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet
341a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet/* builds the path to the adb vendor id file. returns 0 if success */
342a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohetint build_path(char* buff, size_t len, const char* format, const char* home)
343a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet{
344eb558b9240743e24c87796191f54c99890641b14Michael Richardson    if (snprintf(buff, len, format, home, ANDROID_PATH, ANDROID_ADB_INI) >= (signed)len) {
345a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet        return 1;
346a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet    }
347a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet
348a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet    return 0;
349a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet}
350a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet
351a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet/* fills buff with the path to the adb vendor id file. returns 0 if success */
352a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohetint get_adb_usb_ini(char* buff, size_t len)
353a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet{
354a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet#ifdef _WIN32
355a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet    const char* home = getenv("ANDROID_SDK_HOME");
356a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet    if (home != NULL) {
357a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet        return build_path(buff, len, "%s\\%s\\%s", home);
358a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet    } else {
359a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet        char path[MAX_PATH];
360a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet        SHGetFolderPath( NULL, CSIDL_PROFILE, NULL, 0, path);
361a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet        return build_path(buff, len, "%s\\%s\\%s", path);
362a09fbd164d2e088bc5433d310e25640ae048d47dXavier Ducrohet    }
363a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet#else
364a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet    const char* home = getenv("HOME");
365a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet    if (home == NULL)
366a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet        home = "/tmp";
367a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet
368a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet    return build_path(buff, len, "%s/%s/%s", home);
369a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet#endif
370a09fbd164d2e088bc5433d310e25640ae048d47dXavier Ducrohet}
371