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 #include <thread> 37 #include <vector> 38 39 #include <android-base/file.h> 40 #include <android-base/logging.h> 41 #include <android-base/parseint.h> 42 #include <android-base/stringprintf.h> 43 #include <android-base/strings.h> 44 45 #if !defined(_WIN32) 46 #include <signal.h> 47 #include <sys/ioctl.h> 48 #include <termios.h> 49 #include <unistd.h> 50 #endif 51 52 #include "adb.h" 53 #include "adb_auth.h" 54 #include "adb_client.h" 55 #include "adb_io.h" 56 #include "adb_unique_fd.h" 57 #include "adb_utils.h" 58 #include "bugreport.h" 59 #include "commandline.h" 60 #include "file_sync_service.h" 61 #include "services.h" 62 #include "shell_service.h" 63 #include "sysdeps/chrono.h" 64 65 static int install_app(TransportType t, const char* serial, int argc, const char** argv); 66 static int install_multiple_app(TransportType t, const char* serial, int argc, const char** argv); 67 static int uninstall_app(TransportType t, const char* serial, int argc, const char** argv); 68 static int install_app_legacy(TransportType t, const char* serial, int argc, const char** argv); 69 static int uninstall_app_legacy(TransportType t, const char* serial, int argc, const char** argv); 70 71 static auto& gProductOutPath = *new std::string(); 72 extern int gListenAll; 73 74 DefaultStandardStreamsCallback DEFAULT_STANDARD_STREAMS_CALLBACK(nullptr, nullptr); 75 76 static std::string product_file(const char *extra) { 77 if (gProductOutPath.empty()) { 78 fprintf(stderr, "adb: Product directory not specified; " 79 "use -p or define ANDROID_PRODUCT_OUT\n"); 80 exit(1); 81 } 82 83 return android::base::StringPrintf("%s%s%s", 84 gProductOutPath.c_str(), OS_PATH_SEPARATOR_STR, extra); 85 } 86 87 static void help() { 88 fprintf(stdout, "%s\n", adb_version().c_str()); 89 // clang-format off 90 fprintf(stdout, 91 "global options:\n" 92 " -a listen on all network interfaces, not just localhost\n" 93 " -d use USB device (error if multiple devices connected)\n" 94 " -e use TCP/IP device (error if multiple TCP/IP devices available)\n" 95 " -s SERIAL\n" 96 " use device with given serial number (overrides $ANDROID_SERIAL)\n" 97 " -p PRODUCT\n" 98 " name or path ('angler'/'out/target/product/angler');\n" 99 " default $ANDROID_PRODUCT_OUT\n" 100 " -H name of adb server host [default=localhost]\n" 101 " -P port of adb server [default=5037]\n" 102 " -L SOCKET listen on given socket for adb server [default=tcp:localhost:5037]\n" 103 "\n" 104 "general commands:\n" 105 " devices [-l] list connected devices (-l for long output)\n" 106 " help show this help message\n" 107 " version show version num\n" 108 "\n" 109 "networking:\n" 110 " connect HOST[:PORT] connect to a device via TCP/IP [default port=5555]\n" 111 " disconnect [HOST[:PORT]]\n" 112 " disconnect from given TCP/IP device [default port=5555], or all\n" 113 " forward --list list all forward socket connections\n" 114 " forward [--no-rebind] LOCAL REMOTE\n" 115 " forward socket connection using:\n" 116 " tcp:<port> (<local> may be \"tcp:0\" to pick any open port)\n" 117 " localabstract:<unix domain socket name>\n" 118 " localreserved:<unix domain socket name>\n" 119 " localfilesystem:<unix domain socket name>\n" 120 " dev:<character device name>\n" 121 " jdwp:<process pid> (remote only)\n" 122 " forward --remove LOCAL remove specific forward socket connection\n" 123 " forward --remove-all remove all forward socket connections\n" 124 " ppp TTY [PARAMETER...] run PPP over USB\n" 125 " reverse --list list all reverse socket connections from device\n" 126 " reverse [--no-rebind] REMOTE LOCAL\n" 127 " reverse socket connection using:\n" 128 " tcp:<port> (<remote> may be \"tcp:0\" to pick any open port)\n" 129 " localabstract:<unix domain socket name>\n" 130 " localreserved:<unix domain socket name>\n" 131 " localfilesystem:<unix domain socket name>\n" 132 " reverse --remove REMOTE remove specific reverse socket connection\n" 133 " reverse --remove-all remove all reverse socket connections from device\n" 134 "\n" 135 "file transfer:\n" 136 " push LOCAL... REMOTE\n" 137 " copy local files/directories to device\n" 138 " pull [-a] REMOTE... LOCAL\n" 139 " copy files/dirs from device\n" 140 " -a: preserve file timestamp and mode\n" 141 " sync [DIR]\n" 142 " copy all changed files to device; if DIR is \"system\", \"vendor\", \"oem\",\n" 143 " or \"data\", only sync that partition (default all)\n" 144 " -l: list but don't copy\n" 145 "\n" 146 "shell:\n" 147 " shell [-e ESCAPE] [-n] [-Tt] [-x] [COMMAND...]\n" 148 " run remote shell command (interactive shell if no command given)\n" 149 " -e: choose escape character, or \"none\"; default '~'\n" 150 " -n: don't read from stdin\n" 151 " -T: disable PTY allocation\n" 152 " -t: force PTY allocation\n" 153 " -x: disable remote exit codes and stdout/stderr separation\n" 154 " emu COMMAND run emulator console command\n" 155 "\n" 156 "app installation:\n" 157 " install [-lrtsdg] PACKAGE\n" 158 " install-multiple [-lrtsdpg] PACKAGE...\n" 159 " push package(s) to the device and install them\n" 160 " -l: forward lock application\n" 161 " -r: replace existing application\n" 162 " -t: allow test packages\n" 163 " -s: install application on sdcard\n" 164 " -d: allow version code downgrade (debuggable packages only)\n" 165 " -p: partial application install (install-multiple only)\n" 166 " -g: grant all runtime permissions\n" 167 " uninstall [-k] PACKAGE\n" 168 " remove this app package from the device\n" 169 " '-k': keep the data and cache directories\n" 170 "\n" 171 "backup/restore:\n" 172 " backup [-f FILE] [-apk|-noapk] [-obb|-noobb] [-shared|-noshared] [-all] [-system|-nosystem] [PACKAGE...]\n" 173 " write an archive of the device's data to FILE [default=backup.adb]\n" 174 " package list optional if -all/-shared are supplied\n" 175 " -apk/-noapk: do/don't back up .apk files (default -noapk)\n" 176 " -obb/-noobb: do/don't back up .obb files (default -noobb)\n" 177 " -shared|-noshared: do/don't back up shared storage (default -noshared)\n" 178 " -all: back up all installed applications\n" 179 " -system|-nosystem: include system apps in -all (default -system)\n" 180 " restore FILE restore device contents from FILE\n" 181 "\n" 182 "debugging:\n" 183 " bugreport [PATH]\n" 184 " write bugreport to given PATH [default=bugreport.zip];\n" 185 " if PATH is a directory, the bug report is saved in that directory.\n" 186 " devices that don't support zipped bug reports output to stdout.\n" 187 " jdwp list pids of processes hosting a JDWP transport\n" 188 " logcat show device log (logcat --help for more)\n" 189 "\n" 190 "security:\n" 191 " disable-verity disable dm-verity checking on userdebug builds\n" 192 " enable-verity re-enable dm-verity checking on userdebug builds\n" 193 " keygen FILE\n" 194 " generate adb public/private key; private key stored in FILE,\n" 195 " public key stored in FILE.pub (existing files overwritten)\n" 196 "\n" 197 "scripting:\n" 198 " wait-for[-TRANSPORT]-STATE\n" 199 " wait for device to be in the given state\n" 200 " State: device, recovery, sideload, or bootloader\n" 201 " Transport: usb, local, or any [default=any]\n" 202 " get-state print offline | bootloader | device\n" 203 " get-serialno print <serial-number>\n" 204 " get-devpath print <device-path>\n" 205 " remount\n" 206 " remount /system, /vendor, and /oem partitions read-write\n" 207 " reboot [bootloader|recovery|sideload|sideload-auto-reboot]\n" 208 " reboot the device; defaults to booting system image but\n" 209 " supports bootloader and recovery too. sideload reboots\n" 210 " into recovery and automatically starts sideload mode,\n" 211 " sideload-auto-reboot is the same but reboots after sideloading.\n" 212 " sideload OTAPACKAGE sideload the given full OTA package\n" 213 " root restart adbd with root permissions\n" 214 " unroot restart adbd without root permissions\n" 215 " usb restart adb server listening on USB\n" 216 " tcpip PORT restart adb server listening on TCP on PORT\n" 217 "\n" 218 "internal debugging:\n" 219 " start-server ensure that there is a server running\n" 220 " kill-server kill the server if it is running\n" 221 " reconnect kick connection from host side to force reconnect\n" 222 " reconnect device kick connection from device side to force reconnect\n" 223 "\n" 224 "environment variables:\n" 225 " $ADB_TRACE\n" 226 " comma-separated list of debug info to log:\n" 227 " all,adb,sockets,packets,rwx,usb,sync,sysdeps,transport,jdwp\n" 228 " $ADB_VENDOR_KEYS colon-separated list of keys (files or directories)\n" 229 " $ANDROID_SERIAL serial number to connect to (see -s)\n" 230 " $ANDROID_LOG_TAGS tags to be used by logcat (see logcat --help)\n"); 231 // clang-format on 232 } 233 234 #if defined(_WIN32) 235 236 // Implemented in sysdeps_win32.cpp. 237 void stdin_raw_init(); 238 void stdin_raw_restore(); 239 240 #else 241 static termios g_saved_terminal_state; 242 243 static void stdin_raw_init() { 244 if (tcgetattr(STDIN_FILENO, &g_saved_terminal_state)) return; 245 246 termios tio; 247 if (tcgetattr(STDIN_FILENO, &tio)) return; 248 249 cfmakeraw(&tio); 250 251 // No timeout but request at least one character per read. 252 tio.c_cc[VTIME] = 0; 253 tio.c_cc[VMIN] = 1; 254 255 tcsetattr(STDIN_FILENO, TCSAFLUSH, &tio); 256 } 257 258 static void stdin_raw_restore() { 259 tcsetattr(STDIN_FILENO, TCSAFLUSH, &g_saved_terminal_state); 260 } 261 #endif 262 263 // Reads from |fd| and prints received data. If |use_shell_protocol| is true 264 // this expects that incoming data will use the shell protocol, in which case 265 // stdout/stderr are routed independently and the remote exit code will be 266 // returned. 267 // if |callback| is non-null, stdout/stderr output will be handled by it. 268 int read_and_dump(int fd, bool use_shell_protocol = false, 269 StandardStreamsCallbackInterface* callback = &DEFAULT_STANDARD_STREAMS_CALLBACK) { 270 int exit_code = 0; 271 if (fd < 0) return exit_code; 272 273 std::unique_ptr<ShellProtocol> protocol; 274 int length = 0; 275 276 char raw_buffer[BUFSIZ]; 277 char* buffer_ptr = raw_buffer; 278 if (use_shell_protocol) { 279 protocol.reset(new ShellProtocol(fd)); 280 if (!protocol) { 281 LOG(ERROR) << "failed to allocate memory for ShellProtocol object"; 282 return 1; 283 } 284 buffer_ptr = protocol->data(); 285 } 286 287 while (true) { 288 if (use_shell_protocol) { 289 if (!protocol->Read()) { 290 break; 291 } 292 length = protocol->data_length(); 293 switch (protocol->id()) { 294 case ShellProtocol::kIdStdout: 295 callback->OnStdout(buffer_ptr, length); 296 break; 297 case ShellProtocol::kIdStderr: 298 callback->OnStderr(buffer_ptr, length); 299 break; 300 case ShellProtocol::kIdExit: 301 exit_code = protocol->data()[0]; 302 continue; 303 default: 304 continue; 305 } 306 length = protocol->data_length(); 307 } else { 308 D("read_and_dump(): pre adb_read(fd=%d)", fd); 309 length = adb_read(fd, raw_buffer, sizeof(raw_buffer)); 310 D("read_and_dump(): post adb_read(fd=%d): length=%d", fd, length); 311 if (length <= 0) { 312 break; 313 } 314 callback->OnStdout(buffer_ptr, length); 315 } 316 } 317 318 return callback->Done(exit_code); 319 } 320 321 static void read_status_line(int fd, char* buf, size_t count) 322 { 323 count--; 324 while (count > 0) { 325 int len = adb_read(fd, buf, count); 326 if (len <= 0) { 327 break; 328 } 329 330 buf += len; 331 count -= len; 332 } 333 *buf = '\0'; 334 } 335 336 static void stdinout_raw_prologue(int inFd, int outFd, int& old_stdin_mode, int& old_stdout_mode) { 337 if (inFd == STDIN_FILENO) { 338 stdin_raw_init(); 339 #ifdef _WIN32 340 old_stdin_mode = _setmode(STDIN_FILENO, _O_BINARY); 341 if (old_stdin_mode == -1) { 342 fatal_errno("could not set stdin to binary"); 343 } 344 #endif 345 } 346 347 #ifdef _WIN32 348 if (outFd == STDOUT_FILENO) { 349 old_stdout_mode = _setmode(STDOUT_FILENO, _O_BINARY); 350 if (old_stdout_mode == -1) { 351 fatal_errno("could not set stdout to binary"); 352 } 353 } 354 #endif 355 } 356 357 static void stdinout_raw_epilogue(int inFd, int outFd, int old_stdin_mode, int old_stdout_mode) { 358 if (inFd == STDIN_FILENO) { 359 stdin_raw_restore(); 360 #ifdef _WIN32 361 if (_setmode(STDIN_FILENO, old_stdin_mode) == -1) { 362 fatal_errno("could not restore stdin mode"); 363 } 364 #endif 365 } 366 367 #ifdef _WIN32 368 if (outFd == STDOUT_FILENO) { 369 if (_setmode(STDOUT_FILENO, old_stdout_mode) == -1) { 370 fatal_errno("could not restore stdout mode"); 371 } 372 } 373 #endif 374 } 375 376 static void copy_to_file(int inFd, int outFd) { 377 const size_t BUFSIZE = 32 * 1024; 378 char* buf = (char*) malloc(BUFSIZE); 379 if (buf == nullptr) fatal("couldn't allocate buffer for copy_to_file"); 380 int len; 381 long total = 0; 382 int old_stdin_mode = -1; 383 int old_stdout_mode = -1; 384 385 D("copy_to_file(%d -> %d)", inFd, outFd); 386 387 stdinout_raw_prologue(inFd, outFd, old_stdin_mode, old_stdout_mode); 388 389 while (true) { 390 if (inFd == STDIN_FILENO) { 391 len = unix_read(inFd, buf, BUFSIZE); 392 } else { 393 len = adb_read(inFd, buf, BUFSIZE); 394 } 395 if (len == 0) { 396 D("copy_to_file() : read 0 bytes; exiting"); 397 break; 398 } 399 if (len < 0) { 400 D("copy_to_file(): read failed: %s", strerror(errno)); 401 break; 402 } 403 if (outFd == STDOUT_FILENO) { 404 fwrite(buf, 1, len, stdout); 405 fflush(stdout); 406 } else { 407 adb_write(outFd, buf, len); 408 } 409 total += len; 410 } 411 412 stdinout_raw_epilogue(inFd, outFd, old_stdin_mode, old_stdout_mode); 413 414 D("copy_to_file() finished after %lu bytes", total); 415 free(buf); 416 } 417 418 static void send_window_size_change(int fd, std::unique_ptr<ShellProtocol>& shell) { 419 // Old devices can't handle window size changes. 420 if (shell == nullptr) return; 421 422 #if defined(_WIN32) 423 struct winsize { 424 unsigned short ws_row; 425 unsigned short ws_col; 426 unsigned short ws_xpixel; 427 unsigned short ws_ypixel; 428 }; 429 #endif 430 431 winsize ws; 432 433 #if defined(_WIN32) 434 // If stdout is redirected to a non-console, we won't be able to get the 435 // console size, but that makes sense. 436 const intptr_t intptr_handle = _get_osfhandle(STDOUT_FILENO); 437 if (intptr_handle == -1) return; 438 439 const HANDLE handle = reinterpret_cast<const HANDLE>(intptr_handle); 440 441 CONSOLE_SCREEN_BUFFER_INFO info; 442 memset(&info, 0, sizeof(info)); 443 if (!GetConsoleScreenBufferInfo(handle, &info)) return; 444 445 memset(&ws, 0, sizeof(ws)); 446 // The number of visible rows, excluding offscreen scroll-back rows which are in info.dwSize.Y. 447 ws.ws_row = info.srWindow.Bottom - info.srWindow.Top + 1; 448 // If the user has disabled "Wrap text output on resize", they can make the screen buffer wider 449 // than the window, in which case we should use the width of the buffer. 450 ws.ws_col = info.dwSize.X; 451 #else 452 if (ioctl(fd, TIOCGWINSZ, &ws) == -1) return; 453 #endif 454 455 // Send the new window size as human-readable ASCII for debugging convenience. 456 size_t l = snprintf(shell->data(), shell->data_capacity(), "%dx%d,%dx%d", 457 ws.ws_row, ws.ws_col, ws.ws_xpixel, ws.ws_ypixel); 458 shell->Write(ShellProtocol::kIdWindowSizeChange, l + 1); 459 } 460 461 // Used to pass multiple values to the stdin read thread. 462 struct StdinReadArgs { 463 int stdin_fd, write_fd; 464 bool raw_stdin; 465 std::unique_ptr<ShellProtocol> protocol; 466 char escape_char; 467 }; 468 469 // Loops to read from stdin and push the data to the given FD. 470 // The argument should be a pointer to a StdinReadArgs object. This function 471 // will take ownership of the object and delete it when finished. 472 static void stdin_read_thread_loop(void* x) { 473 std::unique_ptr<StdinReadArgs> args(reinterpret_cast<StdinReadArgs*>(x)); 474 475 #if !defined(_WIN32) 476 // Mask SIGTTIN in case we're in a backgrounded process. 477 sigset_t sigset; 478 sigemptyset(&sigset); 479 sigaddset(&sigset, SIGTTIN); 480 pthread_sigmask(SIG_BLOCK, &sigset, nullptr); 481 #endif 482 483 #if defined(_WIN32) 484 // _get_interesting_input_record_uncached() causes unix_read_interruptible() 485 // to return -1 with errno == EINTR if the window size changes. 486 #else 487 // Unblock SIGWINCH for this thread, so our read(2) below will be 488 // interrupted if the window size changes. 489 sigset_t mask; 490 sigemptyset(&mask); 491 sigaddset(&mask, SIGWINCH); 492 pthread_sigmask(SIG_UNBLOCK, &mask, nullptr); 493 #endif 494 495 // Set up the initial window size. 496 send_window_size_change(args->stdin_fd, args->protocol); 497 498 char raw_buffer[BUFSIZ]; 499 char* buffer_ptr = raw_buffer; 500 size_t buffer_size = sizeof(raw_buffer); 501 if (args->protocol != nullptr) { 502 buffer_ptr = args->protocol->data(); 503 buffer_size = args->protocol->data_capacity(); 504 } 505 506 // If we need to parse escape sequences, make life easy. 507 if (args->raw_stdin && args->escape_char != '\0') { 508 buffer_size = 1; 509 } 510 511 enum EscapeState { kMidFlow, kStartOfLine, kInEscape }; 512 EscapeState state = kStartOfLine; 513 514 while (true) { 515 // Use unix_read_interruptible() rather than adb_read() for stdin. 516 D("stdin_read_thread_loop(): pre unix_read_interruptible(fdi=%d,...)", args->stdin_fd); 517 int r = unix_read_interruptible(args->stdin_fd, buffer_ptr, 518 buffer_size); 519 if (r == -1 && errno == EINTR) { 520 send_window_size_change(args->stdin_fd, args->protocol); 521 continue; 522 } 523 D("stdin_read_thread_loop(): post unix_read_interruptible(fdi=%d,...)", args->stdin_fd); 524 if (r <= 0) { 525 // Only devices using the shell protocol know to close subprocess 526 // stdin. For older devices we want to just leave the connection 527 // open, otherwise an unpredictable amount of return data could 528 // be lost due to the FD closing before all data has been received. 529 if (args->protocol) { 530 args->protocol->Write(ShellProtocol::kIdCloseStdin, 0); 531 } 532 break; 533 } 534 // If we made stdin raw, check input for escape sequences. In 535 // this situation signals like Ctrl+C are sent remotely rather than 536 // interpreted locally so this provides an emergency out if the remote 537 // process starts ignoring the signal. SSH also does this, see the 538 // "escape characters" section on the ssh man page for more info. 539 if (args->raw_stdin && args->escape_char != '\0') { 540 char ch = buffer_ptr[0]; 541 if (ch == args->escape_char) { 542 if (state == kStartOfLine) { 543 state = kInEscape; 544 // Swallow the escape character. 545 continue; 546 } else { 547 state = kMidFlow; 548 } 549 } else { 550 if (state == kInEscape) { 551 if (ch == '.') { 552 fprintf(stderr,"\r\n[ disconnected ]\r\n"); 553 stdin_raw_restore(); 554 exit(0); 555 } else { 556 // We swallowed an escape character that wasn't part of 557 // a valid escape sequence; time to cough it up. 558 buffer_ptr[0] = args->escape_char; 559 buffer_ptr[1] = ch; 560 ++r; 561 } 562 } 563 state = (ch == '\n' || ch == '\r') ? kStartOfLine : kMidFlow; 564 } 565 } 566 if (args->protocol) { 567 if (!args->protocol->Write(ShellProtocol::kIdStdin, r)) { 568 break; 569 } 570 } else { 571 if (!WriteFdExactly(args->write_fd, buffer_ptr, r)) { 572 break; 573 } 574 } 575 } 576 } 577 578 // Returns a shell service string with the indicated arguments and command. 579 static std::string ShellServiceString(bool use_shell_protocol, 580 const std::string& type_arg, 581 const std::string& command) { 582 std::vector<std::string> args; 583 if (use_shell_protocol) { 584 args.push_back(kShellServiceArgShellProtocol); 585 586 const char* terminal_type = getenv("TERM"); 587 if (terminal_type != nullptr) { 588 args.push_back(std::string("TERM=") + terminal_type); 589 } 590 } 591 if (!type_arg.empty()) { 592 args.push_back(type_arg); 593 } 594 595 // Shell service string can look like: shell[,arg1,arg2,...]:[command]. 596 return android::base::StringPrintf("shell%s%s:%s", 597 args.empty() ? "" : ",", 598 android::base::Join(args, ',').c_str(), 599 command.c_str()); 600 } 601 602 // Connects to a shell on the device and read/writes data. 603 // 604 // Note: currently this function doesn't properly clean up resources; the 605 // FD connected to the adb server is never closed and the stdin read thread 606 // may never exit. 607 // 608 // On success returns the remote exit code if |use_shell_protocol| is true, 609 // 0 otherwise. On failure returns 1. 610 static int RemoteShell(bool use_shell_protocol, const std::string& type_arg, 611 char escape_char, 612 const std::string& command) { 613 std::string service_string = ShellServiceString(use_shell_protocol, 614 type_arg, command); 615 616 // Make local stdin raw if the device allocates a PTY, which happens if: 617 // 1. We are explicitly asking for a PTY shell, or 618 // 2. We don't specify shell type and are starting an interactive session. 619 bool raw_stdin = (type_arg == kShellServiceArgPty || 620 (type_arg.empty() && command.empty())); 621 622 std::string error; 623 int fd = adb_connect(service_string, &error); 624 if (fd < 0) { 625 fprintf(stderr,"error: %s\n", error.c_str()); 626 return 1; 627 } 628 629 StdinReadArgs* args = new StdinReadArgs; 630 if (!args) { 631 LOG(ERROR) << "couldn't allocate StdinReadArgs object"; 632 return 1; 633 } 634 args->stdin_fd = STDIN_FILENO; 635 args->write_fd = fd; 636 args->raw_stdin = raw_stdin; 637 args->escape_char = escape_char; 638 if (use_shell_protocol) { 639 args->protocol.reset(new ShellProtocol(args->write_fd)); 640 } 641 642 if (raw_stdin) stdin_raw_init(); 643 644 #if !defined(_WIN32) 645 // Ensure our process is notified if the local window size changes. 646 // We use sigaction(2) to ensure that the SA_RESTART flag is not set, 647 // because the whole reason we're sending signals is to unblock the read(2)! 648 // That also means we don't need to do anything in the signal handler: 649 // the side effect of delivering the signal is all we need. 650 struct sigaction sa; 651 memset(&sa, 0, sizeof(sa)); 652 sa.sa_handler = [](int) {}; 653 sa.sa_flags = 0; 654 sigaction(SIGWINCH, &sa, nullptr); 655 656 // Now block SIGWINCH in this thread (the main thread) and all threads spawned 657 // from it. The stdin read thread will unblock this signal to ensure that it's 658 // the thread that receives the signal. 659 sigset_t mask; 660 sigemptyset(&mask); 661 sigaddset(&mask, SIGWINCH); 662 pthread_sigmask(SIG_BLOCK, &mask, nullptr); 663 #endif 664 665 // TODO: combine read_and_dump with stdin_read_thread to make life simpler? 666 int exit_code = 1; 667 if (!adb_thread_create(stdin_read_thread_loop, args)) { 668 PLOG(ERROR) << "error starting stdin read thread"; 669 delete args; 670 } else { 671 exit_code = read_and_dump(fd, use_shell_protocol); 672 } 673 674 // TODO: properly exit stdin_read_thread_loop and close |fd|. 675 676 // TODO: we should probably install signal handlers for this. 677 // TODO: can we use atexit? even on Windows? 678 if (raw_stdin) stdin_raw_restore(); 679 680 return exit_code; 681 } 682 683 static int adb_shell(int argc, const char** argv) { 684 FeatureSet features; 685 std::string error; 686 if (!adb_get_feature_set(&features, &error)) { 687 fprintf(stderr, "error: %s\n", error.c_str()); 688 return 1; 689 } 690 691 enum PtyAllocationMode { kPtyAuto, kPtyNo, kPtyYes, kPtyDefinitely }; 692 693 // Defaults. 694 char escape_char = '~'; // -e 695 bool use_shell_protocol = CanUseFeature(features, kFeatureShell2); // -x 696 PtyAllocationMode tty = use_shell_protocol ? kPtyAuto : kPtyDefinitely; // -t/-T 697 698 // Parse shell-specific command-line options. 699 argv[0] = "adb shell"; // So getopt(3) error messages start "adb shell". 700 optind = 1; // argv[0] is always "shell", so set `optind` appropriately. 701 int opt; 702 while ((opt = getopt(argc, const_cast<char**>(argv), "+e:ntTx")) != -1) { 703 switch (opt) { 704 case 'e': 705 if (!(strlen(optarg) == 1 || strcmp(optarg, "none") == 0)) { 706 fprintf(stderr, "error: -e requires a single-character argument or 'none'\n"); 707 return 1; 708 } 709 escape_char = (strcmp(optarg, "none") == 0) ? 0 : optarg[0]; 710 break; 711 case 'n': 712 close_stdin(); 713 break; 714 case 'x': 715 // This option basically asks for historical behavior, so set options that 716 // correspond to the historical defaults. This is slightly weird in that -Tx 717 // is fine (because we'll undo the -T) but -xT isn't, but that does seem to 718 // be our least worst choice... 719 use_shell_protocol = false; 720 tty = kPtyDefinitely; 721 escape_char = '~'; 722 break; 723 case 't': 724 // Like ssh, -t arguments are cumulative so that multiple -t's 725 // are needed to force a PTY. 726 tty = (tty >= kPtyYes) ? kPtyDefinitely : kPtyYes; 727 break; 728 case 'T': 729 tty = kPtyNo; 730 break; 731 default: 732 // getopt(3) already printed an error message for us. 733 return 1; 734 } 735 } 736 737 bool is_interactive = (optind == argc); 738 739 std::string shell_type_arg = kShellServiceArgPty; 740 if (tty == kPtyNo) { 741 shell_type_arg = kShellServiceArgRaw; 742 } else if (tty == kPtyAuto) { 743 // If stdin isn't a TTY, default to a raw shell; this lets 744 // things like `adb shell < my_script.sh` work as expected. 745 // Non-interactive shells should also not have a pty. 746 if (!unix_isatty(STDIN_FILENO) || !is_interactive) { 747 shell_type_arg = kShellServiceArgRaw; 748 } 749 } else if (tty == kPtyYes) { 750 // A single -t arg isn't enough to override implicit -T. 751 if (!unix_isatty(STDIN_FILENO)) { 752 fprintf(stderr, 753 "Remote PTY will not be allocated because stdin is not a terminal.\n" 754 "Use multiple -t options to force remote PTY allocation.\n"); 755 shell_type_arg = kShellServiceArgRaw; 756 } 757 } 758 759 D("shell -e 0x%x t=%d use_shell_protocol=%s shell_type_arg=%s\n", 760 escape_char, tty, 761 use_shell_protocol ? "true" : "false", 762 (shell_type_arg == kShellServiceArgPty) ? "pty" : "raw"); 763 764 // Raw mode is only supported when talking to a new device *and* using the shell protocol. 765 if (!use_shell_protocol) { 766 if (shell_type_arg != kShellServiceArgPty) { 767 fprintf(stderr, "error: %s only supports allocating a pty\n", 768 !CanUseFeature(features, kFeatureShell2) ? "device" : "-x"); 769 return 1; 770 } else { 771 // If we're not using the shell protocol, the type argument must be empty. 772 shell_type_arg = ""; 773 } 774 } 775 776 std::string command; 777 if (optind < argc) { 778 // We don't escape here, just like ssh(1). http://b/20564385. 779 command = android::base::Join(std::vector<const char*>(argv + optind, argv + argc), ' '); 780 } 781 782 return RemoteShell(use_shell_protocol, shell_type_arg, escape_char, command); 783 } 784 785 static int adb_download_buffer(const char* service, const char* filename) { 786 std::string content; 787 if (!android::base::ReadFileToString(filename, &content)) { 788 fprintf(stderr, "error: couldn't read %s: %s\n", filename, strerror(errno)); 789 return -1; 790 } 791 792 const uint8_t* data = reinterpret_cast<const uint8_t*>(content.data()); 793 unsigned sz = content.size(); 794 795 std::string error; 796 int fd = adb_connect(android::base::StringPrintf("%s:%d", service, sz), &error); 797 if (fd < 0) { 798 fprintf(stderr,"error: %s\n", error.c_str()); 799 return -1; 800 } 801 802 int opt = CHUNK_SIZE; 803 opt = adb_setsockopt(fd, SOL_SOCKET, SO_SNDBUF, (const void *) &opt, sizeof(opt)); 804 805 unsigned total = sz; 806 const uint8_t* ptr = reinterpret_cast<const uint8_t*>(data); 807 808 const char* x = strrchr(service, ':'); 809 if (x) service = x + 1; 810 811 while (sz > 0) { 812 unsigned xfer = (sz > CHUNK_SIZE) ? CHUNK_SIZE : sz; 813 if (!WriteFdExactly(fd, ptr, xfer)) { 814 std::string error; 815 adb_status(fd, &error); 816 fprintf(stderr,"* failed to write data '%s' *\n", error.c_str()); 817 adb_close(fd); 818 return -1; 819 } 820 sz -= xfer; 821 ptr += xfer; 822 printf("sending: '%s' %4d%% \r", filename, (int)(100LL - ((100LL * sz) / (total)))); 823 fflush(stdout); 824 } 825 printf("\n"); 826 827 if (!adb_status(fd, &error)) { 828 fprintf(stderr,"* error response '%s' *\n", error.c_str()); 829 adb_close(fd); 830 return -1; 831 } 832 833 adb_close(fd); 834 return 0; 835 } 836 837 #define SIDELOAD_HOST_BLOCK_SIZE (CHUNK_SIZE) 838 839 /* 840 * The sideload-host protocol serves the data in a file (given on the 841 * command line) to the client, using a simple protocol: 842 * 843 * - The connect message includes the total number of bytes in the 844 * file and a block size chosen by us. 845 * 846 * - The other side sends the desired block number as eight decimal 847 * digits (eg "00000023" for block 23). Blocks are numbered from 848 * zero. 849 * 850 * - We send back the data of the requested block. The last block is 851 * likely to be partial; when the last block is requested we only 852 * send the part of the block that exists, it's not padded up to the 853 * block size. 854 * 855 * - When the other side sends "DONEDONE" instead of a block number, 856 * we hang up. 857 */ 858 static int adb_sideload_host(const char* filename) { 859 fprintf(stderr, "opening '%s'...\n", filename); 860 struct stat sb; 861 if (stat(filename, &sb) == -1) { 862 fprintf(stderr, "failed to stat file %s: %s\n", filename, strerror(errno)); 863 return -1; 864 } 865 unique_fd package_fd(adb_open(filename, O_RDONLY)); 866 if (package_fd == -1) { 867 fprintf(stderr, "failed to open file %s: %s\n", filename, strerror(errno)); 868 return -1; 869 } 870 871 fprintf(stderr, "connecting...\n"); 872 std::string service = android::base::StringPrintf( 873 "sideload-host:%d:%d", static_cast<int>(sb.st_size), SIDELOAD_HOST_BLOCK_SIZE); 874 std::string error; 875 unique_fd device_fd(adb_connect(service, &error)); 876 if (device_fd < 0) { 877 // Try falling back to the older (<= K) sideload method. Maybe this 878 // is an older device that doesn't support sideload-host. 879 fprintf(stderr, "falling back to older sideload method...\n"); 880 return adb_download_buffer("sideload", filename); 881 } 882 883 int opt = SIDELOAD_HOST_BLOCK_SIZE; 884 adb_setsockopt(device_fd, SOL_SOCKET, SO_SNDBUF, &opt, sizeof(opt)); 885 886 char buf[SIDELOAD_HOST_BLOCK_SIZE]; 887 888 size_t xfer = 0; 889 int last_percent = -1; 890 while (true) { 891 if (!ReadFdExactly(device_fd, buf, 8)) { 892 fprintf(stderr, "* failed to read command: %s\n", strerror(errno)); 893 return -1; 894 } 895 buf[8] = '\0'; 896 897 if (strcmp("DONEDONE", buf) == 0) { 898 printf("\rTotal xfer: %.2fx%*s\n", 899 static_cast<double>(xfer) / (sb.st_size ? sb.st_size : 1), 900 static_cast<int>(strlen(filename) + 10), ""); 901 return 0; 902 } 903 904 int block = strtol(buf, NULL, 10); 905 906 size_t offset = block * SIDELOAD_HOST_BLOCK_SIZE; 907 if (offset >= static_cast<size_t>(sb.st_size)) { 908 fprintf(stderr, "* attempt to read block %d past end\n", block); 909 return -1; 910 } 911 912 size_t to_write = SIDELOAD_HOST_BLOCK_SIZE; 913 if ((offset + SIDELOAD_HOST_BLOCK_SIZE) > static_cast<size_t>(sb.st_size)) { 914 to_write = sb.st_size - offset; 915 } 916 917 if (adb_lseek(package_fd, offset, SEEK_SET) != static_cast<int>(offset)) { 918 fprintf(stderr, "* failed to seek to package block: %s\n", strerror(errno)); 919 return -1; 920 } 921 if (!ReadFdExactly(package_fd, buf, to_write)) { 922 fprintf(stderr, "* failed to read package block: %s\n", strerror(errno)); 923 return -1; 924 } 925 926 if (!WriteFdExactly(device_fd, buf, to_write)) { 927 adb_status(device_fd, &error); 928 fprintf(stderr,"* failed to write data '%s' *\n", error.c_str()); 929 return -1; 930 } 931 xfer += to_write; 932 933 // For normal OTA packages, we expect to transfer every byte 934 // twice, plus a bit of overhead (one read during 935 // verification, one read of each byte for installation, plus 936 // extra access to things like the zip central directory). 937 // This estimate of the completion becomes 100% when we've 938 // transferred ~2.13 (=100/47) times the package size. 939 int percent = static_cast<int>(xfer * 47LL / (sb.st_size ? sb.st_size : 1)); 940 if (percent != last_percent) { 941 printf("\rserving: '%s' (~%d%%) ", filename, percent); 942 fflush(stdout); 943 last_percent = percent; 944 } 945 } 946 } 947 948 /** 949 * Run ppp in "notty" mode against a resource listed as the first parameter 950 * eg: 951 * 952 * ppp dev:/dev/omap_csmi_tty0 <ppp options> 953 * 954 */ 955 static int ppp(int argc, const char** argv) { 956 #if defined(_WIN32) 957 fprintf(stderr, "error: adb %s not implemented on Win32\n", argv[0]); 958 return -1; 959 #else 960 if (argc < 2) { 961 fprintf(stderr, "usage: adb %s <adb service name> [ppp opts]\n", 962 argv[0]); 963 964 return 1; 965 } 966 967 const char* adb_service_name = argv[1]; 968 std::string error; 969 int fd = adb_connect(adb_service_name, &error); 970 if (fd < 0) { 971 fprintf(stderr,"Error: Could not open adb service: %s. Error: %s\n", 972 adb_service_name, error.c_str()); 973 return 1; 974 } 975 976 pid_t pid = fork(); 977 978 if (pid < 0) { 979 perror("from fork()"); 980 return 1; 981 } else if (pid == 0) { 982 int err; 983 int i; 984 const char **ppp_args; 985 986 // copy args 987 ppp_args = (const char **) alloca(sizeof(char *) * argc + 1); 988 ppp_args[0] = "pppd"; 989 for (i = 2 ; i < argc ; i++) { 990 //argv[2] and beyond become ppp_args[1] and beyond 991 ppp_args[i - 1] = argv[i]; 992 } 993 ppp_args[i-1] = NULL; 994 995 // child side 996 997 dup2(fd, STDIN_FILENO); 998 dup2(fd, STDOUT_FILENO); 999 adb_close(STDERR_FILENO); 1000 adb_close(fd); 1001 1002 err = execvp("pppd", (char * const *)ppp_args); 1003 1004 if (err < 0) { 1005 perror("execing pppd"); 1006 } 1007 exit(-1); 1008 } else { 1009 // parent side 1010 1011 adb_close(fd); 1012 return 0; 1013 } 1014 #endif /* !defined(_WIN32) */ 1015 } 1016 1017 static bool wait_for_device(const char* service, TransportType t, const char* serial) { 1018 std::vector<std::string> components = android::base::Split(service, "-"); 1019 if (components.size() < 3 || components.size() > 4) { 1020 fprintf(stderr, "adb: couldn't parse 'wait-for' command: %s\n", service); 1021 return false; 1022 } 1023 1024 // Was the caller vague about what they'd like us to wait for? 1025 // If so, check they weren't more specific in their choice of transport type. 1026 if (components.size() == 3) { 1027 auto it = components.begin() + 2; 1028 if (t == kTransportUsb) { 1029 components.insert(it, "usb"); 1030 } else if (t == kTransportLocal) { 1031 components.insert(it, "local"); 1032 } else { 1033 components.insert(it, "any"); 1034 } 1035 } else if (components[2] != "any" && components[2] != "local" && components[2] != "usb") { 1036 fprintf(stderr, "adb: unknown type %s; expected 'any', 'local', or 'usb'\n", 1037 components[2].c_str()); 1038 return false; 1039 } 1040 1041 if (components[3] != "any" && components[3] != "bootloader" && components[3] != "device" && 1042 components[3] != "recovery" && components[3] != "sideload") { 1043 fprintf(stderr, 1044 "adb: unknown state %s; " 1045 "expected 'any', 'bootloader', 'device', 'recovery', or 'sideload'\n", 1046 components[3].c_str()); 1047 return false; 1048 } 1049 1050 std::string cmd = format_host_command(android::base::Join(components, "-").c_str(), t, serial); 1051 return adb_command(cmd); 1052 } 1053 1054 static bool adb_root(const char* command) { 1055 std::string error; 1056 1057 unique_fd fd(adb_connect(android::base::StringPrintf("%s:", command), &error)); 1058 if (fd < 0) { 1059 fprintf(stderr, "adb: unable to connect for %s: %s\n", command, error.c_str()); 1060 return false; 1061 } 1062 1063 // Figure out whether we actually did anything. 1064 char buf[256]; 1065 char* cur = buf; 1066 ssize_t bytes_left = sizeof(buf); 1067 while (bytes_left > 0) { 1068 ssize_t bytes_read = adb_read(fd, cur, bytes_left); 1069 if (bytes_read == 0) { 1070 break; 1071 } else if (bytes_read < 0) { 1072 fprintf(stderr, "adb: error while reading for %s: %s\n", command, strerror(errno)); 1073 return false; 1074 } 1075 cur += bytes_read; 1076 bytes_left -= bytes_read; 1077 } 1078 1079 if (bytes_left == 0) { 1080 fprintf(stderr, "adb: unexpected output length for %s\n", command); 1081 return false; 1082 } 1083 1084 fflush(stdout); 1085 WriteFdExactly(STDOUT_FILENO, buf, sizeof(buf) - bytes_left); 1086 if (cur != buf && strstr(buf, "restarting") == nullptr) { 1087 return true; 1088 } 1089 1090 // Give adbd some time to kill itself and come back up. 1091 // We can't use wait-for-device because devices (e.g. adb over network) might not come back. 1092 std::this_thread::sleep_for(3s); 1093 return true; 1094 } 1095 1096 int send_shell_command(TransportType transport_type, const char* serial, const std::string& command, 1097 bool disable_shell_protocol, StandardStreamsCallbackInterface* callback) { 1098 int fd; 1099 bool use_shell_protocol = false; 1100 1101 while (true) { 1102 bool attempt_connection = true; 1103 1104 // Use shell protocol if it's supported and the caller doesn't explicitly 1105 // disable it. 1106 if (!disable_shell_protocol) { 1107 FeatureSet features; 1108 std::string error; 1109 if (adb_get_feature_set(&features, &error)) { 1110 use_shell_protocol = CanUseFeature(features, kFeatureShell2); 1111 } else { 1112 // Device was unreachable. 1113 attempt_connection = false; 1114 } 1115 } 1116 1117 if (attempt_connection) { 1118 std::string error; 1119 std::string service_string = ShellServiceString(use_shell_protocol, "", command); 1120 1121 fd = adb_connect(service_string, &error); 1122 if (fd >= 0) { 1123 break; 1124 } 1125 } 1126 1127 fprintf(stderr, "- waiting for device -\n"); 1128 if (!wait_for_device("wait-for-device", transport_type, serial)) { 1129 return 1; 1130 } 1131 } 1132 1133 int exit_code = read_and_dump(fd, use_shell_protocol, callback); 1134 1135 if (adb_close(fd) < 0) { 1136 PLOG(ERROR) << "failure closing FD " << fd; 1137 } 1138 1139 return exit_code; 1140 } 1141 1142 static int logcat(TransportType transport, const char* serial, int argc, const char** argv) { 1143 char* log_tags = getenv("ANDROID_LOG_TAGS"); 1144 std::string quoted = escape_arg(log_tags == nullptr ? "" : log_tags); 1145 1146 std::string cmd = "export ANDROID_LOG_TAGS=\"" + quoted + "\"; exec logcat"; 1147 1148 if (!strcmp(argv[0], "longcat")) { 1149 cmd += " -v long"; 1150 } 1151 1152 --argc; 1153 ++argv; 1154 while (argc-- > 0) { 1155 cmd += " " + escape_arg(*argv++); 1156 } 1157 1158 // No need for shell protocol with logcat, always disable for simplicity. 1159 return send_shell_command(transport, serial, cmd, true); 1160 } 1161 1162 static void write_zeros(int bytes, int fd) { 1163 int old_stdin_mode = -1; 1164 int old_stdout_mode = -1; 1165 char* buf = (char*) calloc(1, bytes); 1166 if (buf == nullptr) fatal("couldn't allocate buffer for write_zeros"); 1167 1168 D("write_zeros(%d) -> %d", bytes, fd); 1169 1170 stdinout_raw_prologue(-1, fd, old_stdin_mode, old_stdout_mode); 1171 1172 if (fd == STDOUT_FILENO) { 1173 fwrite(buf, 1, bytes, stdout); 1174 fflush(stdout); 1175 } else { 1176 adb_write(fd, buf, bytes); 1177 } 1178 1179 stdinout_raw_prologue(-1, fd, old_stdin_mode, old_stdout_mode); 1180 1181 D("write_zeros() finished"); 1182 free(buf); 1183 } 1184 1185 static int backup(int argc, const char** argv) { 1186 const char* filename = "backup.ab"; 1187 1188 /* find, extract, and use any -f argument */ 1189 for (int i = 1; i < argc; i++) { 1190 if (!strcmp("-f", argv[i])) { 1191 if (i == argc-1) { 1192 fprintf(stderr, "adb: backup -f passed with no filename.\n"); 1193 return EXIT_FAILURE; 1194 } 1195 filename = argv[i+1]; 1196 for (int j = i+2; j <= argc; ) { 1197 argv[i++] = argv[j++]; 1198 } 1199 argc -= 2; 1200 argv[argc] = NULL; 1201 } 1202 } 1203 1204 // Bare "adb backup" or "adb backup -f filename" are not valid invocations --- 1205 // a list of packages is required. 1206 if (argc < 2) { 1207 fprintf(stderr, "adb: backup either needs a list of packages or -all/-shared.\n"); 1208 return EXIT_FAILURE; 1209 } 1210 1211 adb_unlink(filename); 1212 int outFd = adb_creat(filename, 0640); 1213 if (outFd < 0) { 1214 fprintf(stderr, "adb: backup unable to create file '%s': %s\n", filename, strerror(errno)); 1215 return EXIT_FAILURE; 1216 } 1217 1218 std::string cmd = "backup:"; 1219 --argc; 1220 ++argv; 1221 while (argc-- > 0) { 1222 cmd += " " + escape_arg(*argv++); 1223 } 1224 1225 D("backup. filename=%s cmd=%s", filename, cmd.c_str()); 1226 std::string error; 1227 int fd = adb_connect(cmd, &error); 1228 if (fd < 0) { 1229 fprintf(stderr, "adb: unable to connect for backup: %s\n", error.c_str()); 1230 adb_close(outFd); 1231 return EXIT_FAILURE; 1232 } 1233 1234 printf("Now unlock your device and confirm the backup operation...\n"); 1235 fflush(stdout); 1236 1237 copy_to_file(fd, outFd); 1238 1239 adb_close(fd); 1240 adb_close(outFd); 1241 return EXIT_SUCCESS; 1242 } 1243 1244 static int restore(int argc, const char** argv) { 1245 if (argc != 2) return usage("restore requires an argument"); 1246 1247 const char* filename = argv[1]; 1248 int tarFd = adb_open(filename, O_RDONLY); 1249 if (tarFd < 0) { 1250 fprintf(stderr, "adb: unable to open file %s: %s\n", filename, strerror(errno)); 1251 return -1; 1252 } 1253 1254 std::string error; 1255 int fd = adb_connect("restore:", &error); 1256 if (fd < 0) { 1257 fprintf(stderr, "adb: unable to connect for restore: %s\n", error.c_str()); 1258 adb_close(tarFd); 1259 return -1; 1260 } 1261 1262 printf("Now unlock your device and confirm the restore operation.\n"); 1263 copy_to_file(tarFd, fd); 1264 1265 // Provide an in-band EOD marker in case the archive file is malformed 1266 write_zeros(512*2, fd); 1267 1268 // Wait until the other side finishes, or it'll get sent SIGHUP. 1269 copy_to_file(fd, STDOUT_FILENO); 1270 1271 adb_close(fd); 1272 adb_close(tarFd); 1273 return 0; 1274 } 1275 1276 /* <hint> may be: 1277 * - A simple product name 1278 * e.g., "sooner" 1279 * - A relative path from the CWD to the ANDROID_PRODUCT_OUT dir 1280 * e.g., "out/target/product/sooner" 1281 * - An absolute path to the PRODUCT_OUT dir 1282 * e.g., "/src/device/out/target/product/sooner" 1283 * 1284 * Given <hint>, try to construct an absolute path to the 1285 * ANDROID_PRODUCT_OUT dir. 1286 */ 1287 static std::string find_product_out_path(const std::string& hint) { 1288 if (hint.empty()) { 1289 return ""; 1290 } 1291 1292 // If it's already absolute, don't bother doing any work. 1293 if (adb_is_absolute_host_path(hint.c_str())) { 1294 return hint; 1295 } 1296 1297 // If any of the OS_PATH_SEPARATORS is found, assume it's a relative path; 1298 // make it absolute. 1299 // NOLINT: Do not complain if OS_PATH_SEPARATORS has only one character. 1300 if (hint.find_first_of(OS_PATH_SEPARATORS) != std::string::npos) { // NOLINT 1301 std::string cwd; 1302 if (!getcwd(&cwd)) { 1303 perror("adb: getcwd failed"); 1304 return ""; 1305 } 1306 return android::base::StringPrintf("%s%c%s", cwd.c_str(), OS_PATH_SEPARATOR, hint.c_str()); 1307 } 1308 1309 // It's a string without any slashes. Try to do something with it. 1310 // 1311 // Try to find the root of the build tree, and build a PRODUCT_OUT 1312 // path from there. 1313 char* top = getenv("ANDROID_BUILD_TOP"); 1314 if (top == nullptr) { 1315 fprintf(stderr, "adb: ANDROID_BUILD_TOP not set!\n"); 1316 return ""; 1317 } 1318 1319 std::string path = top; 1320 path += OS_PATH_SEPARATOR_STR; 1321 path += "out"; 1322 path += OS_PATH_SEPARATOR_STR; 1323 path += "target"; 1324 path += OS_PATH_SEPARATOR_STR; 1325 path += "product"; 1326 path += OS_PATH_SEPARATOR_STR; 1327 path += hint; 1328 if (!directory_exists(path)) { 1329 fprintf(stderr, "adb: Couldn't find a product dir based on -p %s; " 1330 "\"%s\" doesn't exist\n", hint.c_str(), path.c_str()); 1331 return ""; 1332 } 1333 return path; 1334 } 1335 1336 static void parse_push_pull_args(const char** arg, int narg, 1337 std::vector<const char*>* srcs, 1338 const char** dst, bool* copy_attrs) { 1339 *copy_attrs = false; 1340 1341 srcs->clear(); 1342 bool ignore_flags = false; 1343 while (narg > 0) { 1344 if (ignore_flags || *arg[0] != '-') { 1345 srcs->push_back(*arg); 1346 } else { 1347 if (!strcmp(*arg, "-p")) { 1348 // Silently ignore for backwards compatibility. 1349 } else if (!strcmp(*arg, "-a")) { 1350 *copy_attrs = true; 1351 } else if (!strcmp(*arg, "--")) { 1352 ignore_flags = true; 1353 } else { 1354 fprintf(stderr, "adb: unrecognized option '%s'\n", *arg); 1355 exit(1); 1356 } 1357 } 1358 ++arg; 1359 --narg; 1360 } 1361 1362 if (srcs->size() > 1) { 1363 *dst = srcs->back(); 1364 srcs->pop_back(); 1365 } 1366 } 1367 1368 static int adb_connect_command(const std::string& command) { 1369 std::string error; 1370 int fd = adb_connect(command, &error); 1371 if (fd < 0) { 1372 fprintf(stderr, "error: %s\n", error.c_str()); 1373 return 1; 1374 } 1375 read_and_dump(fd); 1376 adb_close(fd); 1377 return 0; 1378 } 1379 1380 static int adb_query_command(const std::string& command) { 1381 std::string result; 1382 std::string error; 1383 if (!adb_query(command, &result, &error)) { 1384 fprintf(stderr, "error: %s\n", error.c_str()); 1385 return 1; 1386 } 1387 printf("%s\n", result.c_str()); 1388 return 0; 1389 } 1390 1391 // Disallow stdin, stdout, and stderr. 1392 static bool _is_valid_ack_reply_fd(const int ack_reply_fd) { 1393 #ifdef _WIN32 1394 const HANDLE ack_reply_handle = cast_int_to_handle(ack_reply_fd); 1395 return (GetStdHandle(STD_INPUT_HANDLE) != ack_reply_handle) && 1396 (GetStdHandle(STD_OUTPUT_HANDLE) != ack_reply_handle) && 1397 (GetStdHandle(STD_ERROR_HANDLE) != ack_reply_handle); 1398 #else 1399 return ack_reply_fd > 2; 1400 #endif 1401 } 1402 1403 static bool _use_legacy_install() { 1404 FeatureSet features; 1405 std::string error; 1406 if (!adb_get_feature_set(&features, &error)) { 1407 fprintf(stderr, "error: %s\n", error.c_str()); 1408 return true; 1409 } 1410 return !CanUseFeature(features, kFeatureCmd); 1411 } 1412 1413 int adb_commandline(int argc, const char** argv) { 1414 int no_daemon = 0; 1415 int is_daemon = 0; 1416 int is_server = 0; 1417 int r; 1418 TransportType transport_type = kTransportAny; 1419 int ack_reply_fd = -1; 1420 1421 #if !defined(_WIN32) 1422 // We'd rather have EPIPE than SIGPIPE. 1423 signal(SIGPIPE, SIG_IGN); 1424 #endif 1425 1426 // If defined, this should be an absolute path to 1427 // the directory containing all of the various system images 1428 // for a particular product. If not defined, and the adb 1429 // command requires this information, then the user must 1430 // specify the path using "-p". 1431 char* ANDROID_PRODUCT_OUT = getenv("ANDROID_PRODUCT_OUT"); 1432 if (ANDROID_PRODUCT_OUT != nullptr) { 1433 gProductOutPath = ANDROID_PRODUCT_OUT; 1434 } 1435 // TODO: also try TARGET_PRODUCT/TARGET_DEVICE as a hint 1436 1437 const char* server_host_str = nullptr; 1438 const char* server_port_str = nullptr; 1439 const char* server_socket_str = nullptr; 1440 1441 // We need to check for -d and -e before we look at $ANDROID_SERIAL. 1442 const char* serial = nullptr; 1443 1444 while (argc > 0) { 1445 if (!strcmp(argv[0],"server")) { 1446 is_server = 1; 1447 } else if (!strcmp(argv[0],"nodaemon")) { 1448 no_daemon = 1; 1449 } else if (!strcmp(argv[0], "fork-server")) { 1450 /* this is a special flag used only when the ADB client launches the ADB Server */ 1451 is_daemon = 1; 1452 } else if (!strcmp(argv[0], "--reply-fd")) { 1453 if (argc < 2) return usage("--reply-fd requires an argument"); 1454 const char* reply_fd_str = argv[1]; 1455 argc--; 1456 argv++; 1457 ack_reply_fd = strtol(reply_fd_str, nullptr, 10); 1458 if (!_is_valid_ack_reply_fd(ack_reply_fd)) { 1459 fprintf(stderr, "adb: invalid reply fd \"%s\"\n", reply_fd_str); 1460 return 1; 1461 } 1462 } else if (!strncmp(argv[0], "-p", 2)) { 1463 const char* product = nullptr; 1464 if (argv[0][2] == '\0') { 1465 if (argc < 2) return usage("-p requires an argument"); 1466 product = argv[1]; 1467 argc--; 1468 argv++; 1469 } else { 1470 product = argv[0] + 2; 1471 } 1472 gProductOutPath = find_product_out_path(product); 1473 if (gProductOutPath.empty()) { 1474 fprintf(stderr, "adb: could not resolve \"-p %s\"\n", product); 1475 return 1; 1476 } 1477 } else if (argv[0][0]=='-' && argv[0][1]=='s') { 1478 if (isdigit(argv[0][2])) { 1479 serial = argv[0] + 2; 1480 } else { 1481 if (argc < 2 || argv[0][2] != '\0') return usage("-s requires an argument"); 1482 serial = argv[1]; 1483 argc--; 1484 argv++; 1485 } 1486 } else if (!strcmp(argv[0],"-d")) { 1487 transport_type = kTransportUsb; 1488 } else if (!strcmp(argv[0],"-e")) { 1489 transport_type = kTransportLocal; 1490 } else if (!strcmp(argv[0],"-a")) { 1491 gListenAll = 1; 1492 } else if (!strncmp(argv[0], "-H", 2)) { 1493 if (argv[0][2] == '\0') { 1494 if (argc < 2) return usage("-H requires an argument"); 1495 server_host_str = argv[1]; 1496 argc--; 1497 argv++; 1498 } else { 1499 server_host_str = argv[0] + 2; 1500 } 1501 } else if (!strncmp(argv[0], "-P", 2)) { 1502 if (argv[0][2] == '\0') { 1503 if (argc < 2) return usage("-P requires an argument"); 1504 server_port_str = argv[1]; 1505 argc--; 1506 argv++; 1507 } else { 1508 server_port_str = argv[0] + 2; 1509 } 1510 } else if (!strcmp(argv[0], "-L")) { 1511 if (argc < 2) return usage("-L requires an argument"); 1512 server_socket_str = argv[1]; 1513 argc--; 1514 argv++; 1515 } else { 1516 /* out of recognized modifiers and flags */ 1517 break; 1518 } 1519 argc--; 1520 argv++; 1521 } 1522 1523 if ((server_host_str || server_port_str) && server_socket_str) { 1524 fprintf(stderr, "adb: -L is incompatible with -H or -P\n"); 1525 exit(1); 1526 } 1527 1528 // If -L, -H, or -P are specified, ignore environment variables. 1529 // Otherwise, prefer ADB_SERVER_SOCKET over ANDROID_ADB_SERVER_ADDRESS/PORT. 1530 if (!server_host_str && !server_port_str && !server_socket_str) { 1531 server_socket_str = getenv("ADB_SERVER_SOCKET"); 1532 } 1533 1534 if (!server_socket_str) { 1535 // tcp:1234 and tcp:localhost:1234 are different with -a, so don't default to localhost 1536 server_host_str = server_host_str ? server_host_str : getenv("ANDROID_ADB_SERVER_ADDRESS"); 1537 1538 int server_port = DEFAULT_ADB_PORT; 1539 server_port_str = server_port_str ? server_port_str : getenv("ANDROID_ADB_SERVER_PORT"); 1540 if (server_port_str && strlen(server_port_str) > 0) { 1541 if (!android::base::ParseInt(server_port_str, &server_port, 1, 65535)) { 1542 fprintf(stderr, 1543 "adb: Env var ANDROID_ADB_SERVER_PORT must be a positive" 1544 " number less than 65535. Got \"%s\"\n", 1545 server_port_str); 1546 exit(1); 1547 } 1548 } 1549 1550 int rc; 1551 char* temp; 1552 if (server_host_str) { 1553 rc = asprintf(&temp, "tcp:%s:%d", server_host_str, server_port); 1554 } else { 1555 rc = asprintf(&temp, "tcp:%d", server_port); 1556 } 1557 if (rc < 0) { 1558 fatal("failed to allocate server socket specification"); 1559 } 1560 server_socket_str = temp; 1561 } 1562 1563 adb_set_socket_spec(server_socket_str); 1564 1565 // If none of -d, -e, or -s were specified, try $ANDROID_SERIAL. 1566 if (transport_type == kTransportAny && serial == nullptr) { 1567 serial = getenv("ANDROID_SERIAL"); 1568 } 1569 1570 adb_set_transport(transport_type, serial); 1571 1572 if (is_server) { 1573 if (no_daemon || is_daemon) { 1574 if (is_daemon && (ack_reply_fd == -1)) { 1575 fprintf(stderr, "reply fd for adb server to client communication not specified.\n"); 1576 return 1; 1577 } 1578 r = adb_server_main(is_daemon, server_socket_str, ack_reply_fd); 1579 } else { 1580 r = launch_server(server_socket_str); 1581 } 1582 if (r) { 1583 fprintf(stderr,"* could not start server *\n"); 1584 } 1585 return r; 1586 } 1587 1588 if (argc == 0) { 1589 help(); 1590 return 1; 1591 } 1592 1593 /* handle wait-for-* prefix */ 1594 if (!strncmp(argv[0], "wait-for-", strlen("wait-for-"))) { 1595 const char* service = argv[0]; 1596 1597 if (!wait_for_device(service, transport_type, serial)) { 1598 return 1; 1599 } 1600 1601 // Allow a command to be run after wait-for-device, 1602 // e.g. 'adb wait-for-device shell'. 1603 if (argc == 1) { 1604 return 0; 1605 } 1606 1607 /* Fall through */ 1608 argc--; 1609 argv++; 1610 } 1611 1612 /* adb_connect() commands */ 1613 if (!strcmp(argv[0], "devices")) { 1614 const char *listopt; 1615 if (argc < 2) { 1616 listopt = ""; 1617 } else if (argc == 2 && !strcmp(argv[1], "-l")) { 1618 listopt = argv[1]; 1619 } else { 1620 fprintf(stderr, "Usage: adb devices [-l]\n"); 1621 return 1; 1622 } 1623 1624 std::string query = android::base::StringPrintf("host:%s%s", argv[0], listopt); 1625 printf("List of devices attached\n"); 1626 return adb_query_command(query); 1627 } 1628 else if (!strcmp(argv[0], "connect")) { 1629 if (argc != 2) { 1630 fprintf(stderr, "Usage: adb connect <host>[:<port>]\n"); 1631 return 1; 1632 } 1633 1634 std::string query = android::base::StringPrintf("host:connect:%s", argv[1]); 1635 return adb_query_command(query); 1636 } 1637 else if (!strcmp(argv[0], "disconnect")) { 1638 if (argc > 2) { 1639 fprintf(stderr, "Usage: adb disconnect [<host>[:<port>]]\n"); 1640 return 1; 1641 } 1642 1643 std::string query = android::base::StringPrintf("host:disconnect:%s", 1644 (argc == 2) ? argv[1] : ""); 1645 return adb_query_command(query); 1646 } 1647 else if (!strcmp(argv[0], "emu")) { 1648 return adb_send_emulator_command(argc, argv, serial); 1649 } 1650 else if (!strcmp(argv[0], "shell")) { 1651 return adb_shell(argc, argv); 1652 } 1653 else if (!strcmp(argv[0], "exec-in") || !strcmp(argv[0], "exec-out")) { 1654 int exec_in = !strcmp(argv[0], "exec-in"); 1655 1656 if (argc < 2) { 1657 fprintf(stderr, "Usage: adb %s command\n", argv[0]); 1658 return 1; 1659 } 1660 1661 std::string cmd = "exec:"; 1662 cmd += argv[1]; 1663 argc -= 2; 1664 argv += 2; 1665 while (argc-- > 0) { 1666 cmd += " " + escape_arg(*argv++); 1667 } 1668 1669 std::string error; 1670 int fd = adb_connect(cmd, &error); 1671 if (fd < 0) { 1672 fprintf(stderr, "error: %s\n", error.c_str()); 1673 return -1; 1674 } 1675 1676 if (exec_in) { 1677 copy_to_file(STDIN_FILENO, fd); 1678 } else { 1679 copy_to_file(fd, STDOUT_FILENO); 1680 } 1681 1682 adb_close(fd); 1683 return 0; 1684 } 1685 else if (!strcmp(argv[0], "kill-server")) { 1686 std::string error; 1687 int fd = _adb_connect("host:kill", &error); 1688 if (fd == -2) { 1689 // Failed to make network connection to server. Don't output the 1690 // network error since that is expected. 1691 fprintf(stderr,"* server not running *\n"); 1692 // Successful exit code because the server is already "killed". 1693 return 0; 1694 } else if (fd == -1) { 1695 // Some other error. 1696 fprintf(stderr, "error: %s\n", error.c_str()); 1697 return 1; 1698 } else { 1699 // Successfully connected, kill command sent, okay status came back. 1700 // Server should exit() in a moment, if not already. 1701 ReadOrderlyShutdown(fd); 1702 adb_close(fd); 1703 return 0; 1704 } 1705 } 1706 else if (!strcmp(argv[0], "sideload")) { 1707 if (argc != 2) return usage("sideload requires an argument"); 1708 if (adb_sideload_host(argv[1])) { 1709 return 1; 1710 } else { 1711 return 0; 1712 } 1713 } 1714 else if (!strcmp(argv[0], "tcpip") && argc > 1) { 1715 return adb_connect_command(android::base::StringPrintf("tcpip:%s", argv[1])); 1716 } 1717 else if (!strcmp(argv[0], "remount") || 1718 !strcmp(argv[0], "reboot") || 1719 !strcmp(argv[0], "reboot-bootloader") || 1720 !strcmp(argv[0], "usb") || 1721 !strcmp(argv[0], "disable-verity") || 1722 !strcmp(argv[0], "enable-verity")) { 1723 std::string command; 1724 if (!strcmp(argv[0], "reboot-bootloader")) { 1725 command = "reboot:bootloader"; 1726 } else if (argc > 1) { 1727 command = android::base::StringPrintf("%s:%s", argv[0], argv[1]); 1728 } else { 1729 command = android::base::StringPrintf("%s:", argv[0]); 1730 } 1731 return adb_connect_command(command); 1732 } else if (!strcmp(argv[0], "root") || !strcmp(argv[0], "unroot")) { 1733 return adb_root(argv[0]) ? 0 : 1; 1734 } else if (!strcmp(argv[0], "bugreport")) { 1735 Bugreport bugreport; 1736 return bugreport.DoIt(transport_type, serial, argc, argv); 1737 } else if (!strcmp(argv[0], "forward") || !strcmp(argv[0], "reverse")) { 1738 bool reverse = !strcmp(argv[0], "reverse"); 1739 ++argv; 1740 --argc; 1741 if (argc < 1) return usage("%s requires an argument", argv[0]); 1742 1743 // Determine the <host-prefix> for this command. 1744 std::string host_prefix; 1745 if (reverse) { 1746 host_prefix = "reverse"; 1747 } else { 1748 if (serial) { 1749 host_prefix = android::base::StringPrintf("host-serial:%s", serial); 1750 } else if (transport_type == kTransportUsb) { 1751 host_prefix = "host-usb"; 1752 } else if (transport_type == kTransportLocal) { 1753 host_prefix = "host-local"; 1754 } else { 1755 host_prefix = "host"; 1756 } 1757 } 1758 1759 std::string cmd, error; 1760 if (strcmp(argv[0], "--list") == 0) { 1761 if (argc != 1) return usage("--list doesn't take any arguments"); 1762 return adb_query_command(host_prefix + ":list-forward"); 1763 } else if (strcmp(argv[0], "--remove-all") == 0) { 1764 if (argc != 1) return usage("--remove-all doesn't take any arguments"); 1765 cmd = host_prefix + ":killforward-all"; 1766 } else if (strcmp(argv[0], "--remove") == 0) { 1767 // forward --remove <local> 1768 if (argc != 2) return usage("--remove requires an argument"); 1769 cmd = host_prefix + ":killforward:" + argv[1]; 1770 } else if (strcmp(argv[0], "--no-rebind") == 0) { 1771 // forward --no-rebind <local> <remote> 1772 if (argc != 3) return usage("--no-rebind takes two arguments"); 1773 if (forward_targets_are_valid(argv[1], argv[2], &error)) { 1774 cmd = host_prefix + ":forward:norebind:" + argv[1] + ";" + argv[2]; 1775 } 1776 } else { 1777 // forward <local> <remote> 1778 if (argc != 2) return usage("forward takes two arguments"); 1779 if (forward_targets_are_valid(argv[0], argv[1], &error)) { 1780 cmd = host_prefix + ":forward:" + argv[0] + ";" + argv[1]; 1781 } 1782 } 1783 1784 if (!error.empty()) { 1785 fprintf(stderr, "error: %s\n", error.c_str()); 1786 return 1; 1787 } 1788 1789 int fd = adb_connect(cmd, &error); 1790 if (fd < 0 || !adb_status(fd, &error)) { 1791 adb_close(fd); 1792 fprintf(stderr, "error: %s\n", error.c_str()); 1793 return 1; 1794 } 1795 1796 // Server or device may optionally return a resolved TCP port number. 1797 std::string resolved_port; 1798 if (ReadProtocolString(fd, &resolved_port, &error) && !resolved_port.empty()) { 1799 printf("%s\n", resolved_port.c_str()); 1800 } 1801 1802 ReadOrderlyShutdown(fd); 1803 return 0; 1804 } 1805 /* do_sync_*() commands */ 1806 else if (!strcmp(argv[0], "ls")) { 1807 if (argc != 2) return usage("ls requires an argument"); 1808 return do_sync_ls(argv[1]) ? 0 : 1; 1809 } 1810 else if (!strcmp(argv[0], "push")) { 1811 bool copy_attrs = false; 1812 std::vector<const char*> srcs; 1813 const char* dst = nullptr; 1814 1815 parse_push_pull_args(&argv[1], argc - 1, &srcs, &dst, ©_attrs); 1816 if (srcs.empty() || !dst) return usage("push requires an argument"); 1817 return do_sync_push(srcs, dst) ? 0 : 1; 1818 } 1819 else if (!strcmp(argv[0], "pull")) { 1820 bool copy_attrs = false; 1821 std::vector<const char*> srcs; 1822 const char* dst = "."; 1823 1824 parse_push_pull_args(&argv[1], argc - 1, &srcs, &dst, ©_attrs); 1825 if (srcs.empty()) return usage("pull requires an argument"); 1826 return do_sync_pull(srcs, dst, copy_attrs) ? 0 : 1; 1827 } 1828 else if (!strcmp(argv[0], "install")) { 1829 if (argc < 2) return usage("install requires an argument"); 1830 if (_use_legacy_install()) { 1831 return install_app_legacy(transport_type, serial, argc, argv); 1832 } 1833 return install_app(transport_type, serial, argc, argv); 1834 } 1835 else if (!strcmp(argv[0], "install-multiple")) { 1836 if (argc < 2) return usage("install-multiple requires an argument"); 1837 return install_multiple_app(transport_type, serial, argc, argv); 1838 } 1839 else if (!strcmp(argv[0], "uninstall")) { 1840 if (argc < 2) return usage("uninstall requires an argument"); 1841 if (_use_legacy_install()) { 1842 return uninstall_app_legacy(transport_type, serial, argc, argv); 1843 } 1844 return uninstall_app(transport_type, serial, argc, argv); 1845 } 1846 else if (!strcmp(argv[0], "sync")) { 1847 std::string src; 1848 bool list_only = false; 1849 if (argc < 2) { 1850 // No local path was specified. 1851 src = ""; 1852 } else if (argc >= 2 && strcmp(argv[1], "-l") == 0) { 1853 list_only = true; 1854 if (argc == 3) { 1855 src = argv[2]; 1856 } else { 1857 src = ""; 1858 } 1859 } else if (argc == 2) { 1860 // A local path or "android"/"data" arg was specified. 1861 src = argv[1]; 1862 } else { 1863 return usage("usage: adb sync [-l] [PARTITION]"); 1864 } 1865 1866 if (src != "" && 1867 src != "system" && src != "data" && src != "vendor" && src != "oem") { 1868 return usage("don't know how to sync %s partition", src.c_str()); 1869 } 1870 1871 std::string system_src_path = product_file("system"); 1872 std::string data_src_path = product_file("data"); 1873 std::string vendor_src_path = product_file("vendor"); 1874 std::string oem_src_path = product_file("oem"); 1875 1876 bool okay = true; 1877 if (okay && (src.empty() || src == "system")) { 1878 okay = do_sync_sync(system_src_path, "/system", list_only); 1879 } 1880 if (okay && (src.empty() || src == "vendor") && directory_exists(vendor_src_path)) { 1881 okay = do_sync_sync(vendor_src_path, "/vendor", list_only); 1882 } 1883 if (okay && (src.empty() || src == "oem") && directory_exists(oem_src_path)) { 1884 okay = do_sync_sync(oem_src_path, "/oem", list_only); 1885 } 1886 if (okay && (src.empty() || src == "data")) { 1887 okay = do_sync_sync(data_src_path, "/data", list_only); 1888 } 1889 return okay ? 0 : 1; 1890 } 1891 /* passthrough commands */ 1892 else if (!strcmp(argv[0],"get-state") || 1893 !strcmp(argv[0],"get-serialno") || 1894 !strcmp(argv[0],"get-devpath")) 1895 { 1896 return adb_query_command(format_host_command(argv[0], transport_type, serial)); 1897 } 1898 /* other commands */ 1899 else if (!strcmp(argv[0],"logcat") || !strcmp(argv[0],"lolcat") || !strcmp(argv[0],"longcat")) { 1900 return logcat(transport_type, serial, argc, argv); 1901 } 1902 else if (!strcmp(argv[0],"ppp")) { 1903 return ppp(argc, argv); 1904 } 1905 else if (!strcmp(argv[0], "start-server")) { 1906 std::string error; 1907 const int result = adb_connect("host:start-server", &error); 1908 if (result < 0) { 1909 fprintf(stderr, "error: %s\n", error.c_str()); 1910 } 1911 return result; 1912 } 1913 else if (!strcmp(argv[0], "backup")) { 1914 return backup(argc, argv); 1915 } 1916 else if (!strcmp(argv[0], "restore")) { 1917 return restore(argc, argv); 1918 } 1919 else if (!strcmp(argv[0], "keygen")) { 1920 if (argc != 2) return usage("keygen requires an argument"); 1921 // Always print key generation information for keygen command. 1922 adb_trace_enable(AUTH); 1923 return adb_auth_keygen(argv[1]); 1924 } 1925 else if (!strcmp(argv[0], "jdwp")) { 1926 return adb_connect_command("jdwp"); 1927 } 1928 else if (!strcmp(argv[0], "track-jdwp")) { 1929 return adb_connect_command("track-jdwp"); 1930 } 1931 else if (!strcmp(argv[0], "track-devices")) { 1932 return adb_connect_command("host:track-devices"); 1933 } 1934 1935 1936 /* "adb /?" is a common idiom under Windows */ 1937 else if (!strcmp(argv[0], "--help") || !strcmp(argv[0], "help") || !strcmp(argv[0], "/?")) { 1938 help(); 1939 return 0; 1940 } 1941 else if (!strcmp(argv[0], "--version") || !strcmp(argv[0], "version")) { 1942 fprintf(stdout, "%s", adb_version().c_str()); 1943 return 0; 1944 } else if (!strcmp(argv[0], "features")) { 1945 // Only list the features common to both the adb client and the device. 1946 FeatureSet features; 1947 std::string error; 1948 if (!adb_get_feature_set(&features, &error)) { 1949 fprintf(stderr, "error: %s\n", error.c_str()); 1950 return 1; 1951 } 1952 1953 for (const std::string& name : features) { 1954 if (CanUseFeature(features, name)) { 1955 printf("%s\n", name.c_str()); 1956 } 1957 } 1958 return 0; 1959 } else if (!strcmp(argv[0], "host-features")) { 1960 return adb_query_command("host:host-features"); 1961 } else if (!strcmp(argv[0], "reconnect")) { 1962 if (argc == 1) { 1963 return adb_query_command("host:reconnect"); 1964 } else if (argc == 2) { 1965 if (!strcmp(argv[1], "device")) { 1966 std::string err; 1967 adb_connect("reconnect", &err); 1968 return 0; 1969 } else if (!strcmp(argv[1], "offline")) { 1970 std::string err; 1971 return adb_query_command("host:reconnect-offline"); 1972 } else { 1973 return usage("usage: adb reconnect [device|offline]"); 1974 } 1975 } 1976 } 1977 1978 usage("unknown command %s", argv[0]); 1979 return 1; 1980 } 1981 1982 static int uninstall_app(TransportType transport, const char* serial, int argc, const char** argv) { 1983 // 'adb uninstall' takes the same arguments as 'cmd package uninstall' on device 1984 std::string cmd = "cmd package"; 1985 while (argc-- > 0) { 1986 // deny the '-k' option until the remaining data/cache can be removed with adb/UI 1987 if (strcmp(*argv, "-k") == 0) { 1988 printf( 1989 "The -k option uninstalls the application while retaining the data/cache.\n" 1990 "At the moment, there is no way to remove the remaining data.\n" 1991 "You will have to reinstall the application with the same signature, and fully uninstall it.\n" 1992 "If you truly wish to continue, execute 'adb shell cmd package uninstall -k'.\n"); 1993 return EXIT_FAILURE; 1994 } 1995 cmd += " " + escape_arg(*argv++); 1996 } 1997 1998 return send_shell_command(transport, serial, cmd, false); 1999 } 2000 2001 static int install_app(TransportType transport, const char* serial, int argc, const char** argv) { 2002 // The last argument must be the APK file 2003 const char* file = argv[argc - 1]; 2004 if (!android::base::EndsWithIgnoreCase(file, ".apk")) { 2005 fprintf(stderr, "Filename doesn't end .apk: %s\n", file); 2006 return EXIT_FAILURE; 2007 } 2008 2009 struct stat sb; 2010 if (stat(file, &sb) == -1) { 2011 fprintf(stderr, "Failed to stat %s: %s\n", file, strerror(errno)); 2012 return 1; 2013 } 2014 2015 int localFd = adb_open(file, O_RDONLY); 2016 if (localFd < 0) { 2017 fprintf(stderr, "Failed to open %s: %s\n", file, strerror(errno)); 2018 return 1; 2019 } 2020 2021 std::string error; 2022 std::string cmd = "exec:cmd package"; 2023 2024 // don't copy the APK name, but, copy the rest of the arguments as-is 2025 while (argc-- > 1) { 2026 cmd += " " + escape_arg(std::string(*argv++)); 2027 } 2028 2029 // add size parameter [required for streaming installs] 2030 // do last to override any user specified value 2031 cmd += " " + android::base::StringPrintf("-S %" PRIu64, static_cast<uint64_t>(sb.st_size)); 2032 2033 int remoteFd = adb_connect(cmd, &error); 2034 if (remoteFd < 0) { 2035 fprintf(stderr, "Connect error for write: %s\n", error.c_str()); 2036 adb_close(localFd); 2037 return 1; 2038 } 2039 2040 char buf[BUFSIZ]; 2041 copy_to_file(localFd, remoteFd); 2042 read_status_line(remoteFd, buf, sizeof(buf)); 2043 2044 adb_close(localFd); 2045 adb_close(remoteFd); 2046 2047 if (strncmp("Success", buf, 7)) { 2048 fprintf(stderr, "Failed to install %s: %s", file, buf); 2049 return 1; 2050 } 2051 fputs(buf, stderr); 2052 return 0; 2053 } 2054 2055 static int install_multiple_app(TransportType transport, const char* serial, int argc, 2056 const char** argv) 2057 { 2058 // Find all APK arguments starting at end. 2059 // All other arguments passed through verbatim. 2060 int first_apk = -1; 2061 uint64_t total_size = 0; 2062 for (int i = argc - 1; i >= 0; i--) { 2063 const char* file = argv[i]; 2064 2065 if (android::base::EndsWithIgnoreCase(file, ".apk")) { 2066 struct stat sb; 2067 if (stat(file, &sb) != -1) total_size += sb.st_size; 2068 first_apk = i; 2069 } else { 2070 break; 2071 } 2072 } 2073 2074 if (first_apk == -1) { 2075 fprintf(stderr, "No APK file on command line\n"); 2076 return 1; 2077 } 2078 2079 std::string install_cmd; 2080 if (_use_legacy_install()) { 2081 install_cmd = "exec:pm"; 2082 } else { 2083 install_cmd = "exec:cmd package"; 2084 } 2085 2086 std::string cmd = android::base::StringPrintf("%s install-create -S %" PRIu64, install_cmd.c_str(), total_size); 2087 for (int i = 1; i < first_apk; i++) { 2088 cmd += " " + escape_arg(argv[i]); 2089 } 2090 2091 // Create install session 2092 std::string error; 2093 int fd = adb_connect(cmd, &error); 2094 if (fd < 0) { 2095 fprintf(stderr, "Connect error for create: %s\n", error.c_str()); 2096 return EXIT_FAILURE; 2097 } 2098 char buf[BUFSIZ]; 2099 read_status_line(fd, buf, sizeof(buf)); 2100 adb_close(fd); 2101 2102 int session_id = -1; 2103 if (!strncmp("Success", buf, 7)) { 2104 char* start = strrchr(buf, '['); 2105 char* end = strrchr(buf, ']'); 2106 if (start && end) { 2107 *end = '\0'; 2108 session_id = strtol(start + 1, NULL, 10); 2109 } 2110 } 2111 if (session_id < 0) { 2112 fprintf(stderr, "Failed to create session\n"); 2113 fputs(buf, stderr); 2114 return EXIT_FAILURE; 2115 } 2116 2117 // Valid session, now stream the APKs 2118 int success = 1; 2119 for (int i = first_apk; i < argc; i++) { 2120 const char* file = argv[i]; 2121 struct stat sb; 2122 if (stat(file, &sb) == -1) { 2123 fprintf(stderr, "Failed to stat %s: %s\n", file, strerror(errno)); 2124 success = 0; 2125 goto finalize_session; 2126 } 2127 2128 std::string cmd = android::base::StringPrintf( 2129 "%s install-write -S %" PRIu64 " %d %d_%s -", 2130 install_cmd.c_str(), static_cast<uint64_t>(sb.st_size), session_id, i, 2131 android::base::Basename(file).c_str()); 2132 2133 int localFd = adb_open(file, O_RDONLY); 2134 if (localFd < 0) { 2135 fprintf(stderr, "Failed to open %s: %s\n", file, strerror(errno)); 2136 success = 0; 2137 goto finalize_session; 2138 } 2139 2140 std::string error; 2141 int remoteFd = adb_connect(cmd, &error); 2142 if (remoteFd < 0) { 2143 fprintf(stderr, "Connect error for write: %s\n", error.c_str()); 2144 adb_close(localFd); 2145 success = 0; 2146 goto finalize_session; 2147 } 2148 2149 copy_to_file(localFd, remoteFd); 2150 read_status_line(remoteFd, buf, sizeof(buf)); 2151 2152 adb_close(localFd); 2153 adb_close(remoteFd); 2154 2155 if (strncmp("Success", buf, 7)) { 2156 fprintf(stderr, "Failed to write %s\n", file); 2157 fputs(buf, stderr); 2158 success = 0; 2159 goto finalize_session; 2160 } 2161 } 2162 2163 finalize_session: 2164 // Commit session if we streamed everything okay; otherwise abandon 2165 std::string service = 2166 android::base::StringPrintf("%s install-%s %d", 2167 install_cmd.c_str(), success ? "commit" : "abandon", session_id); 2168 fd = adb_connect(service, &error); 2169 if (fd < 0) { 2170 fprintf(stderr, "Connect error for finalize: %s\n", error.c_str()); 2171 return EXIT_FAILURE; 2172 } 2173 read_status_line(fd, buf, sizeof(buf)); 2174 adb_close(fd); 2175 2176 if (!strncmp("Success", buf, 7)) { 2177 fputs(buf, stderr); 2178 return 0; 2179 } else { 2180 fprintf(stderr, "Failed to finalize session\n"); 2181 fputs(buf, stderr); 2182 return EXIT_FAILURE; 2183 } 2184 } 2185 2186 static int pm_command(TransportType transport, const char* serial, int argc, const char** argv) { 2187 std::string cmd = "pm"; 2188 2189 while (argc-- > 0) { 2190 cmd += " " + escape_arg(*argv++); 2191 } 2192 2193 return send_shell_command(transport, serial, cmd, false); 2194 } 2195 2196 static int uninstall_app_legacy(TransportType transport, const char* serial, int argc, const char** argv) { 2197 /* if the user choose the -k option, we refuse to do it until devices are 2198 out with the option to uninstall the remaining data somehow (adb/ui) */ 2199 int i; 2200 for (i = 1; i < argc; i++) { 2201 if (!strcmp(argv[i], "-k")) { 2202 printf( 2203 "The -k option uninstalls the application while retaining the data/cache.\n" 2204 "At the moment, there is no way to remove the remaining data.\n" 2205 "You will have to reinstall the application with the same signature, and fully uninstall it.\n" 2206 "If you truly wish to continue, execute 'adb shell pm uninstall -k'\n."); 2207 return EXIT_FAILURE; 2208 } 2209 } 2210 2211 /* 'adb uninstall' takes the same arguments as 'pm uninstall' on device */ 2212 return pm_command(transport, serial, argc, argv); 2213 } 2214 2215 static int delete_file(TransportType transport, const char* serial, const std::string& filename) { 2216 std::string cmd = "rm -f " + escape_arg(filename); 2217 return send_shell_command(transport, serial, cmd, false); 2218 } 2219 2220 static int install_app_legacy(TransportType transport, const char* serial, int argc, const char** argv) { 2221 static const char *const DATA_DEST = "/data/local/tmp/%s"; 2222 static const char *const SD_DEST = "/sdcard/tmp/%s"; 2223 const char* where = DATA_DEST; 2224 2225 for (int i = 1; i < argc; i++) { 2226 if (!strcmp(argv[i], "-s")) { 2227 where = SD_DEST; 2228 } 2229 } 2230 2231 // Find last APK argument. 2232 // All other arguments passed through verbatim. 2233 int last_apk = -1; 2234 for (int i = argc - 1; i >= 0; i--) { 2235 if (android::base::EndsWithIgnoreCase(argv[i], ".apk")) { 2236 last_apk = i; 2237 break; 2238 } 2239 } 2240 2241 if (last_apk == -1) { 2242 fprintf(stderr, "No APK file on command line\n"); 2243 return EXIT_FAILURE; 2244 } 2245 2246 int result = -1; 2247 std::vector<const char*> apk_file = {argv[last_apk]}; 2248 std::string apk_dest = android::base::StringPrintf( 2249 where, android::base::Basename(argv[last_apk]).c_str()); 2250 if (!do_sync_push(apk_file, apk_dest.c_str())) goto cleanup_apk; 2251 argv[last_apk] = apk_dest.c_str(); /* destination name, not source location */ 2252 result = pm_command(transport, serial, argc, argv); 2253 2254 cleanup_apk: 2255 delete_file(transport, serial, apk_dest); 2256 return result; 2257 } 2258