• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 <inttypes.h>
24 #include <limits.h>
25 #include <stdarg.h>
26 #include <stdio.h>
27 #include <stdlib.h>
28 #include <string.h>
29 #include <sys/stat.h>
30 #include <sys/types.h>
31 
32 #include <condition_variable>
33 #include <mutex>
34 #include <optional>
35 #include <string>
36 #include <thread>
37 #include <vector>
38 
39 #include <android-base/file.h>
40 #include <android-base/no_destructor.h>
41 #include <android-base/stringprintf.h>
42 #include <android-base/strings.h>
43 #include <android-base/thread_annotations.h>
44 #include <cutils/sockets.h>
45 
46 #include "adb_io.h"
47 #include "adb_utils.h"
48 #include "socket_spec.h"
49 #include "sysdeps/chrono.h"
50 
51 static TransportType __adb_transport = kTransportAny;
52 static const char* __adb_serial = nullptr;
53 static TransportId __adb_transport_id = 0;
54 
55 static const char* __adb_server_socket_spec;
56 
adb_set_transport(TransportType type,const char * serial,TransportId transport_id)57 void adb_set_transport(TransportType type, const char* serial, TransportId transport_id) {
58     __adb_transport = type;
59     __adb_serial = serial;
60     __adb_transport_id = transport_id;
61 }
62 
adb_get_transport(TransportType * type,const char ** serial,TransportId * transport_id)63 void adb_get_transport(TransportType* type, const char** serial, TransportId* transport_id) {
64     if (type) *type = __adb_transport;
65     if (serial) *serial = __adb_serial;
66     if (transport_id) *transport_id = __adb_transport_id;
67 }
68 
adb_set_socket_spec(const char * socket_spec)69 void adb_set_socket_spec(const char* socket_spec) {
70     if (__adb_server_socket_spec) {
71         LOG(FATAL) << "attempted to reinitialize adb_server_socket_spec " << socket_spec << " (was " << __adb_server_socket_spec << ")";
72     }
73     __adb_server_socket_spec = socket_spec;
74 }
75 
switch_socket_transport(int fd,std::string * error)76 static std::optional<TransportId> switch_socket_transport(int fd, std::string* error) {
77     TransportId result;
78     bool read_transport = true;
79 
80     std::string service;
81     if (__adb_transport_id) {
82         read_transport = false;
83         service += "host:transport-id:";
84         service += std::to_string(__adb_transport_id);
85         result = __adb_transport_id;
86     } else if (__adb_serial) {
87         service += "host:tport:serial:";
88         service += __adb_serial;
89     } else {
90         const char* transport_type = "???";
91         switch (__adb_transport) {
92           case kTransportUsb:
93               transport_type = "usb";
94               break;
95           case kTransportLocal:
96               transport_type = "local";
97               break;
98           case kTransportAny:
99               transport_type = "any";
100               break;
101           case kTransportHost:
102             // no switch necessary
103             return 0;
104         }
105         service += "host:tport:";
106         service += transport_type;
107     }
108 
109     if (!SendProtocolString(fd, service)) {
110         *error = perror_str("write failure during connection");
111         return std::nullopt;
112     }
113 
114     LOG(DEBUG) << "Switch transport in progress: " << service;
115 
116     if (!adb_status(fd, error)) {
117         D("Switch transport failed: %s", error->c_str());
118         return std::nullopt;
119     }
120 
121     if (read_transport) {
122         if (!ReadFdExactly(fd, &result, sizeof(result))) {
123             *error = "failed to read transport id from server";
124             return std::nullopt;
125         }
126     }
127 
128     D("Switch transport success");
129     return result;
130 }
131 
adb_status(borrowed_fd fd,std::string * error)132 bool adb_status(borrowed_fd fd, std::string* error) {
133     char buf[5];
134     if (!ReadFdExactly(fd, buf, 4)) {
135         *error = perror_str("protocol fault (couldn't read status)");
136         return false;
137     }
138 
139     if (!memcmp(buf, "OKAY", 4)) {
140         return true;
141     }
142 
143     if (memcmp(buf, "FAIL", 4)) {
144         *error = android::base::StringPrintf("protocol fault (status %02x %02x %02x %02x?!)",
145                                              buf[0], buf[1], buf[2], buf[3]);
146         return false;
147     }
148 
149     ReadProtocolString(fd, error, error);
150     return false;
151 }
152 
_adb_connect(std::string_view service,TransportId * transport,std::string * error,bool force_switch=false)153 static int _adb_connect(std::string_view service, TransportId* transport, std::string* error,
154                         bool force_switch = false) {
155     LOG(DEBUG) << "_adb_connect: " << service;
156     if (service.empty() || service.size() > MAX_PAYLOAD) {
157         *error = android::base::StringPrintf("bad service name length (%zd)", service.size());
158         return -1;
159     }
160 
161     std::string reason;
162     unique_fd fd;
163     if (!socket_spec_connect(&fd, __adb_server_socket_spec, nullptr, nullptr, &reason)) {
164         *error = android::base::StringPrintf("cannot connect to daemon at %s: %s",
165                                              __adb_server_socket_spec, reason.c_str());
166         return -2;
167     }
168 
169     if (!service.starts_with("host") || force_switch) {
170         std::optional<TransportId> transport_result = switch_socket_transport(fd.get(), error);
171         if (!transport_result) {
172             return -1;
173         }
174 
175         if (transport) {
176             *transport = *transport_result;
177         }
178     }
179 
180     if (!SendProtocolString(fd.get(), service)) {
181         *error = perror_str("write failure during connection");
182         return -1;
183     }
184 
185     if (!adb_status(fd.get(), error)) {
186         return -1;
187     }
188 
189     D("_adb_connect: return fd %d", fd.get());
190     return fd.release();
191 }
192 
adb_kill_server()193 bool adb_kill_server() {
194     D("adb_kill_server");
195     std::string reason;
196     unique_fd fd;
197     if (!socket_spec_connect(&fd, __adb_server_socket_spec, nullptr, nullptr, &reason)) {
198         fprintf(stderr, "cannot connect to daemon at %s: %s\n", __adb_server_socket_spec,
199                 reason.c_str());
200         return true;
201     }
202 
203     if (!SendProtocolString(fd.get(), "host:kill")) {
204         fprintf(stderr, "error: write failure during connection: %s\n", strerror(errno));
205         return false;
206     }
207 
208     char buf[4];
209     if (!ReadFdExactly(fd.get(), buf, 4)) {
210         fprintf(stderr, "error: failed to read response from server\n");
211         return false;
212     }
213 
214     if (memcmp(buf, "OKAY", 4) == 0) {
215         // Nothing to do.
216     } else if (memcmp(buf, "FAIL", 4) == 0) {
217         std::string output, error;
218         if (!ReadProtocolString(fd.get(), &output, &error)) {
219             fprintf(stderr, "error: %s\n", error.c_str());
220             return false;
221         }
222 
223         fprintf(stderr, "error: %s\n", output.c_str());
224         return false;
225     }
226 
227     // Now that no more data is expected, wait for socket orderly shutdown or error, indicating
228     // server death.
229     ReadOrderlyShutdown(fd.get());
230     return true;
231 }
232 
adb_connect(std::string_view service,std::string * error)233 int adb_connect(std::string_view service, std::string* error) {
234     return adb_connect(nullptr, service, error);
235 }
236 
237 #if defined(__linux__)
adb_get_server_executable_path()238 std::optional<std::string> adb_get_server_executable_path() {
239     int port;
240     std::string error;
241     if (!parse_tcp_socket_spec(__adb_server_socket_spec, nullptr, &port, nullptr, &error)) {
242         return {};
243     }
244 
245     return adb_get_android_dir_path() + OS_PATH_SEPARATOR + "adb." + std::to_string(port);
246 }
247 #endif
248 
__adb_check_server_version(std::string * error)249 static bool __adb_check_server_version(std::string* error) {
250     unique_fd fd(_adb_connect("host:version", nullptr, error));
251 
252     bool local = is_local_socket_spec(__adb_server_socket_spec);
253     if (fd == -2 && !local) {
254         fprintf(stderr, "* cannot start server on remote host\n");
255         // error is the original network connection error
256         return false;
257     } else if (fd == -2) {
258         fprintf(stderr, "* daemon not running; starting now at %s\n", __adb_server_socket_spec);
259     start_server:
260         if (launch_server(__adb_server_socket_spec)) {
261             fprintf(stderr, "* failed to start daemon\n");
262             // launch_server() has already printed detailed error info, so just
263             // return a generic error string about the overall adb_connect()
264             // that the caller requested.
265             *error = "cannot connect to daemon";
266             return false;
267         } else {
268             fprintf(stderr, "* daemon started successfully\n");
269         }
270         // The server will wait until it detects all of its connected devices before acking.
271         // Fall through to _adb_connect.
272     } else {
273         // If a server is already running, check its version matches.
274         int version = 0;
275 
276         // If we have a file descriptor, then parse version result.
277         if (fd >= 0) {
278             std::string version_string;
279             if (!ReadProtocolString(fd, &version_string, error)) {
280                 return false;
281             }
282 
283             ReadOrderlyShutdown(fd);
284 
285             if (sscanf(&version_string[0], "%04x", &version) != 1) {
286                 *error = android::base::StringPrintf("cannot parse version string: %s",
287                                                      version_string.c_str());
288                 return false;
289             }
290         } else {
291             // If fd is -1 check for "unknown host service" which would
292             // indicate a version of adb that does not support the
293             // version command, in which case we should fall-through to kill it.
294             if (*error != "unknown host service") {
295                 return false;
296             }
297         }
298 
299         if (version != ADB_SERVER_VERSION) {
300 #if defined(__linux__)
301             if (version > ADB_SERVER_VERSION && local) {
302                 // Try to re-exec the existing adb server's binary.
303                 constexpr const char* adb_reexeced = "adb (re-execed)";
304                 if (strcmp(adb_reexeced, *__adb_argv) != 0) {
305                     __adb_argv[0] = adb_reexeced;
306                     std::optional<std::string> server_path_path = adb_get_server_executable_path();
307                     std::string server_path;
308                     if (server_path_path &&
309                         android::base::ReadFileToString(*server_path_path, &server_path)) {
310                         if (execve(server_path.c_str(), const_cast<char**>(__adb_argv),
311                                    const_cast<char**>(__adb_envp)) == -1) {
312                             LOG(ERROR) << "failed to exec newer version at " << server_path;
313                         }
314 
315                         // Fall-through to restarting the server.
316                     }
317                 }
318             }
319 #endif
320 
321             fprintf(stderr, "adb server version (%d) doesn't match this client (%d); killing...\n",
322                     version, ADB_SERVER_VERSION);
323             adb_kill_server();
324             goto start_server;
325         }
326     }
327 
328     return true;
329 }
330 
adb_check_server_version(std::string * error)331 bool adb_check_server_version(std::string* error) {
332     // Only check the version once per process, since this isn't atomic anyway.
333     static std::once_flag once;
334     static bool result;
335     static std::string* err;
336     std::call_once(once, []() {
337         err = new std::string();
338         result = __adb_check_server_version(err);
339     });
340     *error = *err;
341     return result;
342 }
343 
adb_connect(TransportId * transport,std::string_view service,std::string * error,bool force_switch_device)344 int adb_connect(TransportId* transport, std::string_view service, std::string* error,
345                 bool force_switch_device) {
346     LOG(DEBUG) << "adb_connect: service: " << service;
347 
348     // Query the adb server's version.
349     if (!adb_check_server_version(error)) {
350         return -1;
351     }
352 
353     // if the command is start-server, we are done.
354     if (service == "host:start-server") {
355         return 0;
356     }
357 
358     unique_fd fd(_adb_connect(service, transport, error, force_switch_device));
359     if (fd == -1) {
360         D("_adb_connect error: %s", error->c_str());
361     } else if(fd == -2) {
362         fprintf(stderr, "* daemon still not running\n");
363     }
364     D("adb_connect: return fd %d", fd.get());
365 
366     return fd.release();
367 }
368 
adb_command(const std::string & service)369 bool adb_command(const std::string& service) {
370     std::string error;
371     unique_fd fd(adb_connect(service, &error));
372     if (fd < 0) {
373         fprintf(stderr, "error: %s\n", error.c_str());
374         return false;
375     }
376 
377     if (!adb_status(fd.get(), &error)) {
378         fprintf(stderr, "error: %s\n", error.c_str());
379         return false;
380     }
381 
382     ReadOrderlyShutdown(fd.get());
383     return true;
384 }
385 
adb_query(const std::string & service,std::string * result,std::string * error)386 bool adb_query(const std::string& service, std::string* result, std::string* error) {
387     D("adb_query: %s", service.c_str());
388     unique_fd fd(adb_connect(service, error));
389     if (fd < 0) {
390         return false;
391     }
392 
393     result->clear();
394     if (!ReadProtocolString(fd.get(), result, error)) {
395         return false;
396     }
397 
398     ReadOrderlyShutdown(fd.get());
399     return true;
400 }
401 
format_host_command(const char * command)402 std::string format_host_command(const char* command) {
403     if (__adb_transport_id) {
404         return android::base::StringPrintf("host-transport-id:%" PRIu64 ":%s", __adb_transport_id,
405                                            command);
406     } else if (__adb_serial) {
407         return android::base::StringPrintf("host-serial:%s:%s", __adb_serial, command);
408     }
409 
410     const char* prefix = "host";
411     if (__adb_transport == kTransportUsb) {
412         prefix = "host-usb";
413     } else if (__adb_transport == kTransportLocal) {
414         prefix = "host-local";
415     }
416     return android::base::StringPrintf("%s:%s", prefix, command);
417 }
418 
adb_get_feature_set(std::string * error)419 const std::optional<FeatureSet>& adb_get_feature_set(std::string* error) {
420     static std::mutex feature_mutex [[clang::no_destroy]];
421     static std::optional<FeatureSet> features [[clang::no_destroy]] GUARDED_BY(feature_mutex);
422     std::lock_guard<std::mutex> lock(feature_mutex);
423     if (!features) {
424         std::string result;
425         std::string err;
426         if (adb_query(format_host_command("features"), &result, &err)) {
427             features = StringToFeatureSet(result);
428         } else {
429             if (error) {
430                 *error = err;
431             }
432         }
433     }
434     return features;
435 }
436