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 static bool _use_legacy_install() {
   1434     FeatureSet features;
   1435     std::string error;
   1436     if (!adb_get_feature_set(&features, &error)) {
   1437         fprintf(stderr, "error: %s\n", error.c_str());
   1438         return true;
   1439     }
   1440     return !CanUseFeature(features, kFeatureCmd);
   1441 }
   1442 
   1443 int adb_commandline(int argc, const char **argv) {
   1444     int no_daemon = 0;
   1445     int is_daemon = 0;
   1446     int is_server = 0;
   1447     int r;
   1448     TransportType transport_type = kTransportAny;
   1449     int ack_reply_fd = -1;
   1450 
   1451 #if !defined(_WIN32)
   1452     // We'd rather have EPIPE than SIGPIPE.
   1453     signal(SIGPIPE, SIG_IGN);
   1454 #endif
   1455 
   1456     // If defined, this should be an absolute path to
   1457     // the directory containing all of the various system images
   1458     // for a particular product.  If not defined, and the adb
   1459     // command requires this information, then the user must
   1460     // specify the path using "-p".
   1461     char* ANDROID_PRODUCT_OUT = getenv("ANDROID_PRODUCT_OUT");
   1462     if (ANDROID_PRODUCT_OUT != nullptr) {
   1463         gProductOutPath = ANDROID_PRODUCT_OUT;
   1464     }
   1465     // TODO: also try TARGET_PRODUCT/TARGET_DEVICE as a hint
   1466 
   1467     /* Validate and assign the server port */
   1468     const char* server_port_str = getenv("ANDROID_ADB_SERVER_PORT");
   1469     int server_port = DEFAULT_ADB_PORT;
   1470     if (server_port_str && strlen(server_port_str) > 0) {
   1471         server_port = strtol(server_port_str, nullptr, 0);
   1472         if (server_port <= 0 || server_port > 65535) {
   1473             fprintf(stderr,
   1474                     "adb: Env var ANDROID_ADB_SERVER_PORT must be a positive number less than 65536. Got \"%s\"\n",
   1475                     server_port_str);
   1476             return usage();
   1477         }
   1478     }
   1479 
   1480     // We need to check for -d and -e before we look at $ANDROID_SERIAL.
   1481     const char* serial = nullptr;
   1482 
   1483     while (argc > 0) {
   1484         if (!strcmp(argv[0],"server")) {
   1485             is_server = 1;
   1486         } else if (!strcmp(argv[0],"nodaemon")) {
   1487             no_daemon = 1;
   1488         } else if (!strcmp(argv[0], "fork-server")) {
   1489             /* this is a special flag used only when the ADB client launches the ADB Server */
   1490             is_daemon = 1;
   1491         } else if (!strcmp(argv[0], "--reply-fd")) {
   1492             if (argc < 2) return usage();
   1493             const char* reply_fd_str = argv[1];
   1494             argc--;
   1495             argv++;
   1496             ack_reply_fd = strtol(reply_fd_str, nullptr, 10);
   1497             if (!_is_valid_ack_reply_fd(ack_reply_fd)) {
   1498                 fprintf(stderr, "adb: invalid reply fd \"%s\"\n", reply_fd_str);
   1499                 return usage();
   1500             }
   1501         } else if (!strncmp(argv[0], "-p", 2)) {
   1502             const char* product = nullptr;
   1503             if (argv[0][2] == '\0') {
   1504                 if (argc < 2) return usage();
   1505                 product = argv[1];
   1506                 argc--;
   1507                 argv++;
   1508             } else {
   1509                 product = argv[0] + 2;
   1510             }
   1511             gProductOutPath = find_product_out_path(product);
   1512             if (gProductOutPath.empty()) {
   1513                 fprintf(stderr, "adb: could not resolve \"-p %s\"\n", product);
   1514                 return usage();
   1515             }
   1516         } else if (argv[0][0]=='-' && argv[0][1]=='s') {
   1517             if (isdigit(argv[0][2])) {
   1518                 serial = argv[0] + 2;
   1519             } else {
   1520                 if (argc < 2 || argv[0][2] != '\0') return usage();
   1521                 serial = argv[1];
   1522                 argc--;
   1523                 argv++;
   1524             }
   1525         } else if (!strcmp(argv[0],"-d")) {
   1526             transport_type = kTransportUsb;
   1527         } else if (!strcmp(argv[0],"-e")) {
   1528             transport_type = kTransportLocal;
   1529         } else if (!strcmp(argv[0],"-a")) {
   1530             gListenAll = 1;
   1531         } else if (!strncmp(argv[0], "-H", 2)) {
   1532             const char *hostname = NULL;
   1533             if (argv[0][2] == '\0') {
   1534                 if (argc < 2) return usage();
   1535                 hostname = argv[1];
   1536                 argc--;
   1537                 argv++;
   1538             } else {
   1539                 hostname = argv[0] + 2;
   1540             }
   1541             adb_set_tcp_name(hostname);
   1542 
   1543         } else if (!strncmp(argv[0], "-P", 2)) {
   1544             if (argv[0][2] == '\0') {
   1545                 if (argc < 2) return usage();
   1546                 server_port_str = argv[1];
   1547                 argc--;
   1548                 argv++;
   1549             } else {
   1550                 server_port_str = argv[0] + 2;
   1551             }
   1552             if (strlen(server_port_str) > 0) {
   1553                 server_port = (int) strtol(server_port_str, NULL, 0);
   1554                 if (server_port <= 0 || server_port > 65535) {
   1555                     fprintf(stderr,
   1556                             "adb: port number must be a positive number less than 65536. Got \"%s\"\n",
   1557                             server_port_str);
   1558                     return usage();
   1559                 }
   1560             } else {
   1561                 fprintf(stderr,
   1562                 "adb: port number must be a positive number less than 65536. Got empty string.\n");
   1563                 return usage();
   1564             }
   1565         } else {
   1566                 /* out of recognized modifiers and flags */
   1567             break;
   1568         }
   1569         argc--;
   1570         argv++;
   1571     }
   1572 
   1573     // If none of -d, -e, or -s were specified, try $ANDROID_SERIAL.
   1574     if (transport_type == kTransportAny && serial == nullptr) {
   1575         serial = getenv("ANDROID_SERIAL");
   1576     }
   1577 
   1578     adb_set_transport(transport_type, serial);
   1579     adb_set_tcp_specifics(server_port);
   1580 
   1581     if (is_server) {
   1582         if (no_daemon || is_daemon) {
   1583             if (is_daemon && (ack_reply_fd == -1)) {
   1584                 fprintf(stderr, "reply fd for adb server to client communication not specified.\n");
   1585                 return usage();
   1586             }
   1587             r = adb_server_main(is_daemon, server_port, ack_reply_fd);
   1588         } else {
   1589             r = launch_server(server_port);
   1590         }
   1591         if (r) {
   1592             fprintf(stderr,"* could not start server *\n");
   1593         }
   1594         return r;
   1595     }
   1596 
   1597     if (argc == 0) {
   1598         return usage();
   1599     }
   1600 
   1601     /* handle wait-for-* prefix */
   1602     if (!strncmp(argv[0], "wait-for-", strlen("wait-for-"))) {
   1603         const char* service = argv[0];
   1604 
   1605         if (!wait_for_device(service, transport_type, serial)) {
   1606             return 1;
   1607         }
   1608 
   1609         // Allow a command to be run after wait-for-device,
   1610         // e.g. 'adb wait-for-device shell'.
   1611         if (argc == 1) {
   1612             return 0;
   1613         }
   1614 
   1615         /* Fall through */
   1616         argc--;
   1617         argv++;
   1618     }
   1619 
   1620     /* adb_connect() commands */
   1621     if (!strcmp(argv[0], "devices")) {
   1622         const char *listopt;
   1623         if (argc < 2) {
   1624             listopt = "";
   1625         } else if (argc == 2 && !strcmp(argv[1], "-l")) {
   1626             listopt = argv[1];
   1627         } else {
   1628             fprintf(stderr, "Usage: adb devices [-l]\n");
   1629             return 1;
   1630         }
   1631 
   1632         std::string query = android::base::StringPrintf("host:%s%s", argv[0], listopt);
   1633         printf("List of devices attached\n");
   1634         return adb_query_command(query);
   1635     }
   1636     else if (!strcmp(argv[0], "connect")) {
   1637         if (argc != 2) {
   1638             fprintf(stderr, "Usage: adb connect <host>[:<port>]\n");
   1639             return 1;
   1640         }
   1641 
   1642         std::string query = android::base::StringPrintf("host:connect:%s", argv[1]);
   1643         return adb_query_command(query);
   1644     }
   1645     else if (!strcmp(argv[0], "disconnect")) {
   1646         if (argc > 2) {
   1647             fprintf(stderr, "Usage: adb disconnect [<host>[:<port>]]\n");
   1648             return 1;
   1649         }
   1650 
   1651         std::string query = android::base::StringPrintf("host:disconnect:%s",
   1652                                                         (argc == 2) ? argv[1] : "");
   1653         return adb_query_command(query);
   1654     }
   1655     else if (!strcmp(argv[0], "emu")) {
   1656         return adb_send_emulator_command(argc, argv, serial);
   1657     }
   1658     else if (!strcmp(argv[0], "shell")) {
   1659         return adb_shell(argc, argv);
   1660     }
   1661     else if (!strcmp(argv[0], "exec-in") || !strcmp(argv[0], "exec-out")) {
   1662         int exec_in = !strcmp(argv[0], "exec-in");
   1663 
   1664         std::string cmd = "exec:";
   1665         cmd += argv[1];
   1666         argc -= 2;
   1667         argv += 2;
   1668         while (argc-- > 0) {
   1669             cmd += " " + escape_arg(*argv++);
   1670         }
   1671 
   1672         std::string error;
   1673         int fd = adb_connect(cmd, &error);
   1674         if (fd < 0) {
   1675             fprintf(stderr, "error: %s\n", error.c_str());
   1676             return -1;
   1677         }
   1678 
   1679         if (exec_in) {
   1680             copy_to_file(STDIN_FILENO, fd);
   1681         } else {
   1682             copy_to_file(fd, STDOUT_FILENO);
   1683         }
   1684 
   1685         adb_close(fd);
   1686         return 0;
   1687     }
   1688     else if (!strcmp(argv[0], "kill-server")) {
   1689         std::string error;
   1690         int fd = _adb_connect("host:kill", &error);
   1691         if (fd == -2) {
   1692             // Failed to make network connection to server. Don't output the
   1693             // network error since that is expected.
   1694             fprintf(stderr,"* server not running *\n");
   1695             // Successful exit code because the server is already "killed".
   1696             return 0;
   1697         } else if (fd == -1) {
   1698             // Some other error.
   1699             fprintf(stderr, "error: %s\n", error.c_str());
   1700             return 1;
   1701         } else {
   1702             // Successfully connected, kill command sent, okay status came back.
   1703             // Server should exit() in a moment, if not already.
   1704             ReadOrderlyShutdown(fd);
   1705             adb_close(fd);
   1706             return 0;
   1707         }
   1708     }
   1709     else if (!strcmp(argv[0], "sideload")) {
   1710         if (argc != 2) return usage();
   1711         if (adb_sideload_host(argv[1])) {
   1712             return 1;
   1713         } else {
   1714             return 0;
   1715         }
   1716     }
   1717     else if (!strcmp(argv[0], "tcpip") && argc > 1) {
   1718         return adb_connect_command(android::base::StringPrintf("tcpip:%s", argv[1]));
   1719     }
   1720     else if (!strcmp(argv[0], "remount") ||
   1721              !strcmp(argv[0], "reboot") ||
   1722              !strcmp(argv[0], "reboot-bootloader") ||
   1723              !strcmp(argv[0], "usb") ||
   1724              !strcmp(argv[0], "disable-verity") ||
   1725              !strcmp(argv[0], "enable-verity")) {
   1726         std::string command;
   1727         if (!strcmp(argv[0], "reboot-bootloader")) {
   1728             command = "reboot:bootloader";
   1729         } else if (argc > 1) {
   1730             command = android::base::StringPrintf("%s:%s", argv[0], argv[1]);
   1731         } else {
   1732             command = android::base::StringPrintf("%s:", argv[0]);
   1733         }
   1734         return adb_connect_command(command);
   1735     } else if (!strcmp(argv[0], "root") || !strcmp(argv[0], "unroot")) {
   1736         return adb_root(argv[0]) ? 0 : 1;
   1737     } else if (!strcmp(argv[0], "bugreport")) {
   1738         Bugreport bugreport;
   1739         return bugreport.DoIt(transport_type, serial, argc, argv);
   1740     } else if (!strcmp(argv[0], "forward") || !strcmp(argv[0], "reverse")) {
   1741         bool reverse = !strcmp(argv[0], "reverse");
   1742         ++argv;
   1743         --argc;
   1744         if (argc < 1) return usage();
   1745 
   1746         // Determine the <host-prefix> for this command.
   1747         std::string host_prefix;
   1748         if (reverse) {
   1749             host_prefix = "reverse";
   1750         } else {
   1751             if (serial) {
   1752                 host_prefix = android::base::StringPrintf("host-serial:%s", serial);
   1753             } else if (transport_type == kTransportUsb) {
   1754                 host_prefix = "host-usb";
   1755             } else if (transport_type == kTransportLocal) {
   1756                 host_prefix = "host-local";
   1757             } else {
   1758                 host_prefix = "host";
   1759             }
   1760         }
   1761 
   1762         std::string cmd;
   1763         if (strcmp(argv[0], "--list") == 0) {
   1764             if (argc != 1) return usage();
   1765             return adb_query_command(host_prefix + ":list-forward");
   1766         } else if (strcmp(argv[0], "--remove-all") == 0) {
   1767             if (argc != 1) return usage();
   1768             cmd = host_prefix + ":killforward-all";
   1769         } else if (strcmp(argv[0], "--remove") == 0) {
   1770             // forward --remove <local>
   1771             if (argc != 2) return usage();
   1772             cmd = host_prefix + ":killforward:" + argv[1];
   1773         } else if (strcmp(argv[0], "--no-rebind") == 0) {
   1774             // forward --no-rebind <local> <remote>
   1775             if (argc != 3) return usage();
   1776             cmd = host_prefix + ":forward:norebind:" + argv[1] + ";" + argv[2];
   1777         } else {
   1778             // forward <local> <remote>
   1779             if (argc != 2) return usage();
   1780             cmd = host_prefix + ":forward:" + argv[0] + ";" + argv[1];
   1781         }
   1782 
   1783         return adb_command(cmd) ? 0 : 1;
   1784     }
   1785     /* do_sync_*() commands */
   1786     else if (!strcmp(argv[0], "ls")) {
   1787         if (argc != 2) return usage();
   1788         return do_sync_ls(argv[1]) ? 0 : 1;
   1789     }
   1790     else if (!strcmp(argv[0], "push")) {
   1791         bool copy_attrs = false;
   1792         std::vector<const char*> srcs;
   1793         const char* dst = nullptr;
   1794 
   1795         parse_push_pull_args(&argv[1], argc - 1, &srcs, &dst, &copy_attrs);
   1796         if (srcs.empty() || !dst) return usage();
   1797         return do_sync_push(srcs, dst) ? 0 : 1;
   1798     }
   1799     else if (!strcmp(argv[0], "pull")) {
   1800         bool copy_attrs = false;
   1801         std::vector<const char*> srcs;
   1802         const char* dst = ".";
   1803 
   1804         parse_push_pull_args(&argv[1], argc - 1, &srcs, &dst, &copy_attrs);
   1805         if (srcs.empty()) return usage();
   1806         return do_sync_pull(srcs, dst, copy_attrs) ? 0 : 1;
   1807     }
   1808     else if (!strcmp(argv[0], "install")) {
   1809         if (argc < 2) return usage();
   1810         if (_use_legacy_install()) {
   1811             return install_app_legacy(transport_type, serial, argc, argv);
   1812         }
   1813         return install_app(transport_type, serial, argc, argv);
   1814     }
   1815     else if (!strcmp(argv[0], "install-multiple")) {
   1816         if (argc < 2) return usage();
   1817         return install_multiple_app(transport_type, serial, argc, argv);
   1818     }
   1819     else if (!strcmp(argv[0], "uninstall")) {
   1820         if (argc < 2) return usage();
   1821         if (_use_legacy_install()) {
   1822             return uninstall_app_legacy(transport_type, serial, argc, argv);
   1823         }
   1824         return uninstall_app(transport_type, serial, argc, argv);
   1825     }
   1826     else if (!strcmp(argv[0], "sync")) {
   1827         std::string src;
   1828         bool list_only = false;
   1829         if (argc < 2) {
   1830             // No local path was specified.
   1831             src = "";
   1832         } else if (argc >= 2 && strcmp(argv[1], "-l") == 0) {
   1833             list_only = true;
   1834             if (argc == 3) {
   1835                 src = argv[2];
   1836             } else {
   1837                 src = "";
   1838             }
   1839         } else if (argc == 2) {
   1840             // A local path or "android"/"data" arg was specified.
   1841             src = argv[1];
   1842         } else {
   1843             return usage();
   1844         }
   1845 
   1846         if (src != "" &&
   1847             src != "system" && src != "data" && src != "vendor" && src != "oem") {
   1848             return usage();
   1849         }
   1850 
   1851         std::string system_src_path = product_file("system");
   1852         std::string data_src_path = product_file("data");
   1853         std::string vendor_src_path = product_file("vendor");
   1854         std::string oem_src_path = product_file("oem");
   1855 
   1856         bool okay = true;
   1857         if (okay && (src.empty() || src == "system")) {
   1858             okay = do_sync_sync(system_src_path, "/system", list_only);
   1859         }
   1860         if (okay && (src.empty() || src == "vendor") && directory_exists(vendor_src_path)) {
   1861             okay = do_sync_sync(vendor_src_path, "/vendor", list_only);
   1862         }
   1863         if (okay && (src.empty() || src == "oem") && directory_exists(oem_src_path)) {
   1864             okay = do_sync_sync(oem_src_path, "/oem", list_only);
   1865         }
   1866         if (okay && (src.empty() || src == "data")) {
   1867             okay = do_sync_sync(data_src_path, "/data", list_only);
   1868         }
   1869         return okay ? 0 : 1;
   1870     }
   1871     /* passthrough commands */
   1872     else if (!strcmp(argv[0],"get-state") ||
   1873         !strcmp(argv[0],"get-serialno") ||
   1874         !strcmp(argv[0],"get-devpath"))
   1875     {
   1876         return adb_query_command(format_host_command(argv[0], transport_type, serial));
   1877     }
   1878     /* other commands */
   1879     else if (!strcmp(argv[0],"logcat") || !strcmp(argv[0],"lolcat") || !strcmp(argv[0],"longcat")) {
   1880         return logcat(transport_type, serial, argc, argv);
   1881     }
   1882     else if (!strcmp(argv[0],"ppp")) {
   1883         return ppp(argc, argv);
   1884     }
   1885     else if (!strcmp(argv[0], "start-server")) {
   1886         std::string error;
   1887         const int result = adb_connect("host:start-server", &error);
   1888         if (result < 0) {
   1889             fprintf(stderr, "error: %s\n", error.c_str());
   1890         }
   1891         return result;
   1892     }
   1893     else if (!strcmp(argv[0], "backup")) {
   1894         return backup(argc, argv);
   1895     }
   1896     else if (!strcmp(argv[0], "restore")) {
   1897         return restore(argc, argv);
   1898     }
   1899     else if (!strcmp(argv[0], "keygen")) {
   1900         if (argc < 2) return usage();
   1901         // Always print key generation information for keygen command.
   1902         adb_trace_enable(AUTH);
   1903         return adb_auth_keygen(argv[1]);
   1904     }
   1905     else if (!strcmp(argv[0], "jdwp")) {
   1906         return adb_connect_command("jdwp");
   1907     }
   1908     /* "adb /?" is a common idiom under Windows */
   1909     else if (!strcmp(argv[0], "help") || !strcmp(argv[0], "/?")) {
   1910         help();
   1911         return 0;
   1912     }
   1913     else if (!strcmp(argv[0], "version")) {
   1914         fprintf(stdout, "%s", adb_version().c_str());
   1915         return 0;
   1916     }
   1917     else if (!strcmp(argv[0], "features")) {
   1918         // Only list the features common to both the adb client and the device.
   1919         FeatureSet features;
   1920         std::string error;
   1921         if (!adb_get_feature_set(&features, &error)) {
   1922             fprintf(stderr, "error: %s\n", error.c_str());
   1923             return 1;
   1924         }
   1925 
   1926         for (const std::string& name : features) {
   1927             if (CanUseFeature(features, name)) {
   1928                 printf("%s\n", name.c_str());
   1929             }
   1930         }
   1931         return 0;
   1932     } else if (!strcmp(argv[0], "reconnect")) {
   1933         if (argc == 1) {
   1934             return adb_query_command("host:reconnect");
   1935         } else if (argc == 2 && !strcmp(argv[1], "device")) {
   1936             std::string err;
   1937             adb_connect("reconnect", &err);
   1938             return 0;
   1939         }
   1940     }
   1941 
   1942     usage();
   1943     return 1;
   1944 }
   1945 
   1946 static int uninstall_app(TransportType transport, const char* serial, int argc, const char** argv) {
   1947     // 'adb uninstall' takes the same arguments as 'cmd package uninstall' on device
   1948     std::string cmd = "cmd package";
   1949     while (argc-- > 0) {
   1950         // deny the '-k' option until the remaining data/cache can be removed with adb/UI
   1951         if (strcmp(*argv, "-k") == 0) {
   1952             printf(
   1953                 "The -k option uninstalls the application while retaining the data/cache.\n"
   1954                 "At the moment, there is no way to remove the remaining data.\n"
   1955                 "You will have to reinstall the application with the same signature, and fully uninstall it.\n"
   1956                 "If you truly wish to continue, execute 'adb shell cmd package uninstall -k'.\n");
   1957             return EXIT_FAILURE;
   1958         }
   1959         cmd += " " + escape_arg(*argv++);
   1960     }
   1961 
   1962     return send_shell_command(transport, serial, cmd, false);
   1963 }
   1964 
   1965 static int install_app(TransportType transport, const char* serial, int argc, const char** argv) {
   1966     // The last argument must be the APK file
   1967     const char* file = argv[argc - 1];
   1968     const char* dot = strrchr(file, '.');
   1969     bool found_apk = false;
   1970     struct stat sb;
   1971     if (dot && !strcasecmp(dot, ".apk")) {
   1972         if (stat(file, &sb) == -1 || !S_ISREG(sb.st_mode)) {
   1973             fprintf(stderr, "Invalid APK file: %s\n", file);
   1974             return EXIT_FAILURE;
   1975         }
   1976         found_apk = true;
   1977     }
   1978 
   1979     if (!found_apk) {
   1980         fprintf(stderr, "Missing APK file\n");
   1981         return EXIT_FAILURE;
   1982     }
   1983 
   1984     int localFd = adb_open(file, O_RDONLY);
   1985     if (localFd < 0) {
   1986         fprintf(stderr, "Failed to open %s: %s\n", file, strerror(errno));
   1987         return 1;
   1988     }
   1989 
   1990     std::string error;
   1991     std::string cmd = "exec:cmd package";
   1992 
   1993     // don't copy the APK name, but, copy the rest of the arguments as-is
   1994     while (argc-- > 1) {
   1995         cmd += " " + escape_arg(std::string(*argv++));
   1996     }
   1997 
   1998     // add size parameter [required for streaming installs]
   1999     // do last to override any user specified value
   2000     cmd += " " + android::base::StringPrintf("-S %" PRIu64, static_cast<uint64_t>(sb.st_size));
   2001 
   2002     int remoteFd = adb_connect(cmd, &error);
   2003     if (remoteFd < 0) {
   2004         fprintf(stderr, "Connect error for write: %s\n", error.c_str());
   2005         adb_close(localFd);
   2006         return 1;
   2007     }
   2008 
   2009     char buf[BUFSIZ];
   2010     copy_to_file(localFd, remoteFd);
   2011     read_status_line(remoteFd, buf, sizeof(buf));
   2012 
   2013     adb_close(localFd);
   2014     adb_close(remoteFd);
   2015 
   2016     if (strncmp("Success", buf, 7)) {
   2017         fprintf(stderr, "Failed to install %s: %s", file, buf);
   2018         return 1;
   2019     }
   2020     fputs(buf, stderr);
   2021     return 0;
   2022 }
   2023 
   2024 static int install_multiple_app(TransportType transport, const char* serial, int argc,
   2025                                 const char** argv)
   2026 {
   2027     int i;
   2028     struct stat sb;
   2029     uint64_t total_size = 0;
   2030     // Find all APK arguments starting at end.
   2031     // All other arguments passed through verbatim.
   2032     int first_apk = -1;
   2033     for (i = argc - 1; i >= 0; i--) {
   2034         const char* file = argv[i];
   2035         const char* dot = strrchr(file, '.');
   2036         if (dot && !strcasecmp(dot, ".apk")) {
   2037             if (stat(file, &sb) == -1 || !S_ISREG(sb.st_mode)) {
   2038                 fprintf(stderr, "Invalid APK file: %s\n", file);
   2039                 return EXIT_FAILURE;
   2040             }
   2041 
   2042             total_size += sb.st_size;
   2043             first_apk = i;
   2044         } else {
   2045             break;
   2046         }
   2047     }
   2048 
   2049     if (first_apk == -1) {
   2050         fprintf(stderr, "Missing APK file\n");
   2051         return 1;
   2052     }
   2053 
   2054     std::string install_cmd;
   2055     if (_use_legacy_install()) {
   2056         install_cmd = "exec:pm";
   2057     } else {
   2058         install_cmd = "exec:cmd package";
   2059     }
   2060 
   2061     std::string cmd = android::base::StringPrintf("%s install-create -S %" PRIu64, install_cmd.c_str(), total_size);
   2062     for (i = 1; i < first_apk; i++) {
   2063         cmd += " " + escape_arg(argv[i]);
   2064     }
   2065 
   2066     // Create install session
   2067     std::string error;
   2068     int fd = adb_connect(cmd, &error);
   2069     if (fd < 0) {
   2070         fprintf(stderr, "Connect error for create: %s\n", error.c_str());
   2071         return EXIT_FAILURE;
   2072     }
   2073     char buf[BUFSIZ];
   2074     read_status_line(fd, buf, sizeof(buf));
   2075     adb_close(fd);
   2076 
   2077     int session_id = -1;
   2078     if (!strncmp("Success", buf, 7)) {
   2079         char* start = strrchr(buf, '[');
   2080         char* end = strrchr(buf, ']');
   2081         if (start && end) {
   2082             *end = '\0';
   2083             session_id = strtol(start + 1, NULL, 10);
   2084         }
   2085     }
   2086     if (session_id < 0) {
   2087         fprintf(stderr, "Failed to create session\n");
   2088         fputs(buf, stderr);
   2089         return EXIT_FAILURE;
   2090     }
   2091 
   2092     // Valid session, now stream the APKs
   2093     int success = 1;
   2094     for (i = first_apk; i < argc; i++) {
   2095         const char* file = argv[i];
   2096         if (stat(file, &sb) == -1) {
   2097             fprintf(stderr, "Failed to stat %s\n", file);
   2098             success = 0;
   2099             goto finalize_session;
   2100         }
   2101 
   2102         std::string cmd = android::base::StringPrintf(
   2103                 "%s install-write -S %" PRIu64 " %d %d_%s -",
   2104                 install_cmd.c_str(), static_cast<uint64_t>(sb.st_size), session_id, i, adb_basename(file).c_str());
   2105 
   2106         int localFd = adb_open(file, O_RDONLY);
   2107         if (localFd < 0) {
   2108             fprintf(stderr, "Failed to open %s: %s\n", file, strerror(errno));
   2109             success = 0;
   2110             goto finalize_session;
   2111         }
   2112 
   2113         std::string error;
   2114         int remoteFd = adb_connect(cmd, &error);
   2115         if (remoteFd < 0) {
   2116             fprintf(stderr, "Connect error for write: %s\n", error.c_str());
   2117             adb_close(localFd);
   2118             success = 0;
   2119             goto finalize_session;
   2120         }
   2121 
   2122         copy_to_file(localFd, remoteFd);
   2123         read_status_line(remoteFd, buf, sizeof(buf));
   2124 
   2125         adb_close(localFd);
   2126         adb_close(remoteFd);
   2127 
   2128         if (strncmp("Success", buf, 7)) {
   2129             fprintf(stderr, "Failed to write %s\n", file);
   2130             fputs(buf, stderr);
   2131             success = 0;
   2132             goto finalize_session;
   2133         }
   2134     }
   2135 
   2136 finalize_session:
   2137     // Commit session if we streamed everything okay; otherwise abandon
   2138     std::string service =
   2139             android::base::StringPrintf("%s install-%s %d",
   2140                                         install_cmd.c_str(), success ? "commit" : "abandon", session_id);
   2141     fd = adb_connect(service, &error);
   2142     if (fd < 0) {
   2143         fprintf(stderr, "Connect error for finalize: %s\n", error.c_str());
   2144         return EXIT_FAILURE;
   2145     }
   2146     read_status_line(fd, buf, sizeof(buf));
   2147     adb_close(fd);
   2148 
   2149     if (!strncmp("Success", buf, 7)) {
   2150         fputs(buf, stderr);
   2151         return 0;
   2152     } else {
   2153         fprintf(stderr, "Failed to finalize session\n");
   2154         fputs(buf, stderr);
   2155         return EXIT_FAILURE;
   2156     }
   2157 }
   2158 
   2159 static int pm_command(TransportType transport, const char* serial, int argc, const char** argv) {
   2160     std::string cmd = "pm";
   2161 
   2162     while (argc-- > 0) {
   2163         cmd += " " + escape_arg(*argv++);
   2164     }
   2165 
   2166     return send_shell_command(transport, serial, cmd, false);
   2167 }
   2168 
   2169 static int uninstall_app_legacy(TransportType transport, const char* serial, int argc, const char** argv) {
   2170     /* if the user choose the -k option, we refuse to do it until devices are
   2171        out with the option to uninstall the remaining data somehow (adb/ui) */
   2172     int i;
   2173     for (i = 1; i < argc; i++) {
   2174         if (!strcmp(argv[i], "-k")) {
   2175             printf(
   2176                 "The -k option uninstalls the application while retaining the data/cache.\n"
   2177                 "At the moment, there is no way to remove the remaining data.\n"
   2178                 "You will have to reinstall the application with the same signature, and fully uninstall it.\n"
   2179                 "If you truly wish to continue, execute 'adb shell pm uninstall -k'\n.");
   2180             return EXIT_FAILURE;
   2181         }
   2182     }
   2183 
   2184     /* 'adb uninstall' takes the same arguments as 'pm uninstall' on device */
   2185     return pm_command(transport, serial, argc, argv);
   2186 }
   2187 
   2188 static int delete_file(TransportType transport, const char* serial, const std::string& filename) {
   2189     std::string cmd = "rm -f " + escape_arg(filename);
   2190     return send_shell_command(transport, serial, cmd, false);
   2191 }
   2192 
   2193 static int install_app_legacy(TransportType transport, const char* serial, int argc, const char** argv) {
   2194     static const char *const DATA_DEST = "/data/local/tmp/%s";
   2195     static const char *const SD_DEST = "/sdcard/tmp/%s";
   2196     const char* where = DATA_DEST;
   2197     int i;
   2198     struct stat sb;
   2199 
   2200     for (i = 1; i < argc; i++) {
   2201         if (!strcmp(argv[i], "-s")) {
   2202             where = SD_DEST;
   2203         }
   2204     }
   2205 
   2206     // Find last APK argument.
   2207     // All other arguments passed through verbatim.
   2208     int last_apk = -1;
   2209     for (i = argc - 1; i >= 0; i--) {
   2210         const char* file = argv[i];
   2211         const char* dot = strrchr(file, '.');
   2212         if (dot && !strcasecmp(dot, ".apk")) {
   2213             if (stat(file, &sb) == -1 || !S_ISREG(sb.st_mode)) {
   2214                 fprintf(stderr, "Invalid APK file: %s\n", file);
   2215                 return EXIT_FAILURE;
   2216             }
   2217 
   2218             last_apk = i;
   2219             break;
   2220         }
   2221     }
   2222 
   2223     if (last_apk == -1) {
   2224         fprintf(stderr, "Missing APK file\n");
   2225         return EXIT_FAILURE;
   2226     }
   2227 
   2228     int result = -1;
   2229     std::vector<const char*> apk_file = {argv[last_apk]};
   2230     std::string apk_dest = android::base::StringPrintf(
   2231         where, adb_basename(argv[last_apk]).c_str());
   2232     if (!do_sync_push(apk_file, apk_dest.c_str())) goto cleanup_apk;
   2233     argv[last_apk] = apk_dest.c_str(); /* destination name, not source location */
   2234     result = pm_command(transport, serial, argc, argv);
   2235 
   2236 cleanup_apk:
   2237     delete_file(transport, serial, apk_dest);
   2238     return result;
   2239 }
   2240