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