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