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