1 /*
2 * Copyright (C) 2007 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 TRACE_ADB
18
19 #include "sysdeps.h"
20
21 #include <assert.h>
22 #include <ctype.h>
23 #include <errno.h>
24 #include <inttypes.h>
25 #include <limits.h>
26 #include <stdarg.h>
27 #include <stdint.h>
28 #include <stdio.h>
29 #include <stdlib.h>
30 #include <string.h>
31 #include <sys/stat.h>
32 #include <sys/types.h>
33
34 #include <string>
35
36 #include <base/stringprintf.h>
37
38 #if !defined(_WIN32)
39 #include <termios.h>
40 #include <unistd.h>
41 #endif
42
43 #include "adb.h"
44 #include "adb_auth.h"
45 #include "adb_client.h"
46 #include "adb_io.h"
47 #include "adb_utils.h"
48 #include "file_sync_service.h"
49
50 static int install_app(transport_type t, const char* serial, int argc, const char** argv);
51 static int install_multiple_app(transport_type t, const char* serial, int argc, const char** argv);
52 static int uninstall_app(transport_type t, const char* serial, int argc, const char** argv);
53
54 static std::string gProductOutPath;
55 extern int gListenAll;
56
product_file(const char * extra)57 static std::string product_file(const char *extra) {
58 if (gProductOutPath.empty()) {
59 fprintf(stderr, "adb: Product directory not specified; "
60 "use -p or define ANDROID_PRODUCT_OUT\n");
61 exit(1);
62 }
63
64 return android::base::StringPrintf("%s%s%s",
65 gProductOutPath.c_str(), OS_PATH_SEPARATOR_STR, extra);
66 }
67
version(FILE * out)68 static void version(FILE* out) {
69 fprintf(out, "Android Debug Bridge version %d.%d.%d\nRevision %s\n",
70 ADB_VERSION_MAJOR, ADB_VERSION_MINOR, ADB_SERVER_VERSION, ADB_REVISION);
71 }
72
help()73 static void help() {
74 version(stderr);
75
76 fprintf(stderr,
77 "\n"
78 " -a - directs adb to listen on all interfaces for a connection\n"
79 " -d - directs command to the only connected USB device\n"
80 " returns an error if more than one USB device is present.\n"
81 " -e - directs command to the only running emulator.\n"
82 " returns an error if more than one emulator is running.\n"
83 " -s <specific device> - directs command to the device or emulator with the given\n"
84 " serial number or qualifier. Overrides ANDROID_SERIAL\n"
85 " environment variable.\n"
86 " -p <product name or path> - simple product name like 'sooner', or\n"
87 " a relative/absolute path to a product\n"
88 " out directory like 'out/target/product/sooner'.\n"
89 " If -p is not specified, the ANDROID_PRODUCT_OUT\n"
90 " environment variable is used, which must\n"
91 " be an absolute path.\n"
92 " -H - Name of adb server host (default: localhost)\n"
93 " -P - Port of adb server (default: 5037)\n"
94 " devices [-l] - list all connected devices\n"
95 " ('-l' will also list device qualifiers)\n"
96 " connect <host>[:<port>] - connect to a device via TCP/IP\n"
97 " Port 5555 is used by default if no port number is specified.\n"
98 " disconnect [<host>[:<port>]] - disconnect from a TCP/IP device.\n"
99 " Port 5555 is used by default if no port number is specified.\n"
100 " Using this command with no additional arguments\n"
101 " will disconnect from all connected TCP/IP devices.\n"
102 "\n"
103 "device commands:\n"
104 " adb push [-p] <local> <remote>\n"
105 " - copy file/dir to device\n"
106 " ('-p' to display the transfer progress)\n"
107 " adb pull [-p] [-a] <remote> [<local>]\n"
108 " - copy file/dir from device\n"
109 " ('-p' to display the transfer progress)\n"
110 " ('-a' means copy timestamp and mode)\n"
111 " adb sync [ <directory> ] - copy host->device only if changed\n"
112 " (-l means list but don't copy)\n"
113 " (see 'adb help all')\n"
114 " adb shell - run remote shell interactively\n"
115 " adb shell <command> - run remote shell command\n"
116 " adb emu <command> - run emulator console command\n"
117 " adb logcat [ <filter-spec> ] - View device log\n"
118 " adb forward --list - list all forward socket connections.\n"
119 " the format is a list of lines with the following format:\n"
120 " <serial> \" \" <local> \" \" <remote> \"\\n\"\n"
121 " adb forward <local> <remote> - forward socket connections\n"
122 " forward specs are one of: \n"
123 " tcp:<port>\n"
124 " localabstract:<unix domain socket name>\n"
125 " localreserved:<unix domain socket name>\n"
126 " localfilesystem:<unix domain socket name>\n"
127 " dev:<character device name>\n"
128 " jdwp:<process pid> (remote only)\n"
129 " adb forward --no-rebind <local> <remote>\n"
130 " - same as 'adb forward <local> <remote>' but fails\n"
131 " if <local> is already forwarded\n"
132 " adb forward --remove <local> - remove a specific forward socket connection\n"
133 " adb forward --remove-all - remove all forward socket connections\n"
134 " adb reverse --list - list all reverse socket connections from device\n"
135 " adb reverse <remote> <local> - reverse socket connections\n"
136 " reverse specs are one of:\n"
137 " tcp:<port>\n"
138 " localabstract:<unix domain socket name>\n"
139 " localreserved:<unix domain socket name>\n"
140 " localfilesystem:<unix domain socket name>\n"
141 " adb reverse --norebind <remote> <local>\n"
142 " - same as 'adb reverse <remote> <local>' but fails\n"
143 " if <remote> is already reversed.\n"
144 " adb reverse --remove <remote>\n"
145 " - remove a specific reversed socket connection\n"
146 " adb reverse --remove-all - remove all reversed socket connections from device\n"
147 " adb jdwp - list PIDs of processes hosting a JDWP transport\n"
148 " adb install [-lrtsdg] <file>\n"
149 " - push this package file to the device and install it\n"
150 " (-l: forward lock application)\n"
151 " (-r: replace existing application)\n"
152 " (-t: allow test packages)\n"
153 " (-s: install application on sdcard)\n"
154 " (-d: allow version code downgrade)\n"
155 " (-g: grant all runtime permissions)\n"
156 " adb install-multiple [-lrtsdpg] <file...>\n"
157 " - push this package file to the device and install it\n"
158 " (-l: forward lock application)\n"
159 " (-r: replace existing application)\n"
160 " (-t: allow test packages)\n"
161 " (-s: install application on sdcard)\n"
162 " (-d: allow version code downgrade)\n"
163 " (-p: partial application install)\n"
164 " (-g: grant all runtime permissions)\n"
165 " adb uninstall [-k] <package> - remove this app package from the device\n"
166 " ('-k' means keep the data and cache directories)\n"
167 " adb bugreport - return all information from the device\n"
168 " that should be included in a bug report.\n"
169 "\n"
170 " adb backup [-f <file>] [-apk|-noapk] [-obb|-noobb] [-shared|-noshared] [-all] [-system|-nosystem] [<packages...>]\n"
171 " - write an archive of the device's data to <file>.\n"
172 " If no -f option is supplied then the data is written\n"
173 " to \"backup.ab\" in the current directory.\n"
174 " (-apk|-noapk enable/disable backup of the .apks themselves\n"
175 " in the archive; the default is noapk.)\n"
176 " (-obb|-noobb enable/disable backup of any installed apk expansion\n"
177 " (aka .obb) files associated with each application; the default\n"
178 " is noobb.)\n"
179 " (-shared|-noshared enable/disable backup of the device's\n"
180 " shared storage / SD card contents; the default is noshared.)\n"
181 " (-all means to back up all installed applications)\n"
182 " (-system|-nosystem toggles whether -all automatically includes\n"
183 " system applications; the default is to include system apps)\n"
184 " (<packages...> is the list of applications to be backed up. If\n"
185 " the -all or -shared flags are passed, then the package\n"
186 " list is optional. Applications explicitly given on the\n"
187 " command line will be included even if -nosystem would\n"
188 " ordinarily cause them to be omitted.)\n"
189 "\n"
190 " adb restore <file> - restore device contents from the <file> backup archive\n"
191 "\n"
192 " adb disable-verity - disable dm-verity checking on USERDEBUG builds\n"
193 " adb enable-verity - re-enable dm-verity checking on USERDEBUG builds\n"
194 " adb keygen <file> - generate adb public/private key. The private key is stored in <file>,\n"
195 " and the public key is stored in <file>.pub. Any existing files\n"
196 " are overwritten.\n"
197 " adb help - show this help message\n"
198 " adb version - show version num\n"
199 "\n"
200 "scripting:\n"
201 " adb wait-for-device - block until device is online\n"
202 " adb start-server - ensure that there is a server running\n"
203 " adb kill-server - kill the server if it is running\n"
204 " adb get-state - prints: offline | bootloader | device\n"
205 " adb get-serialno - prints: <serial-number>\n"
206 " adb get-devpath - prints: <device-path>\n"
207 " adb remount - remounts the /system, /vendor (if present) and /oem (if present) partitions on the device read-write\n"
208 " adb reboot [bootloader|recovery]\n"
209 " - reboots the device, optionally into the bootloader or recovery program.\n"
210 " adb reboot sideload - reboots the device into the sideload mode in recovery program (adb root required).\n"
211 " adb reboot sideload-auto-reboot\n"
212 " - reboots into the sideload mode, then reboots automatically after the sideload regardless of the result.\n"
213 " adb reboot-bootloader - reboots the device into the bootloader\n"
214 " adb root - restarts the adbd daemon with root permissions\n"
215 " adb unroot - restarts the adbd daemon without root permissions\n"
216 " adb usb - restarts the adbd daemon listening on USB\n"
217 " adb tcpip <port> - restarts the adbd daemon listening on TCP on the specified port\n"
218 "networking:\n"
219 " adb ppp <tty> [parameters] - Run PPP over USB.\n"
220 " Note: you should not automatically start a PPP connection.\n"
221 " <tty> refers to the tty for PPP stream. Eg. dev:/dev/omap_csmi_tty1\n"
222 " [parameters] - Eg. defaultroute debug dump local notty usepeerdns\n"
223 "\n"
224 "adb sync notes: adb sync [ <directory> ]\n"
225 " <localdir> can be interpreted in several ways:\n"
226 "\n"
227 " - If <directory> is not specified, /system, /vendor (if present), /oem (if present) and /data partitions will be updated.\n"
228 "\n"
229 " - If it is \"system\", \"vendor\", \"oem\" or \"data\", only the corresponding partition\n"
230 " is updated.\n"
231 "\n"
232 "environmental variables:\n"
233 " ADB_TRACE - Print debug information. A comma separated list of the following values\n"
234 " 1 or all, adb, sockets, packets, rwx, usb, sync, sysdeps, transport, jdwp\n"
235 " ANDROID_SERIAL - The serial number to connect to. -s takes priority over this if given.\n"
236 " ANDROID_LOG_TAGS - When used with the logcat option, only these debug tags are printed.\n"
237 );
238 }
239
usage()240 static int usage() {
241 help();
242 return 1;
243 }
244
245 #if defined(_WIN32)
246
247 // Implemented in sysdeps_win32.cpp.
248 void stdin_raw_init(int fd);
249 void stdin_raw_restore(int fd);
250
251 #else
252 static termios g_saved_terminal_state;
253
stdin_raw_init(int fd)254 static void stdin_raw_init(int fd) {
255 if (tcgetattr(fd, &g_saved_terminal_state)) return;
256
257 termios tio;
258 if (tcgetattr(fd, &tio)) return;
259
260 cfmakeraw(&tio);
261
262 // No timeout but request at least one character per read.
263 tio.c_cc[VTIME] = 0;
264 tio.c_cc[VMIN] = 1;
265
266 tcsetattr(fd, TCSAFLUSH, &tio);
267 }
268
stdin_raw_restore(int fd)269 static void stdin_raw_restore(int fd) {
270 tcsetattr(fd, TCSAFLUSH, &g_saved_terminal_state);
271 }
272 #endif
273
read_and_dump(int fd)274 static void read_and_dump(int fd) {
275 while (fd >= 0) {
276 D("read_and_dump(): pre adb_read(fd=%d)\n", fd);
277 char buf[BUFSIZ];
278 int len = adb_read(fd, buf, sizeof(buf));
279 D("read_and_dump(): post adb_read(fd=%d): len=%d\n", fd, len);
280 if (len <= 0) {
281 break;
282 }
283
284 fwrite(buf, 1, len, stdout);
285 fflush(stdout);
286 }
287 }
288
read_status_line(int fd,char * buf,size_t count)289 static void read_status_line(int fd, char* buf, size_t count)
290 {
291 count--;
292 while (count > 0) {
293 int len = adb_read(fd, buf, count);
294 if (len == 0) {
295 break;
296 } else if (len < 0) {
297 if (errno == EINTR) continue;
298 break;
299 }
300
301 buf += len;
302 count -= len;
303 }
304 *buf = '\0';
305 }
306
copy_to_file(int inFd,int outFd)307 static void copy_to_file(int inFd, int outFd) {
308 const size_t BUFSIZE = 32 * 1024;
309 char* buf = (char*) malloc(BUFSIZE);
310 if (buf == nullptr) fatal("couldn't allocate buffer for copy_to_file");
311 int len;
312 long total = 0;
313
314 D("copy_to_file(%d -> %d)\n", inFd, outFd);
315
316 if (inFd == STDIN_FILENO) {
317 stdin_raw_init(STDIN_FILENO);
318 }
319
320 while (true) {
321 if (inFd == STDIN_FILENO) {
322 len = unix_read(inFd, buf, BUFSIZE);
323 } else {
324 len = adb_read(inFd, buf, BUFSIZE);
325 }
326 if (len == 0) {
327 D("copy_to_file() : read 0 bytes; exiting\n");
328 break;
329 }
330 if (len < 0) {
331 if (errno == EINTR) {
332 D("copy_to_file() : EINTR, retrying\n");
333 continue;
334 }
335 D("copy_to_file() : error %d\n", errno);
336 break;
337 }
338 if (outFd == STDOUT_FILENO) {
339 fwrite(buf, 1, len, stdout);
340 fflush(stdout);
341 } else {
342 adb_write(outFd, buf, len);
343 }
344 total += len;
345 }
346
347 if (inFd == STDIN_FILENO) {
348 stdin_raw_restore(STDIN_FILENO);
349 }
350
351 D("copy_to_file() finished after %lu bytes\n", total);
352 free(buf);
353 }
354
stdin_read_thread(void * x)355 static void *stdin_read_thread(void *x)
356 {
357 int fd, fdi;
358 unsigned char buf[1024];
359 int r, n;
360 int state = 0;
361
362 int *fds = (int*) x;
363 fd = fds[0];
364 fdi = fds[1];
365 free(fds);
366
367 for(;;) {
368 /* fdi is really the client's stdin, so use read, not adb_read here */
369 D("stdin_read_thread(): pre unix_read(fdi=%d,...)\n", fdi);
370 r = unix_read(fdi, buf, 1024);
371 D("stdin_read_thread(): post unix_read(fdi=%d,...)\n", fdi);
372 if(r == 0) break;
373 if(r < 0) {
374 if(errno == EINTR) continue;
375 break;
376 }
377 for(n = 0; n < r; n++){
378 switch(buf[n]) {
379 case '\n':
380 state = 1;
381 break;
382 case '\r':
383 state = 1;
384 break;
385 case '~':
386 if(state == 1) state++;
387 break;
388 case '.':
389 if(state == 2) {
390 fprintf(stderr,"\n* disconnect *\n");
391 stdin_raw_restore(fdi);
392 exit(0);
393 }
394 default:
395 state = 0;
396 }
397 }
398 r = adb_write(fd, buf, r);
399 if(r <= 0) {
400 break;
401 }
402 }
403 return 0;
404 }
405
interactive_shell()406 static int interactive_shell() {
407 adb_thread_t thr;
408 int fdi;
409
410 std::string error;
411 int fd = adb_connect("shell:", &error);
412 if (fd < 0) {
413 fprintf(stderr,"error: %s\n", error.c_str());
414 return 1;
415 }
416 fdi = 0; //dup(0);
417
418 int* fds = reinterpret_cast<int*>(malloc(sizeof(int) * 2));
419 if (fds == nullptr) {
420 fprintf(stderr, "couldn't allocate fds array: %s\n", strerror(errno));
421 return 1;
422 }
423
424 fds[0] = fd;
425 fds[1] = fdi;
426
427 stdin_raw_init(fdi);
428 adb_thread_create(&thr, stdin_read_thread, fds);
429 read_and_dump(fd);
430 stdin_raw_restore(fdi);
431 return 0;
432 }
433
434
format_host_command(const char * command,transport_type type,const char * serial)435 static std::string format_host_command(const char* command, transport_type type, const char* serial) {
436 if (serial) {
437 return android::base::StringPrintf("host-serial:%s:%s", serial, command);
438 }
439
440 const char* prefix = "host";
441 if (type == kTransportUsb) {
442 prefix = "host-usb";
443 } else if (type == kTransportLocal) {
444 prefix = "host-local";
445 }
446 return android::base::StringPrintf("%s:%s", prefix, command);
447 }
448
adb_download_buffer(const char * service,const char * fn,const void * data,unsigned sz,bool show_progress)449 static int adb_download_buffer(const char *service, const char *fn, const void* data, unsigned sz,
450 bool show_progress)
451 {
452 std::string error;
453 int fd = adb_connect(android::base::StringPrintf("%s:%d", service, sz), &error);
454 if (fd < 0) {
455 fprintf(stderr,"error: %s\n", error.c_str());
456 return -1;
457 }
458
459 int opt = CHUNK_SIZE;
460 opt = adb_setsockopt(fd, SOL_SOCKET, SO_SNDBUF, (const void *) &opt, sizeof(opt));
461
462 unsigned total = sz;
463 const uint8_t* ptr = reinterpret_cast<const uint8_t*>(data);
464
465 if (show_progress) {
466 char *x = strrchr(service, ':');
467 if(x) service = x + 1;
468 }
469
470 while (sz > 0) {
471 unsigned xfer = (sz > CHUNK_SIZE) ? CHUNK_SIZE : sz;
472 if (!WriteFdExactly(fd, ptr, xfer)) {
473 std::string error;
474 adb_status(fd, &error);
475 fprintf(stderr,"* failed to write data '%s' *\n", error.c_str());
476 return -1;
477 }
478 sz -= xfer;
479 ptr += xfer;
480 if (show_progress) {
481 printf("sending: '%s' %4d%% \r", fn, (int)(100LL - ((100LL * sz) / (total))));
482 fflush(stdout);
483 }
484 }
485 if (show_progress) {
486 printf("\n");
487 }
488
489 if (!adb_status(fd, &error)) {
490 fprintf(stderr,"* error response '%s' *\n", error.c_str());
491 return -1;
492 }
493
494 adb_close(fd);
495 return 0;
496 }
497
498 #define SIDELOAD_HOST_BLOCK_SIZE (CHUNK_SIZE)
499
500 /*
501 * The sideload-host protocol serves the data in a file (given on the
502 * command line) to the client, using a simple protocol:
503 *
504 * - The connect message includes the total number of bytes in the
505 * file and a block size chosen by us.
506 *
507 * - The other side sends the desired block number as eight decimal
508 * digits (eg "00000023" for block 23). Blocks are numbered from
509 * zero.
510 *
511 * - We send back the data of the requested block. The last block is
512 * likely to be partial; when the last block is requested we only
513 * send the part of the block that exists, it's not padded up to the
514 * block size.
515 *
516 * - When the other side sends "DONEDONE" instead of a block number,
517 * we hang up.
518 */
adb_sideload_host(const char * fn)519 static int adb_sideload_host(const char* fn) {
520 unsigned sz;
521 size_t xfer = 0;
522 int status;
523 int last_percent = -1;
524 int opt = SIDELOAD_HOST_BLOCK_SIZE;
525
526 printf("loading: '%s'", fn);
527 fflush(stdout);
528 uint8_t* data = reinterpret_cast<uint8_t*>(load_file(fn, &sz));
529 if (data == 0) {
530 printf("\n");
531 fprintf(stderr, "* cannot read '%s' *\n", fn);
532 return -1;
533 }
534
535 std::string service =
536 android::base::StringPrintf("sideload-host:%d:%d", sz, SIDELOAD_HOST_BLOCK_SIZE);
537 std::string error;
538 int fd = adb_connect(service, &error);
539 if (fd < 0) {
540 // Try falling back to the older sideload method. Maybe this
541 // is an older device that doesn't support sideload-host.
542 printf("\n");
543 status = adb_download_buffer("sideload", fn, data, sz, true);
544 goto done;
545 }
546
547 opt = adb_setsockopt(fd, SOL_SOCKET, SO_SNDBUF, (const void *) &opt, sizeof(opt));
548
549 while (true) {
550 char buf[9];
551 if (!ReadFdExactly(fd, buf, 8)) {
552 fprintf(stderr, "* failed to read command: %s\n", strerror(errno));
553 status = -1;
554 goto done;
555 }
556 buf[8] = '\0';
557
558 if (strcmp("DONEDONE", buf) == 0) {
559 status = 0;
560 break;
561 }
562
563 int block = strtol(buf, NULL, 10);
564
565 size_t offset = block * SIDELOAD_HOST_BLOCK_SIZE;
566 if (offset >= sz) {
567 fprintf(stderr, "* attempt to read block %d past end\n", block);
568 status = -1;
569 goto done;
570 }
571 uint8_t* start = data + offset;
572 size_t offset_end = offset + SIDELOAD_HOST_BLOCK_SIZE;
573 size_t to_write = SIDELOAD_HOST_BLOCK_SIZE;
574 if (offset_end > sz) {
575 to_write = sz - offset;
576 }
577
578 if(!WriteFdExactly(fd, start, to_write)) {
579 adb_status(fd, &error);
580 fprintf(stderr,"* failed to write data '%s' *\n", error.c_str());
581 status = -1;
582 goto done;
583 }
584 xfer += to_write;
585
586 // For normal OTA packages, we expect to transfer every byte
587 // twice, plus a bit of overhead (one read during
588 // verification, one read of each byte for installation, plus
589 // extra access to things like the zip central directory).
590 // This estimate of the completion becomes 100% when we've
591 // transferred ~2.13 (=100/47) times the package size.
592 int percent = (int)(xfer * 47LL / (sz ? sz : 1));
593 if (percent != last_percent) {
594 printf("\rserving: '%s' (~%d%%) ", fn, percent);
595 fflush(stdout);
596 last_percent = percent;
597 }
598 }
599
600 printf("\rTotal xfer: %.2fx%*s\n", (double)xfer / (sz ? sz : 1), (int)strlen(fn)+10, "");
601
602 done:
603 if (fd >= 0) adb_close(fd);
604 free(data);
605 return status;
606 }
607
608 /**
609 * Run ppp in "notty" mode against a resource listed as the first parameter
610 * eg:
611 *
612 * ppp dev:/dev/omap_csmi_tty0 <ppp options>
613 *
614 */
ppp(int argc,const char ** argv)615 static int ppp(int argc, const char** argv) {
616 #if defined(_WIN32)
617 fprintf(stderr, "error: adb %s not implemented on Win32\n", argv[0]);
618 return -1;
619 #else
620 if (argc < 2) {
621 fprintf(stderr, "usage: adb %s <adb service name> [ppp opts]\n",
622 argv[0]);
623
624 return 1;
625 }
626
627 const char* adb_service_name = argv[1];
628 std::string error;
629 int fd = adb_connect(adb_service_name, &error);
630 if (fd < 0) {
631 fprintf(stderr,"Error: Could not open adb service: %s. Error: %s\n",
632 adb_service_name, error.c_str());
633 return 1;
634 }
635
636 pid_t pid = fork();
637
638 if (pid < 0) {
639 perror("from fork()");
640 return 1;
641 } else if (pid == 0) {
642 int err;
643 int i;
644 const char **ppp_args;
645
646 // copy args
647 ppp_args = (const char **) alloca(sizeof(char *) * argc + 1);
648 ppp_args[0] = "pppd";
649 for (i = 2 ; i < argc ; i++) {
650 //argv[2] and beyond become ppp_args[1] and beyond
651 ppp_args[i - 1] = argv[i];
652 }
653 ppp_args[i-1] = NULL;
654
655 // child side
656
657 dup2(fd, STDIN_FILENO);
658 dup2(fd, STDOUT_FILENO);
659 adb_close(STDERR_FILENO);
660 adb_close(fd);
661
662 err = execvp("pppd", (char * const *)ppp_args);
663
664 if (err < 0) {
665 perror("execing pppd");
666 }
667 exit(-1);
668 } else {
669 // parent side
670
671 adb_close(fd);
672 return 0;
673 }
674 #endif /* !defined(_WIN32) */
675 }
676
wait_for_device(const char * service,transport_type t,const char * serial)677 static bool wait_for_device(const char* service, transport_type t, const char* serial) {
678 // Was the caller vague about what they'd like us to wait for?
679 // If so, check they weren't more specific in their choice of transport type.
680 if (strcmp(service, "wait-for-device") == 0) {
681 if (t == kTransportUsb) {
682 service = "wait-for-usb";
683 } else if (t == kTransportLocal) {
684 service = "wait-for-local";
685 } else {
686 service = "wait-for-any";
687 }
688 }
689
690 std::string cmd = format_host_command(service, t, serial);
691 std::string error;
692 if (adb_command(cmd, &error)) {
693 D("failure: %s *\n", error.c_str());
694 fprintf(stderr,"error: %s\n", error.c_str());
695 return false;
696 }
697
698 return true;
699 }
700
send_shell_command(transport_type transport_type,const char * serial,const std::string & command)701 static int send_shell_command(transport_type transport_type, const char* serial,
702 const std::string& command) {
703 int fd;
704 while (true) {
705 std::string error;
706 fd = adb_connect(command, &error);
707 if (fd >= 0) {
708 break;
709 }
710 fprintf(stderr,"- waiting for device -\n");
711 adb_sleep_ms(1000);
712 wait_for_device("wait-for-device", transport_type, serial);
713 }
714
715 read_and_dump(fd);
716 int rc = adb_close(fd);
717 if (rc) {
718 perror("close");
719 }
720 return rc;
721 }
722
logcat(transport_type transport,const char * serial,int argc,const char ** argv)723 static int logcat(transport_type transport, const char* serial, int argc, const char** argv) {
724 char* log_tags = getenv("ANDROID_LOG_TAGS");
725 std::string quoted = escape_arg(log_tags == nullptr ? "" : log_tags);
726
727 std::string cmd = "shell:export ANDROID_LOG_TAGS=\"" + quoted + "\"; exec logcat";
728
729 if (!strcmp(argv[0], "longcat")) {
730 cmd += " -v long";
731 }
732
733 --argc;
734 ++argv;
735 while (argc-- > 0) {
736 cmd += " " + escape_arg(*argv++);
737 }
738
739 return send_shell_command(transport, serial, cmd);
740 }
741
mkdirs(const char * path)742 static int mkdirs(const char *path)
743 {
744 int ret;
745 char *x = (char *)path + 1;
746
747 for(;;) {
748 x = adb_dirstart(x);
749 if(x == 0) return 0;
750 *x = 0;
751 ret = adb_mkdir(path, 0775);
752 *x = OS_PATH_SEPARATOR;
753 if((ret < 0) && (errno != EEXIST)) {
754 return ret;
755 }
756 x++;
757 }
758 return 0;
759 }
760
backup(int argc,const char ** argv)761 static int backup(int argc, const char** argv) {
762 const char* filename = "./backup.ab";
763
764 /* find, extract, and use any -f argument */
765 for (int i = 1; i < argc; i++) {
766 if (!strcmp("-f", argv[i])) {
767 if (i == argc-1) {
768 fprintf(stderr, "adb: -f passed with no filename\n");
769 return usage();
770 }
771 filename = argv[i+1];
772 for (int j = i+2; j <= argc; ) {
773 argv[i++] = argv[j++];
774 }
775 argc -= 2;
776 argv[argc] = NULL;
777 }
778 }
779
780 /* bare "adb backup" or "adb backup -f filename" are not valid invocations */
781 if (argc < 2) return usage();
782
783 adb_unlink(filename);
784 mkdirs(filename);
785 int outFd = adb_creat(filename, 0640);
786 if (outFd < 0) {
787 fprintf(stderr, "adb: unable to open file %s\n", filename);
788 return -1;
789 }
790
791 std::string cmd = "backup:";
792 --argc;
793 ++argv;
794 while (argc-- > 0) {
795 cmd += " " + escape_arg(*argv++);
796 }
797
798 D("backup. filename=%s cmd=%s\n", filename, cmd.c_str());
799 std::string error;
800 int fd = adb_connect(cmd, &error);
801 if (fd < 0) {
802 fprintf(stderr, "adb: unable to connect for backup: %s\n", error.c_str());
803 adb_close(outFd);
804 return -1;
805 }
806
807 printf("Now unlock your device and confirm the backup operation.\n");
808 copy_to_file(fd, outFd);
809
810 adb_close(fd);
811 adb_close(outFd);
812 return 0;
813 }
814
restore(int argc,const char ** argv)815 static int restore(int argc, const char** argv) {
816 if (argc != 2) return usage();
817
818 const char* filename = argv[1];
819 int tarFd = adb_open(filename, O_RDONLY);
820 if (tarFd < 0) {
821 fprintf(stderr, "adb: unable to open file %s: %s\n", filename, strerror(errno));
822 return -1;
823 }
824
825 std::string error;
826 int fd = adb_connect("restore:", &error);
827 if (fd < 0) {
828 fprintf(stderr, "adb: unable to connect for restore: %s\n", error.c_str());
829 adb_close(tarFd);
830 return -1;
831 }
832
833 printf("Now unlock your device and confirm the restore operation.\n");
834 copy_to_file(tarFd, fd);
835
836 adb_close(fd);
837 adb_close(tarFd);
838 return 0;
839 }
840
841 /* <hint> may be:
842 * - A simple product name
843 * e.g., "sooner"
844 * - A relative path from the CWD to the ANDROID_PRODUCT_OUT dir
845 * e.g., "out/target/product/sooner"
846 * - An absolute path to the PRODUCT_OUT dir
847 * e.g., "/src/device/out/target/product/sooner"
848 *
849 * Given <hint>, try to construct an absolute path to the
850 * ANDROID_PRODUCT_OUT dir.
851 */
find_product_out_path(const char * hint)852 static std::string find_product_out_path(const char* hint) {
853 if (hint == NULL || hint[0] == '\0') {
854 return "";
855 }
856
857 // If it's already absolute, don't bother doing any work.
858 if (adb_is_absolute_host_path(hint)) {
859 return hint;
860 }
861
862 // If there are any slashes in it, assume it's a relative path;
863 // make it absolute.
864 if (adb_dirstart(hint) != nullptr) {
865 std::string cwd;
866 if (!getcwd(&cwd)) {
867 fprintf(stderr, "adb: getcwd failed: %s\n", strerror(errno));
868 return "";
869 }
870 return android::base::StringPrintf("%s%s%s", cwd.c_str(), OS_PATH_SEPARATOR_STR, hint);
871 }
872
873 // It's a string without any slashes. Try to do something with it.
874 //
875 // Try to find the root of the build tree, and build a PRODUCT_OUT
876 // path from there.
877 char* top = getenv("ANDROID_BUILD_TOP");
878 if (top == nullptr) {
879 fprintf(stderr, "adb: ANDROID_BUILD_TOP not set!\n");
880 return "";
881 }
882
883 std::string path = top;
884 path += OS_PATH_SEPARATOR_STR;
885 path += "out";
886 path += OS_PATH_SEPARATOR_STR;
887 path += "target";
888 path += OS_PATH_SEPARATOR_STR;
889 path += "product";
890 path += OS_PATH_SEPARATOR_STR;
891 path += hint;
892 if (!directory_exists(path)) {
893 fprintf(stderr, "adb: Couldn't find a product dir based on -p %s; "
894 "\"%s\" doesn't exist\n", hint, path.c_str());
895 return "";
896 }
897 return path;
898 }
899
parse_push_pull_args(const char ** arg,int narg,char const ** path1,char const ** path2,int * show_progress,int * copy_attrs)900 static void parse_push_pull_args(const char **arg, int narg, char const **path1,
901 char const **path2, int *show_progress,
902 int *copy_attrs) {
903 *show_progress = 0;
904 *copy_attrs = 0;
905
906 while (narg > 0) {
907 if (!strcmp(*arg, "-p")) {
908 *show_progress = 1;
909 } else if (!strcmp(*arg, "-a")) {
910 *copy_attrs = 1;
911 } else {
912 break;
913 }
914 ++arg;
915 --narg;
916 }
917
918 if (narg > 0) {
919 *path1 = *arg;
920 ++arg;
921 --narg;
922 }
923
924 if (narg > 0) {
925 *path2 = *arg;
926 }
927 }
928
adb_connect_command(const std::string & command)929 static int adb_connect_command(const std::string& command) {
930 std::string error;
931 int fd = adb_connect(command, &error);
932 if (fd < 0) {
933 fprintf(stderr, "error: %s\n", error.c_str());
934 return 1;
935 }
936 read_and_dump(fd);
937 adb_close(fd);
938 return 0;
939 }
940
adb_query_command(const std::string & command)941 static int adb_query_command(const std::string& command) {
942 std::string result;
943 std::string error;
944 if (!adb_query(command, &result, &error)) {
945 fprintf(stderr, "error: %s\n", error.c_str());
946 return 1;
947 }
948 printf("%s\n", result.c_str());
949 return 0;
950 }
951
adb_commandline(int argc,const char ** argv)952 int adb_commandline(int argc, const char **argv) {
953 int no_daemon = 0;
954 int is_daemon = 0;
955 int is_server = 0;
956 int persist = 0;
957 int r;
958 transport_type ttype = kTransportAny;
959 const char* serial = NULL;
960 const char* server_port_str = NULL;
961
962 // If defined, this should be an absolute path to
963 // the directory containing all of the various system images
964 // for a particular product. If not defined, and the adb
965 // command requires this information, then the user must
966 // specify the path using "-p".
967 char* ANDROID_PRODUCT_OUT = getenv("ANDROID_PRODUCT_OUT");
968 if (ANDROID_PRODUCT_OUT != nullptr) {
969 gProductOutPath = ANDROID_PRODUCT_OUT;
970 }
971 // TODO: also try TARGET_PRODUCT/TARGET_DEVICE as a hint
972
973 serial = getenv("ANDROID_SERIAL");
974
975 /* Validate and assign the server port */
976 server_port_str = getenv("ANDROID_ADB_SERVER_PORT");
977 int server_port = DEFAULT_ADB_PORT;
978 if (server_port_str && strlen(server_port_str) > 0) {
979 server_port = (int) strtol(server_port_str, NULL, 0);
980 if (server_port <= 0 || server_port > 65535) {
981 fprintf(stderr,
982 "adb: Env var ANDROID_ADB_SERVER_PORT must be a positive number less than 65535. Got \"%s\"\n",
983 server_port_str);
984 return usage();
985 }
986 }
987
988 /* modifiers and flags */
989 while (argc > 0) {
990 if (!strcmp(argv[0],"server")) {
991 is_server = 1;
992 } else if (!strcmp(argv[0],"nodaemon")) {
993 no_daemon = 1;
994 } else if (!strcmp(argv[0], "fork-server")) {
995 /* this is a special flag used only when the ADB client launches the ADB Server */
996 is_daemon = 1;
997 } else if (!strcmp(argv[0],"persist")) {
998 persist = 1;
999 } else if (!strncmp(argv[0], "-p", 2)) {
1000 const char *product = NULL;
1001 if (argv[0][2] == '\0') {
1002 if (argc < 2) return usage();
1003 product = argv[1];
1004 argc--;
1005 argv++;
1006 } else {
1007 product = argv[0] + 2;
1008 }
1009 gProductOutPath = find_product_out_path(product);
1010 if (gProductOutPath.empty()) {
1011 fprintf(stderr, "adb: could not resolve \"-p %s\"\n", product);
1012 return usage();
1013 }
1014 } else if (argv[0][0]=='-' && argv[0][1]=='s') {
1015 if (isdigit(argv[0][2])) {
1016 serial = argv[0] + 2;
1017 } else {
1018 if (argc < 2 || argv[0][2] != '\0') return usage();
1019 serial = argv[1];
1020 argc--;
1021 argv++;
1022 }
1023 } else if (!strcmp(argv[0],"-d")) {
1024 ttype = kTransportUsb;
1025 } else if (!strcmp(argv[0],"-e")) {
1026 ttype = kTransportLocal;
1027 } else if (!strcmp(argv[0],"-a")) {
1028 gListenAll = 1;
1029 } else if (!strncmp(argv[0], "-H", 2)) {
1030 const char *hostname = NULL;
1031 if (argv[0][2] == '\0') {
1032 if (argc < 2) return usage();
1033 hostname = argv[1];
1034 argc--;
1035 argv++;
1036 } else {
1037 hostname = argv[0] + 2;
1038 }
1039 adb_set_tcp_name(hostname);
1040
1041 } else if (!strncmp(argv[0], "-P", 2)) {
1042 if (argv[0][2] == '\0') {
1043 if (argc < 2) return usage();
1044 server_port_str = argv[1];
1045 argc--;
1046 argv++;
1047 } else {
1048 server_port_str = argv[0] + 2;
1049 }
1050 if (strlen(server_port_str) > 0) {
1051 server_port = (int) strtol(server_port_str, NULL, 0);
1052 if (server_port <= 0 || server_port > 65535) {
1053 fprintf(stderr,
1054 "adb: port number must be a positive number less than 65536. Got \"%s\"\n",
1055 server_port_str);
1056 return usage();
1057 }
1058 } else {
1059 fprintf(stderr,
1060 "adb: port number must be a positive number less than 65536. Got empty string.\n");
1061 return usage();
1062 }
1063 } else {
1064 /* out of recognized modifiers and flags */
1065 break;
1066 }
1067 argc--;
1068 argv++;
1069 }
1070
1071 adb_set_transport(ttype, serial);
1072 adb_set_tcp_specifics(server_port);
1073
1074 if (is_server) {
1075 if (no_daemon || is_daemon) {
1076 r = adb_main(is_daemon, server_port);
1077 } else {
1078 r = launch_server(server_port);
1079 }
1080 if (r) {
1081 fprintf(stderr,"* could not start server *\n");
1082 }
1083 return r;
1084 }
1085
1086 if (argc == 0) {
1087 return usage();
1088 }
1089
1090 /* handle wait-for-* prefix */
1091 if (!strncmp(argv[0], "wait-for-", strlen("wait-for-"))) {
1092 const char* service = argv[0];
1093
1094 if (!wait_for_device(service, ttype, serial)) {
1095 return 1;
1096 }
1097
1098 // Allow a command to be run after wait-for-device,
1099 // e.g. 'adb wait-for-device shell'.
1100 if (argc == 1) {
1101 return 0;
1102 }
1103
1104 /* Fall through */
1105 argc--;
1106 argv++;
1107 }
1108
1109 /* adb_connect() commands */
1110 if (!strcmp(argv[0], "devices")) {
1111 const char *listopt;
1112 if (argc < 2) {
1113 listopt = "";
1114 } else if (argc == 2 && !strcmp(argv[1], "-l")) {
1115 listopt = argv[1];
1116 } else {
1117 fprintf(stderr, "Usage: adb devices [-l]\n");
1118 return 1;
1119 }
1120
1121 std::string query = android::base::StringPrintf("host:%s%s", argv[0], listopt);
1122 printf("List of devices attached\n");
1123 return adb_query_command(query);
1124 }
1125 else if (!strcmp(argv[0], "connect")) {
1126 if (argc != 2) {
1127 fprintf(stderr, "Usage: adb connect <host>[:<port>]\n");
1128 return 1;
1129 }
1130
1131 std::string query = android::base::StringPrintf("host:connect:%s", argv[1]);
1132 return adb_query_command(query);
1133 }
1134 else if (!strcmp(argv[0], "disconnect")) {
1135 if (argc > 2) {
1136 fprintf(stderr, "Usage: adb disconnect [<host>[:<port>]]\n");
1137 return 1;
1138 }
1139
1140 std::string query = android::base::StringPrintf("host:disconnect:%s",
1141 (argc == 2) ? argv[1] : "");
1142 return adb_query_command(query);
1143 }
1144 else if (!strcmp(argv[0], "emu")) {
1145 return adb_send_emulator_command(argc, argv);
1146 }
1147 else if (!strcmp(argv[0], "shell") || !strcmp(argv[0], "hell")) {
1148 char h = (argv[0][0] == 'h');
1149
1150 if (h) {
1151 printf("\x1b[41;33m");
1152 fflush(stdout);
1153 }
1154
1155 if (argc < 2) {
1156 D("starting interactive shell\n");
1157 r = interactive_shell();
1158 if (h) {
1159 printf("\x1b[0m");
1160 fflush(stdout);
1161 }
1162 return r;
1163 }
1164
1165 std::string cmd = "shell:";
1166 --argc;
1167 ++argv;
1168 while (argc-- > 0) {
1169 // We don't escape here, just like ssh(1). http://b/20564385.
1170 cmd += *argv++;
1171 if (*argv) cmd += " ";
1172 }
1173
1174 while (true) {
1175 D("interactive shell loop. cmd=%s\n", cmd.c_str());
1176 std::string error;
1177 int fd = adb_connect(cmd, &error);
1178 int r;
1179 if (fd >= 0) {
1180 D("about to read_and_dump(fd=%d)\n", fd);
1181 read_and_dump(fd);
1182 D("read_and_dump() done.\n");
1183 adb_close(fd);
1184 r = 0;
1185 } else {
1186 fprintf(stderr,"error: %s\n", error.c_str());
1187 r = -1;
1188 }
1189
1190 if (persist) {
1191 fprintf(stderr,"\n- waiting for device -\n");
1192 adb_sleep_ms(1000);
1193 wait_for_device("wait-for-device", ttype, serial);
1194 } else {
1195 if (h) {
1196 printf("\x1b[0m");
1197 fflush(stdout);
1198 }
1199 D("interactive shell loop. return r=%d\n", r);
1200 return r;
1201 }
1202 }
1203 }
1204 else if (!strcmp(argv[0], "exec-in") || !strcmp(argv[0], "exec-out")) {
1205 int exec_in = !strcmp(argv[0], "exec-in");
1206
1207 std::string cmd = "exec:";
1208 cmd += argv[1];
1209 argc -= 2;
1210 argv += 2;
1211 while (argc-- > 0) {
1212 cmd += " " + escape_arg(*argv++);
1213 }
1214
1215 std::string error;
1216 int fd = adb_connect(cmd, &error);
1217 if (fd < 0) {
1218 fprintf(stderr, "error: %s\n", error.c_str());
1219 return -1;
1220 }
1221
1222 if (exec_in) {
1223 copy_to_file(STDIN_FILENO, fd);
1224 } else {
1225 copy_to_file(fd, STDOUT_FILENO);
1226 }
1227
1228 adb_close(fd);
1229 return 0;
1230 }
1231 else if (!strcmp(argv[0], "kill-server")) {
1232 std::string error;
1233 int fd = _adb_connect("host:kill", &error);
1234 if (fd == -1) {
1235 fprintf(stderr,"* server not running *\n");
1236 return 1;
1237 }
1238 return 0;
1239 }
1240 else if (!strcmp(argv[0], "sideload")) {
1241 if (argc != 2) return usage();
1242 if (adb_sideload_host(argv[1])) {
1243 return 1;
1244 } else {
1245 return 0;
1246 }
1247 }
1248 else if (!strcmp(argv[0], "remount") ||
1249 !strcmp(argv[0], "reboot") ||
1250 !strcmp(argv[0], "reboot-bootloader") ||
1251 !strcmp(argv[0], "tcpip") ||
1252 !strcmp(argv[0], "usb") ||
1253 !strcmp(argv[0], "root") ||
1254 !strcmp(argv[0], "unroot") ||
1255 !strcmp(argv[0], "disable-verity") ||
1256 !strcmp(argv[0], "enable-verity")) {
1257 std::string command;
1258 if (!strcmp(argv[0], "reboot-bootloader")) {
1259 command = "reboot:bootloader";
1260 } else if (argc > 1) {
1261 command = android::base::StringPrintf("%s:%s", argv[0], argv[1]);
1262 } else {
1263 command = android::base::StringPrintf("%s:", argv[0]);
1264 }
1265 return adb_connect_command(command);
1266 }
1267 else if (!strcmp(argv[0], "bugreport")) {
1268 if (argc != 1) return usage();
1269 return send_shell_command(ttype, serial, "shell:bugreport");
1270 }
1271 /* adb_command() wrapper commands */
1272 else if (!strcmp(argv[0], "forward") || !strcmp(argv[0], "reverse")) {
1273 std::string cmd;
1274 char host_prefix[64];
1275 char reverse = (char) !strcmp(argv[0], "reverse");
1276 char remove = 0;
1277 char remove_all = 0;
1278 char list = 0;
1279 char no_rebind = 0;
1280
1281 // Parse options here.
1282 while (argc > 1 && argv[1][0] == '-') {
1283 if (!strcmp(argv[1], "--list"))
1284 list = 1;
1285 else if (!strcmp(argv[1], "--remove"))
1286 remove = 1;
1287 else if (!strcmp(argv[1], "--remove-all"))
1288 remove_all = 1;
1289 else if (!strcmp(argv[1], "--no-rebind"))
1290 no_rebind = 1;
1291 else {
1292 return usage();
1293 }
1294 argc--;
1295 argv++;
1296 }
1297
1298 // Ensure we can only use one option at a time.
1299 if (list + remove + remove_all + no_rebind > 1) {
1300 return usage();
1301 }
1302
1303 // Determine the <host-prefix> for this command.
1304 if (reverse) {
1305 snprintf(host_prefix, sizeof host_prefix, "reverse");
1306 } else {
1307 if (serial) {
1308 snprintf(host_prefix, sizeof host_prefix, "host-serial:%s",
1309 serial);
1310 } else if (ttype == kTransportUsb) {
1311 snprintf(host_prefix, sizeof host_prefix, "host-usb");
1312 } else if (ttype == kTransportLocal) {
1313 snprintf(host_prefix, sizeof host_prefix, "host-local");
1314 } else {
1315 snprintf(host_prefix, sizeof host_prefix, "host");
1316 }
1317 }
1318
1319 // Implement forward --list
1320 if (list) {
1321 if (argc != 1) {
1322 return usage();
1323 }
1324
1325 std::string query = android::base::StringPrintf("%s:list-forward", host_prefix);
1326 return adb_query_command(query);
1327 }
1328
1329 // Implement forward --remove-all
1330 else if (remove_all) {
1331 if (argc != 1) return usage();
1332 cmd = android::base::StringPrintf("%s:killforward-all", host_prefix);
1333 }
1334
1335 // Implement forward --remove <local>
1336 else if (remove) {
1337 if (argc != 2) return usage();
1338 cmd = android::base::StringPrintf("%s:killforward:%s", host_prefix, argv[1]);
1339 }
1340 // Or implement one of:
1341 // forward <local> <remote>
1342 // forward --no-rebind <local> <remote>
1343 else {
1344 if (argc != 3) return usage();
1345 const char* command = no_rebind ? "forward:norebind" : "forward";
1346 cmd = android::base::StringPrintf("%s:%s:%s;%s", host_prefix, command, argv[1], argv[2]);
1347 }
1348
1349 std::string error;
1350 if (adb_command(cmd, &error)) {
1351 fprintf(stderr, "error: %s\n", error.c_str());
1352 return 1;
1353 }
1354 return 0;
1355 }
1356 /* do_sync_*() commands */
1357 else if (!strcmp(argv[0], "ls")) {
1358 if (argc != 2) return usage();
1359 return do_sync_ls(argv[1]);
1360 }
1361 else if (!strcmp(argv[0], "push")) {
1362 int show_progress = 0;
1363 int copy_attrs = 0; // unused
1364 const char* lpath = NULL, *rpath = NULL;
1365
1366 parse_push_pull_args(&argv[1], argc - 1, &lpath, &rpath, &show_progress, ©_attrs);
1367
1368 if ((lpath != NULL) && (rpath != NULL)) {
1369 return do_sync_push(lpath, rpath, show_progress);
1370 }
1371
1372 return usage();
1373 }
1374 else if (!strcmp(argv[0], "pull")) {
1375 int show_progress = 0;
1376 int copy_attrs = 0;
1377 const char* rpath = NULL, *lpath = ".";
1378
1379 parse_push_pull_args(&argv[1], argc - 1, &rpath, &lpath, &show_progress, ©_attrs);
1380
1381 if (rpath != NULL) {
1382 return do_sync_pull(rpath, lpath, show_progress, copy_attrs);
1383 }
1384
1385 return usage();
1386 }
1387 else if (!strcmp(argv[0], "install")) {
1388 if (argc < 2) return usage();
1389 return install_app(ttype, serial, argc, argv);
1390 }
1391 else if (!strcmp(argv[0], "install-multiple")) {
1392 if (argc < 2) return usage();
1393 return install_multiple_app(ttype, serial, argc, argv);
1394 }
1395 else if (!strcmp(argv[0], "uninstall")) {
1396 if (argc < 2) return usage();
1397 return uninstall_app(ttype, serial, argc, argv);
1398 }
1399 else if (!strcmp(argv[0], "sync")) {
1400 std::string src;
1401 bool list_only = false;
1402 if (argc < 2) {
1403 // No local path was specified.
1404 src = "";
1405 } else if (argc >= 2 && strcmp(argv[1], "-l") == 0) {
1406 list_only = true;
1407 if (argc == 3) {
1408 src = argv[2];
1409 } else {
1410 src = "";
1411 }
1412 } else if (argc == 2) {
1413 // A local path or "android"/"data" arg was specified.
1414 src = argv[1];
1415 } else {
1416 return usage();
1417 }
1418
1419 if (src != "" &&
1420 src != "system" && src != "data" && src != "vendor" && src != "oem") {
1421 return usage();
1422 }
1423
1424 std::string system_src_path = product_file("system");
1425 std::string data_src_path = product_file("data");
1426 std::string vendor_src_path = product_file("vendor");
1427 std::string oem_src_path = product_file("oem");
1428
1429 int rc = 0;
1430 if (rc == 0 && (src.empty() || src == "system")) {
1431 rc = do_sync_sync(system_src_path, "/system", list_only);
1432 }
1433 if (rc == 0 && (src.empty() || src == "vendor") && directory_exists(vendor_src_path)) {
1434 rc = do_sync_sync(vendor_src_path, "/vendor", list_only);
1435 }
1436 if (rc == 0 && (src.empty() || src == "oem") && directory_exists(oem_src_path)) {
1437 rc = do_sync_sync(oem_src_path, "/oem", list_only);
1438 }
1439 if (rc == 0 && (src.empty() || src == "data")) {
1440 rc = do_sync_sync(data_src_path, "/data", list_only);
1441 }
1442 return rc;
1443 }
1444 /* passthrough commands */
1445 else if (!strcmp(argv[0],"get-state") ||
1446 !strcmp(argv[0],"get-serialno") ||
1447 !strcmp(argv[0],"get-devpath"))
1448 {
1449 return adb_query_command(format_host_command(argv[0], ttype, serial));
1450 }
1451 /* other commands */
1452 else if (!strcmp(argv[0],"logcat") || !strcmp(argv[0],"lolcat") || !strcmp(argv[0],"longcat")) {
1453 return logcat(ttype, serial, argc, argv);
1454 }
1455 else if (!strcmp(argv[0],"ppp")) {
1456 return ppp(argc, argv);
1457 }
1458 else if (!strcmp(argv[0], "start-server")) {
1459 std::string error;
1460 return adb_connect("host:start-server", &error);
1461 }
1462 else if (!strcmp(argv[0], "backup")) {
1463 return backup(argc, argv);
1464 }
1465 else if (!strcmp(argv[0], "restore")) {
1466 return restore(argc, argv);
1467 }
1468 else if (!strcmp(argv[0], "keygen")) {
1469 if (argc < 2) return usage();
1470 return adb_auth_keygen(argv[1]);
1471 }
1472 else if (!strcmp(argv[0], "jdwp")) {
1473 return adb_connect_command("jdwp");
1474 }
1475 /* "adb /?" is a common idiom under Windows */
1476 else if (!strcmp(argv[0], "help") || !strcmp(argv[0], "/?")) {
1477 help();
1478 return 0;
1479 }
1480 else if (!strcmp(argv[0], "version")) {
1481 version(stdout);
1482 return 0;
1483 }
1484
1485 usage();
1486 return 1;
1487 }
1488
pm_command(transport_type transport,const char * serial,int argc,const char ** argv)1489 static int pm_command(transport_type transport, const char* serial,
1490 int argc, const char** argv)
1491 {
1492 std::string cmd = "shell:pm";
1493
1494 while (argc-- > 0) {
1495 cmd += " " + escape_arg(*argv++);
1496 }
1497
1498 return send_shell_command(transport, serial, cmd);
1499 }
1500
uninstall_app(transport_type transport,const char * serial,int argc,const char ** argv)1501 static int uninstall_app(transport_type transport, const char* serial, int argc,
1502 const char** argv)
1503 {
1504 /* if the user choose the -k option, we refuse to do it until devices are
1505 out with the option to uninstall the remaining data somehow (adb/ui) */
1506 if (argc == 3 && strcmp(argv[1], "-k") == 0)
1507 {
1508 printf(
1509 "The -k option uninstalls the application while retaining the data/cache.\n"
1510 "At the moment, there is no way to remove the remaining data.\n"
1511 "You will have to reinstall the application with the same signature, and fully uninstall it.\n"
1512 "If you truly wish to continue, execute 'adb shell pm uninstall -k %s'\n", argv[2]);
1513 return -1;
1514 }
1515
1516 /* 'adb uninstall' takes the same arguments as 'pm uninstall' on device */
1517 return pm_command(transport, serial, argc, argv);
1518 }
1519
delete_file(transport_type transport,const char * serial,char * filename)1520 static int delete_file(transport_type transport, const char* serial, char* filename)
1521 {
1522 std::string cmd = "shell:rm -f " + escape_arg(filename);
1523 return send_shell_command(transport, serial, cmd);
1524 }
1525
get_basename(const char * filename)1526 static const char* get_basename(const char* filename)
1527 {
1528 const char* basename = adb_dirstop(filename);
1529 if (basename) {
1530 basename++;
1531 return basename;
1532 } else {
1533 return filename;
1534 }
1535 }
1536
install_app(transport_type transport,const char * serial,int argc,const char ** argv)1537 static int install_app(transport_type transport, const char* serial, int argc,
1538 const char** argv)
1539 {
1540 static const char *const DATA_DEST = "/data/local/tmp/%s";
1541 static const char *const SD_DEST = "/sdcard/tmp/%s";
1542 const char* where = DATA_DEST;
1543 int i;
1544 struct stat sb;
1545
1546 for (i = 1; i < argc; i++) {
1547 if (!strcmp(argv[i], "-s")) {
1548 where = SD_DEST;
1549 }
1550 }
1551
1552 // Find last APK argument.
1553 // All other arguments passed through verbatim.
1554 int last_apk = -1;
1555 for (i = argc - 1; i >= 0; i--) {
1556 const char* file = argv[i];
1557 char* dot = strrchr(file, '.');
1558 if (dot && !strcasecmp(dot, ".apk")) {
1559 if (stat(file, &sb) == -1 || !S_ISREG(sb.st_mode)) {
1560 fprintf(stderr, "Invalid APK file: %s\n", file);
1561 return -1;
1562 }
1563
1564 last_apk = i;
1565 break;
1566 }
1567 }
1568
1569 if (last_apk == -1) {
1570 fprintf(stderr, "Missing APK file\n");
1571 return -1;
1572 }
1573
1574 const char* apk_file = argv[last_apk];
1575 char apk_dest[PATH_MAX];
1576 snprintf(apk_dest, sizeof apk_dest, where, get_basename(apk_file));
1577 int err = do_sync_push(apk_file, apk_dest, 0 /* no show progress */);
1578 if (err) {
1579 goto cleanup_apk;
1580 } else {
1581 argv[last_apk] = apk_dest; /* destination name, not source location */
1582 }
1583
1584 err = pm_command(transport, serial, argc, argv);
1585
1586 cleanup_apk:
1587 delete_file(transport, serial, apk_dest);
1588 return err;
1589 }
1590
install_multiple_app(transport_type transport,const char * serial,int argc,const char ** argv)1591 static int install_multiple_app(transport_type transport, const char* serial, int argc,
1592 const char** argv)
1593 {
1594 int i;
1595 struct stat sb;
1596 uint64_t total_size = 0;
1597
1598 // Find all APK arguments starting at end.
1599 // All other arguments passed through verbatim.
1600 int first_apk = -1;
1601 for (i = argc - 1; i >= 0; i--) {
1602 const char* file = argv[i];
1603 char* dot = strrchr(file, '.');
1604 if (dot && !strcasecmp(dot, ".apk")) {
1605 if (stat(file, &sb) == -1 || !S_ISREG(sb.st_mode)) {
1606 fprintf(stderr, "Invalid APK file: %s\n", file);
1607 return -1;
1608 }
1609
1610 total_size += sb.st_size;
1611 first_apk = i;
1612 } else {
1613 break;
1614 }
1615 }
1616
1617 if (first_apk == -1) {
1618 fprintf(stderr, "Missing APK file\n");
1619 return 1;
1620 }
1621
1622 #if defined(_WIN32) // Remove when we're using clang for Win32.
1623 std::string cmd = android::base::StringPrintf("exec:pm install-create -S %u", (unsigned) total_size);
1624 #else
1625 std::string cmd = android::base::StringPrintf("exec:pm install-create -S %" PRIu64, total_size);
1626 #endif
1627 for (i = 1; i < first_apk; i++) {
1628 cmd += " " + escape_arg(argv[i]);
1629 }
1630
1631 // Create install session
1632 std::string error;
1633 int fd = adb_connect(cmd, &error);
1634 if (fd < 0) {
1635 fprintf(stderr, "Connect error for create: %s\n", error.c_str());
1636 return -1;
1637 }
1638 char buf[BUFSIZ];
1639 read_status_line(fd, buf, sizeof(buf));
1640 adb_close(fd);
1641
1642 int session_id = -1;
1643 if (!strncmp("Success", buf, 7)) {
1644 char* start = strrchr(buf, '[');
1645 char* end = strrchr(buf, ']');
1646 if (start && end) {
1647 *end = '\0';
1648 session_id = strtol(start + 1, NULL, 10);
1649 }
1650 }
1651 if (session_id < 0) {
1652 fprintf(stderr, "Failed to create session\n");
1653 fputs(buf, stderr);
1654 return -1;
1655 }
1656
1657 // Valid session, now stream the APKs
1658 int success = 1;
1659 for (i = first_apk; i < argc; i++) {
1660 const char* file = argv[i];
1661 if (stat(file, &sb) == -1) {
1662 fprintf(stderr, "Failed to stat %s\n", file);
1663 success = 0;
1664 goto finalize_session;
1665 }
1666
1667 #if defined(_WIN32) // Remove when we're using clang for Win32.
1668 std::string cmd = android::base::StringPrintf(
1669 "exec:pm install-write -S %u %d %d_%s -",
1670 (unsigned) sb.st_size, session_id, i, get_basename(file));
1671 #else
1672 std::string cmd = android::base::StringPrintf(
1673 "exec:pm install-write -S %" PRIu64 " %d %d_%s -",
1674 static_cast<uint64_t>(sb.st_size), session_id, i, get_basename(file));
1675 #endif
1676
1677 int localFd = adb_open(file, O_RDONLY);
1678 if (localFd < 0) {
1679 fprintf(stderr, "Failed to open %s: %s\n", file, strerror(errno));
1680 success = 0;
1681 goto finalize_session;
1682 }
1683
1684 std::string error;
1685 int remoteFd = adb_connect(cmd, &error);
1686 if (remoteFd < 0) {
1687 fprintf(stderr, "Connect error for write: %s\n", error.c_str());
1688 adb_close(localFd);
1689 success = 0;
1690 goto finalize_session;
1691 }
1692
1693 copy_to_file(localFd, remoteFd);
1694 read_status_line(remoteFd, buf, sizeof(buf));
1695
1696 adb_close(localFd);
1697 adb_close(remoteFd);
1698
1699 if (strncmp("Success", buf, 7)) {
1700 fprintf(stderr, "Failed to write %s\n", file);
1701 fputs(buf, stderr);
1702 success = 0;
1703 goto finalize_session;
1704 }
1705 }
1706
1707 finalize_session:
1708 // Commit session if we streamed everything okay; otherwise abandon
1709 std::string service =
1710 android::base::StringPrintf("exec:pm install-%s %d",
1711 success ? "commit" : "abandon", session_id);
1712 fd = adb_connect(service, &error);
1713 if (fd < 0) {
1714 fprintf(stderr, "Connect error for finalize: %s\n", error.c_str());
1715 return -1;
1716 }
1717 read_status_line(fd, buf, sizeof(buf));
1718 adb_close(fd);
1719
1720 if (!strncmp("Success", buf, 7)) {
1721 fputs(buf, stderr);
1722 return 0;
1723 } else {
1724 fprintf(stderr, "Failed to finalize session\n");
1725 fputs(buf, stderr);
1726 return -1;
1727 }
1728 }
1729