• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2009 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include "usb_vendors.h"
18 
19 #include <stdio.h>
20 
21 #ifdef _WIN32
22 #  define WIN32_LEAN_AND_MEAN
23 #  include "windows.h"
24 #  include "shlobj.h"
25 #else
26 #  include <unistd.h>
27 #  include <sys/stat.h>
28 #endif
29 
30 #include "sysdeps.h"
31 #include "adb.h"
32 
33 #define ANDROID_PATH            ".android"
34 #define ANDROID_ADB_INI         "adb_usb.ini"
35 
36 #define TRACE_TAG               TRACE_USB
37 
38 // Google's USB Vendor ID
39 #define VENDOR_ID_GOOGLE        0x18d1
40 // HTC's USB Vendor ID
41 #define VENDOR_ID_HTC           0x0bb4
42 // Samsung's USB Vendor ID
43 #define VENDOR_ID_SAMSUNG       0x04e8
44 // Motorola's USB Vendor ID
45 #define VENDOR_ID_MOTOROLA      0x22b8
46 // LG's USB Vendor ID
47 #define VENDOR_ID_LGE           0x1004
48 // Huawei's USB Vendor ID
49 #define VENDOR_ID_HUAWEI        0x12D1
50 // Acer's USB Vendor ID
51 #define VENDOR_ID_ACER          0x0502
52 // Sony Ericsson's USB Vendor ID
53 #define VENDOR_ID_SONY_ERICSSON 0x0FCE
54 // Foxconn's USB Vendor ID
55 #define VENDOR_ID_FOXCONN       0x0489
56 // Dell's USB Vendor ID
57 #define VENDOR_ID_DELL          0x413c
58 // Nvidia's USB Vendor ID
59 #define VENDOR_ID_NVIDIA        0x0955
60 // Garmin-Asus's USB Vendor ID
61 #define VENDOR_ID_GARMIN_ASUS   0x091E
62 // Sharp's USB Vendor ID
63 #define VENDOR_ID_SHARP         0x04dd
64 // ZTE's USB Vendor ID
65 #define VENDOR_ID_ZTE           0x19D2
66 // Kyocera's USB Vendor ID
67 #define VENDOR_ID_KYOCERA       0x0482
68 // Pantech's USB Vendor ID
69 #define VENDOR_ID_PANTECH       0x10A9
70 // Qualcomm's USB Vendor ID
71 #define VENDOR_ID_QUALCOMM      0x05c6
72 // NEC's USB Vendor ID
73 #define VENDOR_ID_NEC           0x0409
74 // Panasonic Mobile Communication's USB Vendor ID
75 #define VENDOR_ID_PMC           0x04DA
76 // Toshiba's USB Vendor ID
77 #define VENDOR_ID_TOSHIBA       0x0930
78 // SK Telesys's USB Vendor ID
79 #define VENDOR_ID_SK_TELESYS    0x1F53
80 // KT Tech's USB Vendor ID
81 #define VENDOR_ID_KT_TECH       0x2116
82 // Asus's USB Vendor ID
83 #define VENDOR_ID_ASUS          0x0b05
84 // Philips's USB Vendor ID
85 #define VENDOR_ID_PHILIPS       0x0471
86 
87 
88 /** built-in vendor list */
89 int builtInVendorIds[] = {
90     VENDOR_ID_GOOGLE,
91     VENDOR_ID_HTC,
92     VENDOR_ID_SAMSUNG,
93     VENDOR_ID_MOTOROLA,
94     VENDOR_ID_LGE,
95     VENDOR_ID_HUAWEI,
96     VENDOR_ID_ACER,
97     VENDOR_ID_SONY_ERICSSON,
98     VENDOR_ID_FOXCONN,
99     VENDOR_ID_DELL,
100     VENDOR_ID_NVIDIA,
101     VENDOR_ID_GARMIN_ASUS,
102     VENDOR_ID_SHARP,
103     VENDOR_ID_ZTE,
104     VENDOR_ID_KYOCERA,
105     VENDOR_ID_PANTECH,
106     VENDOR_ID_QUALCOMM,
107     VENDOR_ID_NEC,
108     VENDOR_ID_PMC,
109     VENDOR_ID_TOSHIBA,
110     VENDOR_ID_SK_TELESYS,
111     VENDOR_ID_KT_TECH,
112     VENDOR_ID_ASUS,
113     VENDOR_ID_PHILIPS,
114 };
115 
116 #define BUILT_IN_VENDOR_COUNT    (sizeof(builtInVendorIds)/sizeof(builtInVendorIds[0]))
117 
118 /* max number of supported vendor ids (built-in + 3rd party). increase as needed */
119 #define VENDOR_COUNT_MAX         128
120 
121 int vendorIds[VENDOR_COUNT_MAX];
122 unsigned vendorIdCount = 0;
123 
124 int get_adb_usb_ini(char* buff, size_t len);
125 
usb_vendors_init(void)126 void usb_vendors_init(void)
127 {
128     if (VENDOR_COUNT_MAX < BUILT_IN_VENDOR_COUNT) {
129         fprintf(stderr, "VENDOR_COUNT_MAX not big enough for built-in vendor list.\n");
130         exit(2);
131     }
132 
133     /* add the built-in vendors at the beginning of the array */
134     memcpy(vendorIds, builtInVendorIds, sizeof(builtInVendorIds));
135 
136     /* default array size is the number of built-in vendors */
137     vendorIdCount = BUILT_IN_VENDOR_COUNT;
138 
139     if (VENDOR_COUNT_MAX == BUILT_IN_VENDOR_COUNT)
140         return;
141 
142     char temp[PATH_MAX];
143     if (get_adb_usb_ini(temp, sizeof(temp)) == 0) {
144         FILE * f = fopen(temp, "rt");
145 
146         if (f != NULL) {
147             /* The vendor id file is pretty basic. 1 vendor id per line.
148                Lines starting with # are comments */
149             while (fgets(temp, sizeof(temp), f) != NULL) {
150                 if (temp[0] == '#')
151                     continue;
152 
153                 long value = strtol(temp, NULL, 0);
154                 if (errno == EINVAL || errno == ERANGE || value > INT_MAX || value < 0) {
155                     fprintf(stderr, "Invalid content in %s. Quitting.\n", ANDROID_ADB_INI);
156                     exit(2);
157                 }
158 
159                 vendorIds[vendorIdCount++] = (int)value;
160 
161                 /* make sure we don't go beyond the array */
162                 if (vendorIdCount == VENDOR_COUNT_MAX) {
163                     break;
164                 }
165             }
166         }
167     }
168 }
169 
170 /* Utils methods */
171 
172 /* builds the path to the adb vendor id file. returns 0 if success */
build_path(char * buff,size_t len,const char * format,const char * home)173 int build_path(char* buff, size_t len, const char* format, const char* home)
174 {
175     if (snprintf(buff, len, format, home, ANDROID_PATH, ANDROID_ADB_INI) >= len) {
176         return 1;
177     }
178 
179     return 0;
180 }
181 
182 /* fills buff with the path to the adb vendor id file. returns 0 if success */
get_adb_usb_ini(char * buff,size_t len)183 int get_adb_usb_ini(char* buff, size_t len)
184 {
185 #ifdef _WIN32
186     const char* home = getenv("ANDROID_SDK_HOME");
187     if (home != NULL) {
188         return build_path(buff, len, "%s\\%s\\%s", home);
189     } else {
190         char path[MAX_PATH];
191         SHGetFolderPath( NULL, CSIDL_PROFILE, NULL, 0, path);
192         return build_path(buff, len, "%s\\%s\\%s", path);
193     }
194 #else
195     const char* home = getenv("HOME");
196     if (home == NULL)
197         home = "/tmp";
198 
199     return build_path(buff, len, "%s/%s/%s", home);
200 #endif
201 }
202