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>
20a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet
21a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet#ifdef _WIN32
22a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet#  define WIN32_LEAN_AND_MEAN
23a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet#  include "windows.h"
24a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet#  include "shlobj.h"
25a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet#else
26a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet#  include <unistd.h>
27a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet#  include <sys/stat.h>
28a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet#endif
29a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet
30a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet#include "sysdeps.h"
31a09fbd164d2e088bc5433d310e25640ae048d47dXavier Ducrohet#include "adb.h"
32a09fbd164d2e088bc5433d310e25640ae048d47dXavier Ducrohet
33a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet#define ANDROID_PATH            ".android"
34a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet#define ANDROID_ADB_INI         "adb_usb.ini"
35a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet
36a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet#define TRACE_TAG               TRACE_USB
37a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet
38a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet// Google's USB Vendor ID
39a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet#define VENDOR_ID_GOOGLE        0x18d1
40f60e8638282d66c108f1e1dea030856312f65892Wu, Hao// Intel's USB Vendor ID
41f60e8638282d66c108f1e1dea030856312f65892Wu, Hao#define VENDOR_ID_INTEL         0x8087
42a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet// HTC's USB Vendor ID
43a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet#define VENDOR_ID_HTC           0x0bb4
44de6f62a609120c3d9e4e53689c3b309842ec874bXavier Ducrohet// Samsung's USB Vendor ID
45de6f62a609120c3d9e4e53689c3b309842ec874bXavier Ducrohet#define VENDOR_ID_SAMSUNG       0x04e8
46de6f62a609120c3d9e4e53689c3b309842ec874bXavier Ducrohet// Motorola's USB Vendor ID
47de6f62a609120c3d9e4e53689c3b309842ec874bXavier Ducrohet#define VENDOR_ID_MOTOROLA      0x22b8
486ae9256322053354c7d2badccc0ce5c24b37c243Mike Lockwood// LG's USB Vendor ID
496ae9256322053354c7d2badccc0ce5c24b37c243Mike Lockwood#define VENDOR_ID_LGE           0x1004
506ae9256322053354c7d2badccc0ce5c24b37c243Mike Lockwood// Huawei's USB Vendor ID
516ae9256322053354c7d2badccc0ce5c24b37c243Mike Lockwood#define VENDOR_ID_HUAWEI        0x12D1
527953b89e8d68565d15791618146a712231683d09Robert CH Chou// Acer's USB Vendor ID
537953b89e8d68565d15791618146a712231683d09Robert CH Chou#define VENDOR_ID_ACER          0x0502
5423433b93d1acb01650c9480d9bb5d5d869ba4f79Xavier Ducrohet// Sony Ericsson's USB Vendor ID
5523433b93d1acb01650c9480d9bb5d5d869ba4f79Xavier Ducrohet#define VENDOR_ID_SONY_ERICSSON 0x0FCE
566170404867631317ab57c67bf074494e6e775556Mike Lockwood// Foxconn's USB Vendor ID
576170404867631317ab57c67bf074494e6e775556Mike Lockwood#define VENDOR_ID_FOXCONN       0x0489
5837ddce736ce7700ee1e120f7371e6ee6a526f3caMike Lockwood// Dell's USB Vendor ID
5937ddce736ce7700ee1e120f7371e6ee6a526f3caMike Lockwood#define VENDOR_ID_DELL          0x413c
606ac5e192997478ae166981ddf66136c865d21a40Erik Gilling// Nvidia's USB Vendor ID
616ac5e192997478ae166981ddf66136c865d21a40Erik Gilling#define VENDOR_ID_NVIDIA        0x0955
621873adc2b12d5a9045bae90650bb331c7c7aa3c7Raphael// Garmin-Asus's USB Vendor ID
631873adc2b12d5a9045bae90650bb331c7c7aa3c7Raphael#define VENDOR_ID_GARMIN_ASUS   0x091E
64123331adeaed6c54e4869b0fd7001c5f1b19bdc4Takeshi Kishimoto// Sharp's USB Vendor ID
65123331adeaed6c54e4869b0fd7001c5f1b19bdc4Takeshi Kishimoto#define VENDOR_ID_SHARP         0x04dd
6601512aa3b0e3709e97054ffd1ff265a2d4193646Takeshi Kishimoto// ZTE's USB Vendor ID
6701512aa3b0e3709e97054ffd1ff265a2d4193646Takeshi Kishimoto#define VENDOR_ID_ZTE           0x19D2
688d2f91db21271a253bfe1bbe7716ff59e88572bdTakeshi Kishimoto// Kyocera's USB Vendor ID
698d2f91db21271a253bfe1bbe7716ff59e88572bdTakeshi Kishimoto#define VENDOR_ID_KYOCERA       0x0482
707c19bbe086b3cd81499829c0a79ed0ed0ae4fb16Xavier Ducrohet// Pantech's USB Vendor ID
717c19bbe086b3cd81499829c0a79ed0ed0ae4fb16Xavier Ducrohet#define VENDOR_ID_PANTECH       0x10A9
727f2ad58a6d9cb70da934825a7648a5d3f8cbc498Dima Zavin// Qualcomm's USB Vendor ID
737f2ad58a6d9cb70da934825a7648a5d3f8cbc498Dima Zavin#define VENDOR_ID_QUALCOMM      0x05c6
7483cb93b4016cbd6029a2d215a7b63fa716b103e4Michael Richardson// On-The-Go-Video's USB Vendor ID
7583cb93b4016cbd6029a2d215a7b63fa716b103e4Michael Richardson#define VENDOR_ID_OTGV          0x2257
762124afeee1f19423e71c52ede6f4926f5389e917Takeshi Kishimoto// NEC's USB Vendor ID
772124afeee1f19423e71c52ede6f4926f5389e917Takeshi Kishimoto#define VENDOR_ID_NEC           0x0409
782124afeee1f19423e71c52ede6f4926f5389e917Takeshi Kishimoto// Panasonic Mobile Communication's USB Vendor ID
792124afeee1f19423e71c52ede6f4926f5389e917Takeshi Kishimoto#define VENDOR_ID_PMC           0x04DA
8029837f94b56c3eeaf39f447507324ecdb207ba96Takeshi Kishimoto// Toshiba's USB Vendor ID
8129837f94b56c3eeaf39f447507324ecdb207ba96Takeshi Kishimoto#define VENDOR_ID_TOSHIBA       0x0930
82f62b23f2c1540221621024c850fdf615dda0c903Xavier Ducrohet// SK Telesys's USB Vendor ID
83f62b23f2c1540221621024c850fdf615dda0c903Xavier Ducrohet#define VENDOR_ID_SK_TELESYS    0x1F53
84f62b23f2c1540221621024c850fdf615dda0c903Xavier Ducrohet// KT Tech's USB Vendor ID
856c2636947c43c2950488d8d82bfc691cb907518dXavier Ducrohet#define VENDOR_ID_KT_TECH       0x2116
8689aff1d22662c64cc2de384e7e2c699e4d1d5d47Xavier Ducrohet// Asus's USB Vendor ID
8789aff1d22662c64cc2de384e7e2c699e4d1d5d47Xavier Ducrohet#define VENDOR_ID_ASUS          0x0b05
88d02e521d79a49471b3f1dc3717e842948df64789Mike Lockwood// Philips's USB Vendor ID
89d02e521d79a49471b3f1dc3717e842948df64789Mike Lockwood#define VENDOR_ID_PHILIPS       0x0471
901d3fbed34897e36ed0b55c68fe6b0a7f2dd2ec8eAlex Sakhartchouk// Texas Instruments's USB Vendor ID
911d3fbed34897e36ed0b55c68fe6b0a7f2dd2ec8eAlex Sakhartchouk#define VENDOR_ID_TI            0x0451
92cbe19cec6192837582906d885dafe1945d6a7f4cXavier Ducrohet// Funai's USB Vendor ID
93cbe19cec6192837582906d885dafe1945d6a7f4cXavier Ducrohet#define VENDOR_ID_FUNAI         0x0F1C
947a5c1463ba386fd14e97c9fb4e058129763b60c1Joe Bass// Gigabyte's USB Vendor ID
957a5c1463ba386fd14e97c9fb4e058129763b60c1Joe Bass#define VENDOR_ID_GIGABYTE      0x0414
96292e86230ee0eabb9c9bed902bc3b3941437341dMike Lockwood// IRiver's USB Vendor ID
97292e86230ee0eabb9c9bed902bc3b3941437341dMike Lockwood#define VENDOR_ID_IRIVER        0x2420
98292e86230ee0eabb9c9bed902bc3b3941437341dMike Lockwood// Compal's USB Vendor ID
99292e86230ee0eabb9c9bed902bc3b3941437341dMike Lockwood#define VENDOR_ID_COMPAL        0x1219
100292e86230ee0eabb9c9bed902bc3b3941437341dMike Lockwood// T & A Mobile Phones' USB Vendor ID
101292e86230ee0eabb9c9bed902bc3b3941437341dMike Lockwood#define VENDOR_ID_T_AND_A       0x1BBB
102c11f99f40a200f5cdb4bdaedc18fddbc4324189czhangclb// LenovoMobile's USB Vendor ID
103dd52e8c57b5026f70a3ec390d2f9a7809ebd2d85Xavier Ducrohet#define VENDOR_ID_LENOVOMOBILE  0x2006
1047c17d0932c676d75ac0ff42b1917a02127ee554eMike Lockwood// Lenovo's USB Vendor ID
105c11f99f40a200f5cdb4bdaedc18fddbc4324189czhangclb#define VENDOR_ID_LENOVO        0x17EF
106fb34e98bdd36717a1df5a2be4de288c5e08c9b78Mike Lockwood// Vizio's USB Vendor ID
107fb34e98bdd36717a1df5a2be4de288c5e08c9b78Mike Lockwood#define VENDOR_ID_VIZIO         0xE040
108aa61854645ffed8595507463820e81aa0aa8f2fdMike Lockwood// K-Touch's USB Vendor ID
109aa61854645ffed8595507463820e81aa0aa8f2fdMike Lockwood#define VENDOR_ID_K_TOUCH       0x24E3
110aa61854645ffed8595507463820e81aa0aa8f2fdMike Lockwood// Pegatron's USB Vendor ID
111aa61854645ffed8595507463820e81aa0aa8f2fdMike Lockwood#define VENDOR_ID_PEGATRON      0x1D4D
112aa61854645ffed8595507463820e81aa0aa8f2fdMike Lockwood// Archos's USB Vendor ID
113aa61854645ffed8595507463820e81aa0aa8f2fdMike Lockwood#define VENDOR_ID_ARCHOS        0x0E79
114dd52e8c57b5026f70a3ec390d2f9a7809ebd2d85Xavier Ducrohet// Positivo's USB Vendor ID
115dd52e8c57b5026f70a3ec390d2f9a7809ebd2d85Xavier Ducrohet#define VENDOR_ID_POSITIVO      0x1662
11607ad9f2a127b2836c7d45a503a5f3ef7517218f3Xavier Ducrohet// Fujitsu's USB Vendor ID
11707ad9f2a127b2836c7d45a503a5f3ef7517218f3Xavier Ducrohet#define VENDOR_ID_FUJITSU       0x04C5
11807ad9f2a127b2836c7d45a503a5f3ef7517218f3Xavier Ducrohet// Lumigon's USB Vendor ID
11907ad9f2a127b2836c7d45a503a5f3ef7517218f3Xavier Ducrohet#define VENDOR_ID_LUMIGON       0x25E3
120746f3243f6d30ab51a36dcfea76eac3ba29ac625Xavier Ducrohet// Quanta's USB Vendor ID
121746f3243f6d30ab51a36dcfea76eac3ba29ac625Xavier Ducrohet#define VENDOR_ID_QUANTA        0x0408
122746f3243f6d30ab51a36dcfea76eac3ba29ac625Xavier Ducrohet// INQ Mobile's USB Vendor ID
123746f3243f6d30ab51a36dcfea76eac3ba29ac625Xavier Ducrohet#define VENDOR_ID_INQ_MOBILE    0x2314
124746f3243f6d30ab51a36dcfea76eac3ba29ac625Xavier Ducrohet// Sony's USB Vendor ID
125746f3243f6d30ab51a36dcfea76eac3ba29ac625Xavier Ducrohet#define VENDOR_ID_SONY          0x054C
126775ab9c99eb513efecb6390b58bbcec80555eef8Jon Sawyer// Lab126's USB Vendor ID
127775ab9c99eb513efecb6390b58bbcec80555eef8Jon Sawyer#define VENDOR_ID_LAB126        0x1949
128246808bedfb35ce8abd6cee434ff5b07a6618e8aXavier Ducrohet// Yulong Coolpad's USB Vendor ID
129246808bedfb35ce8abd6cee434ff5b07a6618e8aXavier Ducrohet#define VENDOR_ID_YULONG_COOLPAD 0x1EBF
130f53aff69487f2c36f0fa28ed8ce46ee53db662a5Dan Zhang// Kobo's USB Vendor ID
131f53aff69487f2c36f0fa28ed8ce46ee53db662a5Dan Zhang#define VENDOR_ID_KOBO          0x2237
132d1e39491f063626e026304ba8abe084cc43c94daXavier Ducrohet// Teleepoch's USB Vendor ID
133d1e39491f063626e026304ba8abe084cc43c94daXavier Ducrohet#define VENDOR_ID_TELEEPOCH     0x2340
134df6d7666fd44e9903944202bcb4a8da6e8064a1dSam Lin// AnyDATA's USB Vendor ID
135df6d7666fd44e9903944202bcb4a8da6e8064a1dSam Lin#define VENDOR_ID_ANYDATA       0x16D5
136df6d7666fd44e9903944202bcb4a8da6e8064a1dSam Lin// Harris's USB Vendor ID
137df6d7666fd44e9903944202bcb4a8da6e8064a1dSam Lin#define VENDOR_ID_HARRIS        0x19A5
138df6d7666fd44e9903944202bcb4a8da6e8064a1dSam Lin// OPPO's USB Vendor ID
139df6d7666fd44e9903944202bcb4a8da6e8064a1dSam Lin#define VENDOR_ID_OPPO          0x22D9
140d3b69404a1497cef235574a97e45867686f4c155Gary Hua// Xiaomi's USB Vendor ID
141d3b69404a1497cef235574a97e45867686f4c155Gary Hua#define VENDOR_ID_XIAOMI        0x2717
14292eb5838336d52b415472a9a9df703a99328b194sunxiaoqi// BYD's USB Vendor ID
14392eb5838336d52b415472a9a9df703a99328b194sunxiaoqi#define VENDOR_ID_BYD           0x19D1
14421ec0516cf0fb6b5a849ca8f47258554a99e386cAl Sutton// OUYA's USB Vendor ID
14521ec0516cf0fb6b5a849ca8f47258554a99e386cAl Sutton#define VENDOR_ID_OUYA          0x2836
14671150ce4efdaba3d60cb39ed085b3476969ab95eJeff Smith// Haier's USB Vendor ID
14771150ce4efdaba3d60cb39ed085b3476969ab95eJeff Smith#define VENDOR_ID_HAIER         0x201E
14871150ce4efdaba3d60cb39ed085b3476969ab95eJeff Smith// Hisense's USB Vendor ID
14971150ce4efdaba3d60cb39ed085b3476969ab95eJeff Smith#define VENDOR_ID_HISENSE       0x109b
15071150ce4efdaba3d60cb39ed085b3476969ab95eJeff Smith// MTK's USB Vendor ID
15171150ce4efdaba3d60cb39ed085b3476969ab95eJeff Smith#define VENDOR_ID_MTK           0x0e8d
15271150ce4efdaba3d60cb39ed085b3476969ab95eJeff Smith// B&N Nook's USB Vendor ID
15371150ce4efdaba3d60cb39ed085b3476969ab95eJeff Smith#define VENDOR_ID_NOOK          0x2080
154001fe87e0228b72bc0c048ecd92f31be023b72e5esther// Qisda's USB Vendor ID
155001fe87e0228b72bc0c048ecd92f31be023b72e5esther#define VENDOR_ID_QISDA         0x1D45
156cae8b9df5c9368cabda380d82f9b6c4903e1e2e5ecsgms// ECS's USB Vendor ID
157cae8b9df5c9368cabda380d82f9b6c4903e1e2e5ecsgms#define VENDOR_ID_ECS           0x03fc
158d1e39491f063626e026304ba8abe084cc43c94daXavier Ducrohet
159a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet
160a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet/** built-in vendor list */
161a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohetint builtInVendorIds[] = {
162a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet    VENDOR_ID_GOOGLE,
163f60e8638282d66c108f1e1dea030856312f65892Wu, Hao    VENDOR_ID_INTEL,
164a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet    VENDOR_ID_HTC,
165de6f62a609120c3d9e4e53689c3b309842ec874bXavier Ducrohet    VENDOR_ID_SAMSUNG,
166de6f62a609120c3d9e4e53689c3b309842ec874bXavier Ducrohet    VENDOR_ID_MOTOROLA,
1676ae9256322053354c7d2badccc0ce5c24b37c243Mike Lockwood    VENDOR_ID_LGE,
1686ae9256322053354c7d2badccc0ce5c24b37c243Mike Lockwood    VENDOR_ID_HUAWEI,
1697953b89e8d68565d15791618146a712231683d09Robert CH Chou    VENDOR_ID_ACER,
17023433b93d1acb01650c9480d9bb5d5d869ba4f79Xavier Ducrohet    VENDOR_ID_SONY_ERICSSON,
1716170404867631317ab57c67bf074494e6e775556Mike Lockwood    VENDOR_ID_FOXCONN,
17237ddce736ce7700ee1e120f7371e6ee6a526f3caMike Lockwood    VENDOR_ID_DELL,
1736ac5e192997478ae166981ddf66136c865d21a40Erik Gilling    VENDOR_ID_NVIDIA,
1741873adc2b12d5a9045bae90650bb331c7c7aa3c7Raphael    VENDOR_ID_GARMIN_ASUS,
175123331adeaed6c54e4869b0fd7001c5f1b19bdc4Takeshi Kishimoto    VENDOR_ID_SHARP,
17601512aa3b0e3709e97054ffd1ff265a2d4193646Takeshi Kishimoto    VENDOR_ID_ZTE,
1778d2f91db21271a253bfe1bbe7716ff59e88572bdTakeshi Kishimoto    VENDOR_ID_KYOCERA,
1787c19bbe086b3cd81499829c0a79ed0ed0ae4fb16Xavier Ducrohet    VENDOR_ID_PANTECH,
1797f2ad58a6d9cb70da934825a7648a5d3f8cbc498Dima Zavin    VENDOR_ID_QUALCOMM,
18083cb93b4016cbd6029a2d215a7b63fa716b103e4Michael Richardson    VENDOR_ID_OTGV,
1812124afeee1f19423e71c52ede6f4926f5389e917Takeshi Kishimoto    VENDOR_ID_NEC,
1822124afeee1f19423e71c52ede6f4926f5389e917Takeshi Kishimoto    VENDOR_ID_PMC,
18329837f94b56c3eeaf39f447507324ecdb207ba96Takeshi Kishimoto    VENDOR_ID_TOSHIBA,
184f62b23f2c1540221621024c850fdf615dda0c903Xavier Ducrohet    VENDOR_ID_SK_TELESYS,
185f62b23f2c1540221621024c850fdf615dda0c903Xavier Ducrohet    VENDOR_ID_KT_TECH,
18689aff1d22662c64cc2de384e7e2c699e4d1d5d47Xavier Ducrohet    VENDOR_ID_ASUS,
187d02e521d79a49471b3f1dc3717e842948df64789Mike Lockwood    VENDOR_ID_PHILIPS,
1881d3fbed34897e36ed0b55c68fe6b0a7f2dd2ec8eAlex Sakhartchouk    VENDOR_ID_TI,
189cbe19cec6192837582906d885dafe1945d6a7f4cXavier Ducrohet    VENDOR_ID_FUNAI,
1907a5c1463ba386fd14e97c9fb4e058129763b60c1Joe Bass    VENDOR_ID_GIGABYTE,
191292e86230ee0eabb9c9bed902bc3b3941437341dMike Lockwood    VENDOR_ID_IRIVER,
192292e86230ee0eabb9c9bed902bc3b3941437341dMike Lockwood    VENDOR_ID_COMPAL,
193292e86230ee0eabb9c9bed902bc3b3941437341dMike Lockwood    VENDOR_ID_T_AND_A,
194c11f99f40a200f5cdb4bdaedc18fddbc4324189czhangclb    VENDOR_ID_LENOVOMOBILE,
1957c17d0932c676d75ac0ff42b1917a02127ee554eMike Lockwood    VENDOR_ID_LENOVO,
196fb34e98bdd36717a1df5a2be4de288c5e08c9b78Mike Lockwood    VENDOR_ID_VIZIO,
197aa61854645ffed8595507463820e81aa0aa8f2fdMike Lockwood    VENDOR_ID_K_TOUCH,
198aa61854645ffed8595507463820e81aa0aa8f2fdMike Lockwood    VENDOR_ID_PEGATRON,
199aa61854645ffed8595507463820e81aa0aa8f2fdMike Lockwood    VENDOR_ID_ARCHOS,
200dd52e8c57b5026f70a3ec390d2f9a7809ebd2d85Xavier Ducrohet    VENDOR_ID_POSITIVO,
20107ad9f2a127b2836c7d45a503a5f3ef7517218f3Xavier Ducrohet    VENDOR_ID_FUJITSU,
20207ad9f2a127b2836c7d45a503a5f3ef7517218f3Xavier Ducrohet    VENDOR_ID_LUMIGON,
203746f3243f6d30ab51a36dcfea76eac3ba29ac625Xavier Ducrohet    VENDOR_ID_QUANTA,
204746f3243f6d30ab51a36dcfea76eac3ba29ac625Xavier Ducrohet    VENDOR_ID_INQ_MOBILE,
205746f3243f6d30ab51a36dcfea76eac3ba29ac625Xavier Ducrohet    VENDOR_ID_SONY,
206775ab9c99eb513efecb6390b58bbcec80555eef8Jon Sawyer    VENDOR_ID_LAB126,
207246808bedfb35ce8abd6cee434ff5b07a6618e8aXavier Ducrohet    VENDOR_ID_YULONG_COOLPAD,
208f53aff69487f2c36f0fa28ed8ce46ee53db662a5Dan Zhang    VENDOR_ID_KOBO,
209d1e39491f063626e026304ba8abe084cc43c94daXavier Ducrohet    VENDOR_ID_TELEEPOCH,
210df6d7666fd44e9903944202bcb4a8da6e8064a1dSam Lin    VENDOR_ID_ANYDATA,
211df6d7666fd44e9903944202bcb4a8da6e8064a1dSam Lin    VENDOR_ID_HARRIS,
212df6d7666fd44e9903944202bcb4a8da6e8064a1dSam Lin    VENDOR_ID_OPPO,
213d3b69404a1497cef235574a97e45867686f4c155Gary Hua    VENDOR_ID_XIAOMI,
21492eb5838336d52b415472a9a9df703a99328b194sunxiaoqi    VENDOR_ID_BYD,
21521ec0516cf0fb6b5a849ca8f47258554a99e386cAl Sutton    VENDOR_ID_OUYA,
21671150ce4efdaba3d60cb39ed085b3476969ab95eJeff Smith    VENDOR_ID_HAIER,
21771150ce4efdaba3d60cb39ed085b3476969ab95eJeff Smith    VENDOR_ID_HISENSE,
21871150ce4efdaba3d60cb39ed085b3476969ab95eJeff Smith    VENDOR_ID_MTK,
21971150ce4efdaba3d60cb39ed085b3476969ab95eJeff Smith    VENDOR_ID_NOOK,
220001fe87e0228b72bc0c048ecd92f31be023b72e5esther    VENDOR_ID_QISDA,
221cae8b9df5c9368cabda380d82f9b6c4903e1e2e5ecsgms    VENDOR_ID_ECS,
222a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet};
223a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet
224a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet#define BUILT_IN_VENDOR_COUNT    (sizeof(builtInVendorIds)/sizeof(builtInVendorIds[0]))
225a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet
226a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet/* max number of supported vendor ids (built-in + 3rd party). increase as needed */
227a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet#define VENDOR_COUNT_MAX         128
228a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet
229a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohetint vendorIds[VENDOR_COUNT_MAX];
230a09fbd164d2e088bc5433d310e25640ae048d47dXavier Ducrohetunsigned vendorIdCount = 0;
231a09fbd164d2e088bc5433d310e25640ae048d47dXavier Ducrohet
232a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohetint get_adb_usb_ini(char* buff, size_t len);
233a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet
234a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohetvoid usb_vendors_init(void)
235a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet{
236a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet    if (VENDOR_COUNT_MAX < BUILT_IN_VENDOR_COUNT) {
237a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet        fprintf(stderr, "VENDOR_COUNT_MAX not big enough for built-in vendor list.\n");
238a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet        exit(2);
239a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet    }
240a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet
241a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet    /* add the built-in vendors at the beginning of the array */
242a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet    memcpy(vendorIds, builtInVendorIds, sizeof(builtInVendorIds));
243a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet
244a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet    /* default array size is the number of built-in vendors */
245a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet    vendorIdCount = BUILT_IN_VENDOR_COUNT;
246a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet
247a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet    if (VENDOR_COUNT_MAX == BUILT_IN_VENDOR_COUNT)
248a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet        return;
249a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet
250a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet    char temp[PATH_MAX];
251a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet    if (get_adb_usb_ini(temp, sizeof(temp)) == 0) {
252a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet        FILE * f = fopen(temp, "rt");
253a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet
254a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet        if (f != NULL) {
255a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet            /* The vendor id file is pretty basic. 1 vendor id per line.
256a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet               Lines starting with # are comments */
257a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet            while (fgets(temp, sizeof(temp), f) != NULL) {
258a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet                if (temp[0] == '#')
259a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet                    continue;
260a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet
261a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet                long value = strtol(temp, NULL, 0);
262a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet                if (errno == EINVAL || errno == ERANGE || value > INT_MAX || value < 0) {
263a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet                    fprintf(stderr, "Invalid content in %s. Quitting.\n", ANDROID_ADB_INI);
264a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet                    exit(2);
265a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet                }
266a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet
267a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet                vendorIds[vendorIdCount++] = (int)value;
268a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet
269a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet                /* make sure we don't go beyond the array */
270a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet                if (vendorIdCount == VENDOR_COUNT_MAX) {
271a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet                    break;
272a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet                }
273a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet            }
27460529e39bb5d5c1a797394fe78201c0454080ee4Chris Dearman            fclose(f);
275a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet        }
276a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet    }
277a09fbd164d2e088bc5433d310e25640ae048d47dXavier Ducrohet}
278a09fbd164d2e088bc5433d310e25640ae048d47dXavier Ducrohet
279a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet/* Utils methods */
280a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet
281a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet/* builds the path to the adb vendor id file. returns 0 if success */
282a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohetint build_path(char* buff, size_t len, const char* format, const char* home)
283a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet{
284eb558b9240743e24c87796191f54c99890641b14Michael Richardson    if (snprintf(buff, len, format, home, ANDROID_PATH, ANDROID_ADB_INI) >= (signed)len) {
285a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet        return 1;
286a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet    }
287a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet
288a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet    return 0;
289a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet}
290a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet
291a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet/* fills buff with the path to the adb vendor id file. returns 0 if success */
292a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohetint get_adb_usb_ini(char* buff, size_t len)
293a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet{
294a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet#ifdef _WIN32
295a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet    const char* home = getenv("ANDROID_SDK_HOME");
296a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet    if (home != NULL) {
297a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet        return build_path(buff, len, "%s\\%s\\%s", home);
298a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet    } else {
299a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet        char path[MAX_PATH];
300a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet        SHGetFolderPath( NULL, CSIDL_PROFILE, NULL, 0, path);
301a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet        return build_path(buff, len, "%s\\%s\\%s", path);
302a09fbd164d2e088bc5433d310e25640ae048d47dXavier Ducrohet    }
303a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet#else
304a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet    const char* home = getenv("HOME");
305a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet    if (home == NULL)
306a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet        home = "/tmp";
307a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet
308a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet    return build_path(buff, len, "%s/%s/%s", home);
309a481d096feba7cf6e61d54e416a68e2d46498df1Xavier Ducrohet#endif
310a09fbd164d2e088bc5433d310e25640ae048d47dXavier Ducrohet}
311