Home | History | Annotate | Download | only in adb
      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, &copy_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, &copy_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