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