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