1 /* 2 * Copyright (C) 2015 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 #define TRACE_TAG ADB 18 19 #include "sysdeps.h" 20 #include "adb_client.h" 21 22 #include <errno.h> 23 #include <limits.h> 24 #include <stdarg.h> 25 #include <stdio.h> 26 #include <stdlib.h> 27 #include <string.h> 28 #include <sys/stat.h> 29 #include <sys/types.h> 30 31 #include <string> 32 #include <vector> 33 34 #include <android-base/stringprintf.h> 35 #include <android-base/strings.h> 36 #include <cutils/sockets.h> 37 38 #include "adb_io.h" 39 #include "adb_utils.h" 40 41 static TransportType __adb_transport = kTransportAny; 42 static const char* __adb_serial = NULL; 43 44 static int __adb_server_port = DEFAULT_ADB_PORT; 45 static const char* __adb_server_name = NULL; 46 47 void adb_set_transport(TransportType type, const char* serial) 48 { 49 __adb_transport = type; 50 __adb_serial = serial; 51 } 52 53 void adb_get_transport(TransportType* type, const char** serial) { 54 if (type) { 55 *type = __adb_transport; 56 } 57 if (serial) { 58 *serial = __adb_serial; 59 } 60 } 61 62 void adb_set_tcp_specifics(int server_port) 63 { 64 __adb_server_port = server_port; 65 } 66 67 void adb_set_tcp_name(const char* hostname) 68 { 69 __adb_server_name = hostname; 70 } 71 72 static int switch_socket_transport(int fd, std::string* error) { 73 std::string service; 74 if (__adb_serial) { 75 service += "host:transport:"; 76 service += __adb_serial; 77 } else { 78 const char* transport_type = "???"; 79 switch (__adb_transport) { 80 case kTransportUsb: 81 transport_type = "transport-usb"; 82 break; 83 case kTransportLocal: 84 transport_type = "transport-local"; 85 break; 86 case kTransportAny: 87 transport_type = "transport-any"; 88 break; 89 case kTransportHost: 90 // no switch necessary 91 return 0; 92 } 93 service += "host:"; 94 service += transport_type; 95 } 96 97 if (!SendProtocolString(fd, service)) { 98 *error = perror_str("write failure during connection"); 99 adb_close(fd); 100 return -1; 101 } 102 D("Switch transport in progress"); 103 104 if (!adb_status(fd, error)) { 105 adb_close(fd); 106 D("Switch transport failed: %s", error->c_str()); 107 return -1; 108 } 109 D("Switch transport success"); 110 return 0; 111 } 112 113 bool adb_status(int fd, std::string* error) { 114 char buf[5]; 115 if (!ReadFdExactly(fd, buf, 4)) { 116 *error = perror_str("protocol fault (couldn't read status)"); 117 return false; 118 } 119 120 if (!memcmp(buf, "OKAY", 4)) { 121 return true; 122 } 123 124 if (memcmp(buf, "FAIL", 4)) { 125 *error = android::base::StringPrintf("protocol fault (status %02x %02x %02x %02x?!)", 126 buf[0], buf[1], buf[2], buf[3]); 127 return false; 128 } 129 130 ReadProtocolString(fd, error, error); 131 return false; 132 } 133 134 int _adb_connect(const std::string& service, std::string* error) { 135 D("_adb_connect: %s", service.c_str()); 136 if (service.empty() || service.size() > MAX_PAYLOAD_V1) { 137 *error = android::base::StringPrintf("bad service name length (%zd)", 138 service.size()); 139 return -1; 140 } 141 142 int fd; 143 std::string reason; 144 if (__adb_server_name) { 145 fd = network_connect(__adb_server_name, __adb_server_port, SOCK_STREAM, 0, &reason); 146 if (fd == -1) { 147 *error = android::base::StringPrintf("can't connect to %s:%d: %s", 148 __adb_server_name, __adb_server_port, 149 reason.c_str()); 150 return -2; 151 } 152 } else { 153 fd = network_loopback_client(__adb_server_port, SOCK_STREAM, &reason); 154 if (fd == -1) { 155 *error = android::base::StringPrintf("cannot connect to daemon: %s", 156 reason.c_str()); 157 return -2; 158 } 159 } 160 161 if ((memcmp(&service[0],"host",4) != 0 || service == "host:reconnect") && 162 switch_socket_transport(fd, error)) { 163 return -1; 164 } 165 166 if (!SendProtocolString(fd, service)) { 167 *error = perror_str("write failure during connection"); 168 adb_close(fd); 169 return -1; 170 } 171 172 if (service != "reconnect") { 173 if (!adb_status(fd, error)) { 174 adb_close(fd); 175 return -1; 176 } 177 } 178 179 D("_adb_connect: return fd %d", fd); 180 return fd; 181 } 182 183 int adb_connect(const std::string& service, std::string* error) { 184 // first query the adb server's version 185 int fd = _adb_connect("host:version", error); 186 187 D("adb_connect: service %s", service.c_str()); 188 if (fd == -2 && __adb_server_name) { 189 fprintf(stderr,"** Cannot start server on remote host\n"); 190 // error is the original network connection error 191 return fd; 192 } else if (fd == -2) { 193 fprintf(stdout,"* daemon not running. starting it now on port %d *\n", 194 __adb_server_port); 195 start_server: 196 if (launch_server(__adb_server_port)) { 197 fprintf(stderr,"* failed to start daemon *\n"); 198 // launch_server() has already printed detailed error info, so just 199 // return a generic error string about the overall adb_connect() 200 // that the caller requested. 201 *error = "cannot connect to daemon"; 202 return -1; 203 } else { 204 fprintf(stdout,"* daemon started successfully *\n"); 205 } 206 /* give the server some time to start properly and detect devices */ 207 adb_sleep_ms(3000); 208 // fall through to _adb_connect 209 } else { 210 // If a server is already running, check its version matches. 211 int version = ADB_SERVER_VERSION - 1; 212 213 // If we have a file descriptor, then parse version result. 214 if (fd >= 0) { 215 std::string version_string; 216 if (!ReadProtocolString(fd, &version_string, error)) { 217 adb_close(fd); 218 return -1; 219 } 220 221 ReadOrderlyShutdown(fd); 222 adb_close(fd); 223 224 if (sscanf(&version_string[0], "%04x", &version) != 1) { 225 *error = android::base::StringPrintf("cannot parse version string: %s", 226 version_string.c_str()); 227 return -1; 228 } 229 } else { 230 // If fd is -1 check for "unknown host service" which would 231 // indicate a version of adb that does not support the 232 // version command, in which case we should fall-through to kill it. 233 if (*error != "unknown host service") { 234 return fd; 235 } 236 } 237 238 if (version != ADB_SERVER_VERSION) { 239 printf("adb server version (%d) doesn't match this client (%d); killing...\n", 240 version, ADB_SERVER_VERSION); 241 fd = _adb_connect("host:kill", error); 242 if (fd >= 0) { 243 ReadOrderlyShutdown(fd); 244 adb_close(fd); 245 } else { 246 // If we couldn't connect to the server or had some other error, 247 // report it, but still try to start the server. 248 fprintf(stderr, "error: %s\n", error->c_str()); 249 } 250 251 /* XXX can we better detect its death? */ 252 adb_sleep_ms(2000); 253 goto start_server; 254 } 255 } 256 257 // if the command is start-server, we are done. 258 if (service == "host:start-server") { 259 return 0; 260 } 261 262 fd = _adb_connect(service, error); 263 if (fd == -1) { 264 D("_adb_connect error: %s", error->c_str()); 265 } else if(fd == -2) { 266 fprintf(stderr,"** daemon still not running\n"); 267 } 268 D("adb_connect: return fd %d", fd); 269 270 return fd; 271 } 272 273 274 bool adb_command(const std::string& service) { 275 std::string error; 276 int fd = adb_connect(service, &error); 277 if (fd < 0) { 278 fprintf(stderr, "error: %s\n", error.c_str()); 279 return false; 280 } 281 282 if (!adb_status(fd, &error)) { 283 fprintf(stderr, "error: %s\n", error.c_str()); 284 adb_close(fd); 285 return false; 286 } 287 288 ReadOrderlyShutdown(fd); 289 adb_close(fd); 290 return true; 291 } 292 293 bool adb_query(const std::string& service, std::string* result, std::string* error) { 294 D("adb_query: %s", service.c_str()); 295 int fd = adb_connect(service, error); 296 if (fd < 0) { 297 return false; 298 } 299 300 result->clear(); 301 if (!ReadProtocolString(fd, result, error)) { 302 adb_close(fd); 303 return false; 304 } 305 306 ReadOrderlyShutdown(fd); 307 adb_close(fd); 308 return true; 309 } 310 311 std::string format_host_command(const char* command, TransportType type, const char* serial) { 312 if (serial) { 313 return android::base::StringPrintf("host-serial:%s:%s", serial, command); 314 } 315 316 const char* prefix = "host"; 317 if (type == kTransportUsb) { 318 prefix = "host-usb"; 319 } else if (type == kTransportLocal) { 320 prefix = "host-local"; 321 } 322 return android::base::StringPrintf("%s:%s", prefix, command); 323 } 324 325 bool adb_get_feature_set(FeatureSet* feature_set, std::string* error) { 326 std::string result; 327 if (adb_query(format_host_command("features", __adb_transport, __adb_serial), &result, error)) { 328 *feature_set = StringToFeatureSet(result); 329 return true; 330 } 331 feature_set->clear(); 332 return false; 333 } 334