commandline.c revision d2f5415c603f7d9961f7a0b05579a0768e071410
1dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/*
2dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
3dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *
4dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * you may not use this file except in compliance with the License.
6dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * You may obtain a copy of the License at
7dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *
8dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *
10dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * See the License for the specific language governing permissions and
14dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * limitations under the License.
15dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */
16dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
17dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdio.h>
18dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdlib.h>
19dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <string.h>
20dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <errno.h>
21dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <unistd.h>
22dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <limits.h>
23dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdarg.h>
24dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/types.h>
25dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/stat.h>
26dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <ctype.h>
27dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <assert.h>
28dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
29dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "sysdeps.h"
30dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
31dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef HAVE_TERMIO_H
32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <termios.h>
33dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif
34dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
35dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define  TRACE_TAG  TRACE_ADB
36dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "adb.h"
37dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "adb_client.h"
38dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "file_sync_service.h"
39dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
40dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int do_cmd(transport_type ttype, char* serial, char *cmd, ...);
41dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
423166410a82f43d39201be98a8d35c51baa86cb53Alexey Tarasovvoid get_my_path(char *s, size_t maxLen);
43dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint find_sync_dirs(const char *srcarg,
44dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        char **android_srcdir_out, char **data_srcdir_out);
45dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint install_app(transport_type transport, char* serial, int argc, char** argv);
46dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint uninstall_app(transport_type transport, char* serial, int argc, char** argv);
47dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
48dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic const char *gProductOutPath = NULL;
49dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
50dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic char *product_file(const char *extra)
51dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
52dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int n;
53dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    char *x;
54dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
55dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (gProductOutPath == NULL) {
56dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        fprintf(stderr, "adb: Product directory not specified; "
57dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                "use -p or define ANDROID_PRODUCT_OUT\n");
58dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        exit(1);
59dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
60dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
61dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    n = strlen(gProductOutPath) + strlen(extra) + 2;
62dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    x = malloc(n);
63dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (x == 0) {
64dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        fprintf(stderr, "adb: Out of memory (product_file())\n");
65dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        exit(1);
66dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
67dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
68dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    snprintf(x, (size_t)n, "%s" OS_PATH_SEPARATOR_STR "%s", gProductOutPath, extra);
69dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return x;
70dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
71dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
72dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid version(FILE * out) {
73dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    fprintf(out, "Android Debug Bridge version %d.%d.%d\n",
74dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project         ADB_VERSION_MAJOR, ADB_VERSION_MINOR, ADB_SERVER_VERSION);
75dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
76dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
77dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid help()
78dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
79dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    version(stderr);
80dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
81dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    fprintf(stderr,
82dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        "\n"
83dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        " -d                            - directs command to the only connected USB device\n"
84dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        "                                 returns an error if more than one USB device is present.\n"
85dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        " -e                            - directs command to the only running emulator.\n"
86dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        "                                 returns an error if more than one emulator is running.\n"
87dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        " -s <serial number>            - directs command to the USB device or emulator with\n"
88db4492640313be9d3fd65ee5bd7648a9570411bbNick Pelly        "                                 the given serial number. Overrides ANDROID_SERIAL\n"
8931dbed7b60d8237d6d05dc6bf230167a5854b77aElliott Hughes        "                                 environment variable.\n"
90dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        " -p <product name or path>     - simple product name like 'sooner', or\n"
91dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        "                                 a relative/absolute path to a product\n"
92dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        "                                 out directory like 'out/target/product/sooner'.\n"
93dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        "                                 If -p is not specified, the ANDROID_PRODUCT_OUT\n"
94dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        "                                 environment variable is used, which must\n"
95dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        "                                 be an absolute path.\n"
96dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        " devices                       - list all connected devices\n"
97cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood        " connect <host>[:<port>]       - connect to a device via TCP/IP\n"
98cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood        "                                 Port 5555 is used by default if no port number is specified.\n"
99cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood        " disconnect [<host>[:<port>]]  - disconnect from a TCP/IP device.\n"
100cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood        "                                 Port 5555 is used by default if no port number is specified.\n"
101cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood        "                                 Using this ocmmand with no additional arguments\n"
102cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood        "                                 will disconnect from all connected TCP/IP devices.\n"
103dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        "\n"
104dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        "device commands:\n"
105dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        "  adb push <local> <remote>    - copy file/dir to device\n"
10600c0eeac6be1597ce24fccf8e2afaaffab223cb3Joe Onorato        "  adb pull <remote> [<local>]  - copy file/dir from device\n"
107dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        "  adb sync [ <directory> ]     - copy host->device only if changed\n"
108705c944c0e2a50150ffb41707b6b3daebb45cf79Anthony Newnam        "                                 (-l means list but don't copy)\n"
109dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        "                                 (see 'adb help all')\n"
110dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        "  adb shell                    - run remote shell interactively\n"
111dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        "  adb shell <command>          - run remote shell command\n"
112dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        "  adb emu <command>            - run emulator console command\n"
113dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        "  adb logcat [ <filter-spec> ] - View device log\n"
114dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        "  adb forward <local> <remote> - forward socket connections\n"
115dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        "                                 forward specs are one of: \n"
116dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        "                                   tcp:<port>\n"
117dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        "                                   localabstract:<unix domain socket name>\n"
118dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        "                                   localreserved:<unix domain socket name>\n"
119dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        "                                   localfilesystem:<unix domain socket name>\n"
120dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        "                                   dev:<character device name>\n"
121dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        "                                   jdwp:<process pid> (remote only)\n"
122dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        "  adb jdwp                     - list PIDs of processes hosting a JDWP transport\n"
1230ef3fd048aeaeb59467e43e543f66b96e4e6c7f5Mike Lockwood        "  adb install [-l] [-r] [-s] <file> - push this package file to the device and install it\n"
124dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        "                                 ('-l' means forward-lock the app)\n"
125dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        "                                 ('-r' means reinstall the app, keeping its data)\n"
1260ef3fd048aeaeb59467e43e543f66b96e4e6c7f5Mike Lockwood        "                                 ('-s' means install on SD card instead of internal storage)\n"
127dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        "  adb uninstall [-k] <package> - remove this app package from the device\n"
128dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        "                                 ('-k' means keep the data and cache directories)\n"
129dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        "  adb bugreport                - return all information from the device\n"
130dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        "                                 that should be included in a bug report.\n"
131dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        "\n"
132d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate        "  adb backup [-f <file>] [-apk|-noapk] [-shared|-noshared] [-all] [<packages...>]\n"
133d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate        "                               - Write a tarfile backup of the device's data to <file>.\n"
134d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate        "                                 The -f option must come first; if not specified then the data\n"
135d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate        "                                 is written to \"backup.tar\" in the current directory.\n"
136d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate        "                                 (-apk|-noapk enable/disable backup of the .apks themselves\n"
137d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate        "                                    in the tarfile; the default is noapk.)\n"
138d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate        "                                 (-shared|-noshared enable/disable backup of the device's\n"
139d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate        "                                    shared storage / SD card contents; the default is noshared.)\n"
140d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate        "                                 (-all means to back up all installed applications)\n"
141d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate        "                                 (<packages...> is the list of applications to be backed up.  If\n"
142d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate        "                                    the -all or -shared flags are passed, then the package\n"
143d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate        "                                    list is optional.)\n"
144d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate        "\n"
145dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        "  adb help                     - show this help message\n"
146dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        "  adb version                  - show version num\n"
147dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        "\n"
148dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        "scripting:\n"
149dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        "  adb wait-for-device          - block until device is online\n"
150dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        "  adb start-server             - ensure that there is a server running\n"
151dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        "  adb kill-server              - kill the server if it is running\n"
152dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        "  adb get-state                - prints: offline | bootloader | device\n"
153dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        "  adb get-serialno             - prints: <serial-number>\n"
154dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        "  adb status-window            - continuously print device status for a specified device\n"
155dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        "  adb remount                  - remounts the /system partition on the device read-write\n"
156ee15662140632672a6878787a1ff26f5ebdc1e68Mike Lockwood        "  adb reboot [bootloader|recovery] - reboots the device, optionally into the bootloader or recovery program\n"
157311add489e4a1712d201c3b83fa364d5569e6788Romain Guy        "  adb reboot-bootloader        - reboots the device into the bootloader\n"
158ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood        "  adb root                     - restarts the adbd daemon with root permissions\n"
159311add489e4a1712d201c3b83fa364d5569e6788Romain Guy        "  adb usb                      - restarts the adbd daemon listening on USB\n"
160ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood        "  adb tcpip <port>             - restarts the adbd daemon listening on TCP on the specified port"
161dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        "\n"
162dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        "networking:\n"
163dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        "  adb ppp <tty> [parameters]   - Run PPP over USB.\n"
164c989199ccfbe745a7109f57d2aee2577d2f72b8dKenny Root        " Note: you should not automatically start a PPP connection.\n"
165dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        " <tty> refers to the tty for PPP stream. Eg. dev:/dev/omap_csmi_tty1\n"
166dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        " [parameters] - Eg. defaultroute debug dump local notty usepeerdns\n"
167dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        "\n"
168dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        "adb sync notes: adb sync [ <directory> ]\n"
169dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        "  <localdir> can be interpreted in several ways:\n"
170dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        "\n"
171dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        "  - If <directory> is not specified, both /system and /data partitions will be updated.\n"
172dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        "\n"
173dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        "  - If it is \"system\" or \"data\", only the corresponding partition\n"
174dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        "    is updated.\n"
175cd64315f72537359537c66eebe482495ffefba57Tim        "\n"
176cd64315f72537359537c66eebe482495ffefba57Tim        "environmental variables:\n"
177cd64315f72537359537c66eebe482495ffefba57Tim        "  ADB_TRACE                    - Print debug information. A comma separated list of the following values\n"
178cd64315f72537359537c66eebe482495ffefba57Tim        "                                 1 or all, adb, sockets, packets, rwx, usb, sync, sysdeps, transport, jdwp\n"
179cd64315f72537359537c66eebe482495ffefba57Tim        "  ANDROID_SERIAL               - The serial number to connect to. -s takes priority over this if given.\n"
180cd64315f72537359537c66eebe482495ffefba57Tim        "  ANDROID_LOG_TAGS             - When used with the logcat option, only these debug tags are printed.\n"
181dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        );
182dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
183dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
184dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint usage()
185dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
186dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    help();
187dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return 1;
188dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
189dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
190dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef HAVE_TERMIO_H
191dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic struct termios tio_save;
192dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
193dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void stdin_raw_init(int fd)
194dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
195dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    struct termios tio;
196dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
197dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if(tcgetattr(fd, &tio)) return;
198dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if(tcgetattr(fd, &tio_save)) return;
199dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
200dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    tio.c_lflag = 0; /* disable CANON, ECHO*, etc */
201dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
202dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        /* no timeout but request at least one character per read */
203dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    tio.c_cc[VTIME] = 0;
204dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    tio.c_cc[VMIN] = 1;
205dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
206dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    tcsetattr(fd, TCSANOW, &tio);
207dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    tcflush(fd, TCIFLUSH);
208dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
209dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
210dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void stdin_raw_restore(int fd)
211dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
212dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    tcsetattr(fd, TCSANOW, &tio_save);
213dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    tcflush(fd, TCIFLUSH);
214dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
215dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif
216dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
217dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void read_and_dump(int fd)
218dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
219dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    char buf[4096];
220dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int len;
221dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
222dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    while(fd >= 0) {
223408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall        D("read_and_dump(): pre adb_read(fd=%d)\n", fd);
224dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        len = adb_read(fd, buf, 4096);
225408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall        D("read_and_dump(): post adb_read(fd=%d): len=%d\n", fd, len);
226dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if(len == 0) {
227dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            break;
228dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
229dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
230dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if(len < 0) {
231dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            if(errno == EINTR) continue;
232dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            break;
233dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
234dd6b36e334809e7a99f0bce45353cdd7e4dac4e1Mike Lockwood        fwrite(buf, 1, len, stdout);
235dd6b36e334809e7a99f0bce45353cdd7e4dac4e1Mike Lockwood        fflush(stdout);
236dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
237dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
238dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
239d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tatestatic void copy_to_file(int inFd, int outFd) {
240d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate    char buf[4096];
241d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate    int len;
242d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate
243d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate    D("copy_to_file(%d -> %d)\n", inFd, outFd);
244d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate    for (;;) {
245d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate        len = adb_read(inFd, buf, sizeof(buf));
246d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate        if (len == 0) {
247d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate            break;
248d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate        }
249d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate        if (len < 0) {
250d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate            if (errno == EINTR) continue;
251d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate            D("copy_to_file() : error %d\n", errno);
252d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate            break;
253d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate        }
254d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate        adb_write(outFd, buf, len);
255d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate    }
256d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate}
257d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate
258dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void *stdin_read_thread(void *x)
259dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
260dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int fd, fdi;
261dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    unsigned char buf[1024];
262dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int r, n;
263dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int state = 0;
264dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
265dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int *fds = (int*) x;
266dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    fd = fds[0];
267dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    fdi = fds[1];
268dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    free(fds);
269dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
270dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    for(;;) {
271dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        /* fdi is really the client's stdin, so use read, not adb_read here */
272408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall        D("stdin_read_thread(): pre unix_read(fdi=%d,...)\n", fdi);
273dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        r = unix_read(fdi, buf, 1024);
274408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall        D("stdin_read_thread(): post unix_read(fdi=%d,...)\n", fdi);
275dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if(r == 0) break;
276dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if(r < 0) {
277dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            if(errno == EINTR) continue;
278dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            break;
279dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
28067d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood        for(n = 0; n < r; n++){
28167d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood            switch(buf[n]) {
28267d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood            case '\n':
28367d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood                state = 1;
28467d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood                break;
28567d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood            case '\r':
28667d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood                state = 1;
28767d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood                break;
28867d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood            case '~':
28967d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood                if(state == 1) state++;
29067d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood                break;
29167d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood            case '.':
29267d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood                if(state == 2) {
29367d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood                    fprintf(stderr,"\n* disconnect *\n");
29467d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood#ifdef HAVE_TERMIO_H
29567d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood                    stdin_raw_restore(fdi);
296dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif
29767d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood                    exit(0);
298dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                }
29967d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood            default:
30067d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood                state = 0;
301dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            }
302dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
303dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        r = adb_write(fd, buf, r);
304dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if(r <= 0) {
305dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            break;
306dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
307dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
308dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return 0;
309dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
310dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
311dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint interactive_shell(void)
312dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
313dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    adb_thread_t thr;
314dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int fdi, fd;
315dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int *fds;
316dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
317dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    fd = adb_connect("shell:");
318dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if(fd < 0) {
319dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        fprintf(stderr,"error: %s\n", adb_error());
320dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return 1;
321dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
322dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    fdi = 0; //dup(0);
323dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
324dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    fds = malloc(sizeof(int) * 2);
325dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    fds[0] = fd;
326dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    fds[1] = fdi;
327dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
328dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef HAVE_TERMIO_H
329dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    stdin_raw_init(fdi);
330dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif
331dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    adb_thread_create(&thr, stdin_read_thread, fds);
332dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    read_and_dump(fd);
333dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef HAVE_TERMIO_H
334dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    stdin_raw_restore(fdi);
335dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif
336dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return 0;
337dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
338dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
339dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
340dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void format_host_command(char* buffer, size_t  buflen, const char* command, transport_type ttype, const char* serial)
341dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
342dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (serial) {
343dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        snprintf(buffer, buflen, "host-serial:%s:%s", serial, command);
344dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    } else {
345dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        const char* prefix = "host";
346dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if (ttype == kTransportUsb)
347dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            prefix = "host-usb";
348dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        else if (ttype == kTransportLocal)
349dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            prefix = "host-local";
350dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
351dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        snprintf(buffer, buflen, "%s:%s", prefix, command);
352dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
353dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
354dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
355dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void status_window(transport_type ttype, const char* serial)
356dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
357dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    char command[4096];
358dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    char *state = 0;
359dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    char *laststate = 0;
360dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
361dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        /* silence stderr */
362dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef _WIN32
363dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    /* XXX: TODO */
364dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#else
365dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int  fd;
366dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    fd = unix_open("/dev/null", O_WRONLY);
367dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    dup2(fd, 2);
368dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    adb_close(fd);
369dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif
370dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
371dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    format_host_command(command, sizeof command, "get-state", ttype, serial);
372dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
373dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    for(;;) {
374dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        adb_sleep_ms(250);
375dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
376dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if(state) {
377dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            free(state);
378dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            state = 0;
379dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
380dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
381dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        state = adb_query(command);
382dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
383dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if(state) {
384dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            if(laststate && !strcmp(state,laststate)){
385dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                continue;
386dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            } else {
387dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                if(laststate) free(laststate);
388dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                laststate = strdup(state);
389dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            }
390dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
391dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
392dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        printf("%c[2J%c[2H", 27, 27);
393dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        printf("Android Debug Bridge\n");
394dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        printf("State: %s\n", state ? state : "offline");
395dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        fflush(stdout);
396dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
397dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
398dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
399dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/** duplicate string and quote all \ " ( ) chars + space character. */
400dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic char *
401dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectdupAndQuote(const char *s)
402dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
403dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    const char *ts;
404dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    size_t alloc_len;
405dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    char *ret;
406dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    char *dest;
407dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
408dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    ts = s;
409dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
410dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    alloc_len = 0;
411dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
412dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    for( ;*ts != '\0'; ts++) {
413dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        alloc_len++;
414dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if (*ts == ' ' || *ts == '"' || *ts == '\\' || *ts == '(' || *ts == ')') {
415dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            alloc_len++;
416dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
417dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
418dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
419dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    ret = (char *)malloc(alloc_len + 1);
420dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
421dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    ts = s;
422dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    dest = ret;
423dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
424dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    for ( ;*ts != '\0'; ts++) {
425dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if (*ts == ' ' || *ts == '"' || *ts == '\\' || *ts == '(' || *ts == ')') {
426dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            *dest++ = '\\';
427dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
428dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
429dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        *dest++ = *ts;
430dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
431dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
432dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    *dest++ = '\0';
433dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
434dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return ret;
435dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
436dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
437dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/**
438dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Run ppp in "notty" mode against a resource listed as the first parameter
439dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * eg:
440dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *
441dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * ppp dev:/dev/omap_csmi_tty0 <ppp options>
442dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *
443dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */
444dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint ppp(int argc, char **argv)
445dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
446dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef HAVE_WIN32_PROC
447dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    fprintf(stderr, "error: adb %s not implemented on Win32\n", argv[0]);
448dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return -1;
449dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#else
450dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    char *adb_service_name;
451dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    pid_t pid;
452dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int fd;
453dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
454dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (argc < 2) {
455dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        fprintf(stderr, "usage: adb %s <adb service name> [ppp opts]\n",
456dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                argv[0]);
457dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
458dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return 1;
459dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
460dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
461dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    adb_service_name = argv[1];
462dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
463dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    fd = adb_connect(adb_service_name);
464dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
465dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if(fd < 0) {
466dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        fprintf(stderr,"Error: Could not open adb service: %s. Error: %s\n",
467dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                adb_service_name, adb_error());
468dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return 1;
469dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
470dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
471dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    pid = fork();
472dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
473dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (pid < 0) {
474dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        perror("from fork()");
475dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return 1;
476dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    } else if (pid == 0) {
477dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        int err;
478dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        int i;
479dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        const char **ppp_args;
480dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
481dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        // copy args
482dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        ppp_args = (const char **) alloca(sizeof(char *) * argc + 1);
483dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        ppp_args[0] = "pppd";
484dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        for (i = 2 ; i < argc ; i++) {
485dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            //argv[2] and beyond become ppp_args[1] and beyond
486dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            ppp_args[i - 1] = argv[i];
487dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
488dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        ppp_args[i-1] = NULL;
489dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
490dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        // child side
491dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
492dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        dup2(fd, STDIN_FILENO);
493dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        dup2(fd, STDOUT_FILENO);
494dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        adb_close(STDERR_FILENO);
495dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        adb_close(fd);
496dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
497dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        err = execvp("pppd", (char * const *)ppp_args);
498dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
499dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if (err < 0) {
500dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            perror("execing pppd");
501dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
502dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        exit(-1);
503dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    } else {
504dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        // parent side
505dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
506dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        adb_close(fd);
507dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return 0;
508dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
509dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif /* !HAVE_WIN32_PROC */
510dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
511dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
512dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int send_shellcommand(transport_type transport, char* serial, char* buf)
513dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
514dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int fd, ret;
515dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
516dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    for(;;) {
517dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        fd = adb_connect(buf);
518dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if(fd >= 0)
519dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            break;
520dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        fprintf(stderr,"- waiting for device -\n");
521dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        adb_sleep_ms(1000);
522dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        do_cmd(transport, serial, "wait-for-device", 0);
523dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
524dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
525dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    read_and_dump(fd);
526dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    ret = adb_close(fd);
527dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (ret)
528dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        perror("close");
529dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
530dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return ret;
531dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
532dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
533dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int logcat(transport_type transport, char* serial, int argc, char **argv)
534dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
535dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    char buf[4096];
536dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
537dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    char *log_tags;
538dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    char *quoted_log_tags;
539dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
540dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    log_tags = getenv("ANDROID_LOG_TAGS");
541dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    quoted_log_tags = dupAndQuote(log_tags == NULL ? "" : log_tags);
542dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
543dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    snprintf(buf, sizeof(buf),
544dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        "shell:export ANDROID_LOG_TAGS=\"\%s\" ; exec logcat",
545dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        quoted_log_tags);
546dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
547dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    free(quoted_log_tags);
548dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
549dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    argc -= 1;
550dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    argv += 1;
551dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    while(argc-- > 0) {
552dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        char *quoted;
553dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
554dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        quoted = dupAndQuote (*argv++);
555dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
556dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        strncat(buf, " ", sizeof(buf)-1);
557dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        strncat(buf, quoted, sizeof(buf)-1);
558dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        free(quoted);
559dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
560dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
561dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    send_shellcommand(transport, serial, buf);
562dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return 0;
563dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
564dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
565d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tatestatic int backup(int argc, char** argv) {
566d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate    char buf[4096];
567d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate    const char* filename = "./backup.tar";
568d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate    int fd, outFd;
569d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate
570d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate    if (!strcmp("-f", argv[1])) {
571d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate        if (argc < 3) return usage();
572d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate        filename = argv[2];
573d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate        argc -= 2;
574d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate        argv += 2;
575d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate    }
576d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate
577d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate    outFd = adb_open_mode(filename, O_WRONLY | O_CREAT | O_TRUNC, 0640);
578d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate    if (outFd < 0) {
579d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate        fprintf(stderr, "adb: unable to open file %s\n", filename);
580d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate        return -1;
581d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate    }
582d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate
583d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate    snprintf(buf, sizeof(buf), "backup");
584d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate    for (argc--, argv++; argc; argc--, argv++) {
585d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate        strncat(buf, ":", sizeof(buf) - strlen(buf) - 1);
586d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate        strncat(buf, argv[0], sizeof(buf) - strlen(buf) - 1);
587d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate    }
588d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate
589d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate    D("backup. filename=%s buf=%s\n", filename, buf);
590d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate    fd = adb_connect(buf);
591d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate    if (fd < 0) {
592d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate        fprintf(stderr, "adb: unable to connect for backup\n");
593d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate        adb_close(outFd);
594d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate        return -1;
595d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate    }
596d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate
597d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate    copy_to_file(fd, outFd);
598d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate
599d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate    adb_close(fd);
600d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate    adb_close(outFd);
601d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate    return 0;
602d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate}
603d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate
604dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define SENTINEL_FILE "config" OS_PATH_SEPARATOR_STR "envsetup.make"
605dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int top_works(const char *top)
606dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
607dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (top != NULL && adb_is_absolute_host_path(top)) {
608dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        char path_buf[PATH_MAX];
609dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        snprintf(path_buf, sizeof(path_buf),
610dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                "%s" OS_PATH_SEPARATOR_STR SENTINEL_FILE, top);
611dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return access(path_buf, F_OK) == 0;
612dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
613dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return 0;
614dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
615dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
616dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic char *find_top_from(const char *indir, char path_buf[PATH_MAX])
617dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
618dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    strcpy(path_buf, indir);
619dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    while (1) {
620dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if (top_works(path_buf)) {
621dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            return path_buf;
622dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
623dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        char *s = adb_dirstop(path_buf);
624dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if (s != NULL) {
625dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            *s = '\0';
626dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        } else {
627dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            path_buf[0] = '\0';
628dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            return NULL;
629dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
630dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
631dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
632dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
633dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic char *find_top(char path_buf[PATH_MAX])
634dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
635dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    char *top = getenv("ANDROID_BUILD_TOP");
636dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (top != NULL && top[0] != '\0') {
637dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if (!top_works(top)) {
638dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            fprintf(stderr, "adb: bad ANDROID_BUILD_TOP value \"%s\"\n", top);
639dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            return NULL;
640dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
641dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    } else {
642dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        top = getenv("TOP");
643dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if (top != NULL && top[0] != '\0') {
644dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            if (!top_works(top)) {
645dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                fprintf(stderr, "adb: bad TOP value \"%s\"\n", top);
646dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                return NULL;
647dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            }
648dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        } else {
649dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            top = NULL;
650dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
651dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
652dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
653dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (top != NULL) {
654dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        /* The environment pointed to a top directory that works.
655dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project         */
656dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        strcpy(path_buf, top);
657dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return path_buf;
658dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
659dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
660dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    /* The environment didn't help.  Walk up the tree from the CWD
661dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project     * to see if we can find the top.
662dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project     */
663dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    char dir[PATH_MAX];
664dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    top = find_top_from(getcwd(dir, sizeof(dir)), path_buf);
665dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (top == NULL) {
666dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        /* If the CWD isn't under a good-looking top, see if the
667dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project         * executable is.
668dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project         */
6693166410a82f43d39201be98a8d35c51baa86cb53Alexey Tarasov        get_my_path(dir, PATH_MAX);
670dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        top = find_top_from(dir, path_buf);
671dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
672dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return top;
673dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
674dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
675dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* <hint> may be:
676dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * - A simple product name
677dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *   e.g., "sooner"
678dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectTODO: debug?  sooner-debug, sooner:debug?
679dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * - A relative path from the CWD to the ANDROID_PRODUCT_OUT dir
680dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *   e.g., "out/target/product/sooner"
681dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * - An absolute path to the PRODUCT_OUT dir
682dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *   e.g., "/src/device/out/target/product/sooner"
683dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *
684dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Given <hint>, try to construct an absolute path to the
685dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * ANDROID_PRODUCT_OUT dir.
686dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */
687dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic const char *find_product_out_path(const char *hint)
688dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
689dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    static char path_buf[PATH_MAX];
690dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
691dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (hint == NULL || hint[0] == '\0') {
692dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return NULL;
693dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
694dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
695dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    /* If it's already absolute, don't bother doing any work.
696dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project     */
697dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (adb_is_absolute_host_path(hint)) {
698dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        strcpy(path_buf, hint);
699dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return path_buf;
700dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
701dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
702dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    /* If there are any slashes in it, assume it's a relative path;
703dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project     * make it absolute.
704dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project     */
705dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (adb_dirstart(hint) != NULL) {
706dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if (getcwd(path_buf, sizeof(path_buf)) == NULL) {
707dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            fprintf(stderr, "adb: Couldn't get CWD: %s\n", strerror(errno));
708dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            return NULL;
709dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
710dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if (strlen(path_buf) + 1 + strlen(hint) >= sizeof(path_buf)) {
711dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            fprintf(stderr, "adb: Couldn't assemble path\n");
712dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            return NULL;
713dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
714dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        strcat(path_buf, OS_PATH_SEPARATOR_STR);
715dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        strcat(path_buf, hint);
716dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return path_buf;
717dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
718dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
719dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    /* It's a string without any slashes.  Try to do something with it.
720dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project     *
721dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project     * Try to find the root of the build tree, and build a PRODUCT_OUT
722dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project     * path from there.
723dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project     */
724dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    char top_buf[PATH_MAX];
725dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    const char *top = find_top(top_buf);
726dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (top == NULL) {
727dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        fprintf(stderr, "adb: Couldn't find top of build tree\n");
728dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return NULL;
729dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
730dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project//TODO: if we have a way to indicate debug, look in out/debug/target/...
731dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    snprintf(path_buf, sizeof(path_buf),
732dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            "%s" OS_PATH_SEPARATOR_STR
733dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            "out" OS_PATH_SEPARATOR_STR
734dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            "target" OS_PATH_SEPARATOR_STR
735dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            "product" OS_PATH_SEPARATOR_STR
736dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            "%s", top_buf, hint);
737dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (access(path_buf, F_OK) < 0) {
738dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        fprintf(stderr, "adb: Couldn't find a product dir "
739dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                "based on \"-p %s\"; \"%s\" doesn't exist\n", hint, path_buf);
740dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return NULL;
741dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
742dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return path_buf;
743dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
744dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
745dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint adb_commandline(int argc, char **argv)
746dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
747dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    char buf[4096];
748dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int no_daemon = 0;
749dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int is_daemon = 0;
750305b4b0f6069d733d3023a57fdc8a6d9cf7de2a6David 'Digit' Turner    int is_server = 0;
751dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int persist = 0;
752dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int r;
753dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int quote;
754dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    transport_type ttype = kTransportAny;
755dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    char* serial = NULL;
756a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger    char* server_port_str = NULL;
757dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
758dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        /* If defined, this should be an absolute path to
759dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project         * the directory containing all of the various system images
760dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project         * for a particular product.  If not defined, and the adb
761dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project         * command requires this information, then the user must
762dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project         * specify the path using "-p".
763dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project         */
764dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    gProductOutPath = getenv("ANDROID_PRODUCT_OUT");
765dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (gProductOutPath == NULL || gProductOutPath[0] == '\0') {
766dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        gProductOutPath = NULL;
767dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
768dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    // TODO: also try TARGET_PRODUCT/TARGET_DEVICE as a hint
769dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
770db4492640313be9d3fd65ee5bd7648a9570411bbNick Pelly    serial = getenv("ANDROID_SERIAL");
771db4492640313be9d3fd65ee5bd7648a9570411bbNick Pelly
772a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger    /* Validate and assign the server port */
773a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger    server_port_str = getenv("ANDROID_ADB_SERVER_PORT");
774a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger    int server_port = DEFAULT_ADB_PORT;
775a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger    if (server_port_str && strlen(server_port_str) > 0) {
776a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger        server_port = (int) strtol(server_port_str, NULL, 0);
777a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger        if (server_port <= 0) {
778a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger            fprintf(stderr,
779a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger                    "adb: Env var ANDROID_ADB_SERVER_PORT must be a positive number. Got \"%s\"\n",
780a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger                    server_port_str);
781a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger            return usage();
782a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger        }
783a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger    }
784a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger
785a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger    /* modifiers and flags */
786dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    while(argc > 0) {
787305b4b0f6069d733d3023a57fdc8a6d9cf7de2a6David 'Digit' Turner        if(!strcmp(argv[0],"server")) {
788305b4b0f6069d733d3023a57fdc8a6d9cf7de2a6David 'Digit' Turner            is_server = 1;
789305b4b0f6069d733d3023a57fdc8a6d9cf7de2a6David 'Digit' Turner        } else if(!strcmp(argv[0],"nodaemon")) {
790dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            no_daemon = 1;
791dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        } else if (!strcmp(argv[0], "fork-server")) {
792dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            /* this is a special flag used only when the ADB client launches the ADB Server */
793dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            is_daemon = 1;
794dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        } else if(!strcmp(argv[0],"persist")) {
795dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            persist = 1;
796dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        } else if(!strncmp(argv[0], "-p", 2)) {
797dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            const char *product = NULL;
798dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            if (argv[0][2] == '\0') {
799dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                if (argc < 2) return usage();
800dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                product = argv[1];
801dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                argc--;
802dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                argv++;
803dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            } else {
804dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                product = argv[1] + 2;
805dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            }
806dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            gProductOutPath = find_product_out_path(product);
807dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            if (gProductOutPath == NULL) {
808dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                fprintf(stderr, "adb: could not resolve \"-p %s\"\n",
809dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                        product);
810dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                return usage();
811dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            }
812dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        } else if (argv[0][0]=='-' && argv[0][1]=='s') {
813dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            if (isdigit(argv[0][2])) {
814dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                serial = argv[0] + 2;
815dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            } else {
816a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger                if(argc < 2 || argv[0][2] != '\0') return usage();
817dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                serial = argv[1];
818dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                argc--;
819dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                argv++;
820dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            }
821dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        } else if (!strcmp(argv[0],"-d")) {
822dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            ttype = kTransportUsb;
823dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        } else if (!strcmp(argv[0],"-e")) {
824dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            ttype = kTransportLocal;
825dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        } else {
826dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                /* out of recognized modifiers and flags */
827dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            break;
828dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
829dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        argc--;
830dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        argv++;
831dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
832dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
833dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    adb_set_transport(ttype, serial);
834a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger    adb_set_tcp_specifics(server_port);
835dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
836305b4b0f6069d733d3023a57fdc8a6d9cf7de2a6David 'Digit' Turner    if (is_server) {
837dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if (no_daemon || is_daemon) {
838a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger            r = adb_main(is_daemon, server_port);
839dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        } else {
840a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger            r = launch_server(server_port);
841dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
842dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if(r) {
843dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            fprintf(stderr,"* could not start server *\n");
844dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
845dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return r;
846dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
847dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
848dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttop:
849dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if(argc == 0) {
850dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return usage();
851dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
852dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
853dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    /* adb_connect() commands */
854dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
855dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if(!strcmp(argv[0], "devices")) {
856dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        char *tmp;
857dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        snprintf(buf, sizeof buf, "host:%s", argv[0]);
858dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        tmp = adb_query(buf);
859dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if(tmp) {
860dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            printf("List of devices attached \n");
861dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            printf("%s\n", tmp);
862dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            return 0;
863dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        } else {
864dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            return 1;
865dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
866dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
867dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
868cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood    if(!strcmp(argv[0], "connect")) {
869ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood        char *tmp;
870ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood        if (argc != 2) {
871cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood            fprintf(stderr, "Usage: adb connect <host>[:<port>]\n");
872ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood            return 1;
873ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood        }
874cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood        snprintf(buf, sizeof buf, "host:connect:%s", argv[1]);
875cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood        tmp = adb_query(buf);
876cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood        if(tmp) {
877cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood            printf("%s\n", tmp);
878cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood            return 0;
879cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood        } else {
880cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood            return 1;
881cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood        }
882cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood    }
883cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood
884cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood    if(!strcmp(argv[0], "disconnect")) {
885cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood        char *tmp;
886cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood        if (argc > 2) {
887cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood            fprintf(stderr, "Usage: adb disconnect [<host>[:<port>]]\n");
888cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood            return 1;
889cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood        }
890cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood        if (argc == 2) {
891cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood            snprintf(buf, sizeof buf, "host:disconnect:%s", argv[1]);
892cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood        } else {
893cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood            snprintf(buf, sizeof buf, "host:disconnect:");
894cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood        }
895ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood        tmp = adb_query(buf);
896ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood        if(tmp) {
897ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood            printf("%s\n", tmp);
898ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood            return 0;
899ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood        } else {
900ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood            return 1;
901ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood        }
902ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood    }
903ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood
904dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (!strcmp(argv[0], "emu")) {
905dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return adb_send_emulator_command(argc, argv);
906dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
907dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
908ff91ab855b84cdcf110f1a899320d3920e7c55a5Daniel Sandler    if(!strcmp(argv[0], "shell") || !strcmp(argv[0], "hell")) {
909dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        int r;
910dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        int fd;
911dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
912ff91ab855b84cdcf110f1a899320d3920e7c55a5Daniel Sandler        char h = (argv[0][0] == 'h');
913ff91ab855b84cdcf110f1a899320d3920e7c55a5Daniel Sandler
914ff91ab855b84cdcf110f1a899320d3920e7c55a5Daniel Sandler        if (h) {
915ff91ab855b84cdcf110f1a899320d3920e7c55a5Daniel Sandler            printf("\x1b[41;33m");
916ff91ab855b84cdcf110f1a899320d3920e7c55a5Daniel Sandler            fflush(stdout);
917ff91ab855b84cdcf110f1a899320d3920e7c55a5Daniel Sandler        }
918ff91ab855b84cdcf110f1a899320d3920e7c55a5Daniel Sandler
919dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if(argc < 2) {
920408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall            D("starting interactive shell\n");
921ff91ab855b84cdcf110f1a899320d3920e7c55a5Daniel Sandler            r = interactive_shell();
922ff91ab855b84cdcf110f1a899320d3920e7c55a5Daniel Sandler            if (h) {
923ff91ab855b84cdcf110f1a899320d3920e7c55a5Daniel Sandler                printf("\x1b[0m");
924ff91ab855b84cdcf110f1a899320d3920e7c55a5Daniel Sandler                fflush(stdout);
925ff91ab855b84cdcf110f1a899320d3920e7c55a5Daniel Sandler            }
926ff91ab855b84cdcf110f1a899320d3920e7c55a5Daniel Sandler            return r;
927dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
928dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
929dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        snprintf(buf, sizeof buf, "shell:%s", argv[1]);
930dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        argc -= 2;
931dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        argv += 2;
932dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        while(argc-- > 0) {
933dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            strcat(buf, " ");
934dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
935dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            /* quote empty strings and strings with spaces */
936dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            quote = (**argv == 0 || strchr(*argv, ' '));
937dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            if (quote)
938a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger                strcat(buf, "\"");
939dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            strcat(buf, *argv++);
940dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            if (quote)
941a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger                strcat(buf, "\"");
942dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
943dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
944dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        for(;;) {
945408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall            D("interactive shell loop. buff=%s\n", buf);
946dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            fd = adb_connect(buf);
947dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            if(fd >= 0) {
948408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall                D("about to read_and_dump(fd=%d)\n", fd);
949dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                read_and_dump(fd);
950408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall                D("read_and_dump() done.\n");
951dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                adb_close(fd);
952dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                r = 0;
953dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            } else {
954dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                fprintf(stderr,"error: %s\n", adb_error());
955dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                r = -1;
956dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            }
957dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
958dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            if(persist) {
959dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                fprintf(stderr,"\n- waiting for device -\n");
960dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                adb_sleep_ms(1000);
961dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                do_cmd(ttype, serial, "wait-for-device", 0);
962dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            } else {
963ff91ab855b84cdcf110f1a899320d3920e7c55a5Daniel Sandler                if (h) {
964ff91ab855b84cdcf110f1a899320d3920e7c55a5Daniel Sandler                    printf("\x1b[0m");
965ff91ab855b84cdcf110f1a899320d3920e7c55a5Daniel Sandler                    fflush(stdout);
966ff91ab855b84cdcf110f1a899320d3920e7c55a5Daniel Sandler                }
967408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall                D("interactive shell loop. return r=%d\n", r);
968dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                return r;
969dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            }
970dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
971dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
972dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
973dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if(!strcmp(argv[0], "kill-server")) {
974dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        int fd;
975dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        fd = _adb_connect("host:kill");
976dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if(fd == -1) {
977dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            fprintf(stderr,"* server not running *\n");
978dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            return 1;
979dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
980dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return 0;
981dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
982dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
983ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood    if(!strcmp(argv[0], "remount") || !strcmp(argv[0], "reboot")
984311add489e4a1712d201c3b83fa364d5569e6788Romain Guy            || !strcmp(argv[0], "reboot-bootloader")
985ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood            || !strcmp(argv[0], "tcpip") || !strcmp(argv[0], "usb")
986f56d1b5a76c6cb282a7689fc93f85de63bd205f6Mike Lockwood            || !strcmp(argv[0], "root")) {
987ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood        char command[100];
988311add489e4a1712d201c3b83fa364d5569e6788Romain Guy        if (!strcmp(argv[0], "reboot-bootloader"))
989311add489e4a1712d201c3b83fa364d5569e6788Romain Guy            snprintf(command, sizeof(command), "reboot:bootloader");
990311add489e4a1712d201c3b83fa364d5569e6788Romain Guy        else if (argc > 1)
991ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood            snprintf(command, sizeof(command), "%s:%s", argv[0], argv[1]);
992ee15662140632672a6878787a1ff26f5ebdc1e68Mike Lockwood        else
993ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood            snprintf(command, sizeof(command), "%s:", argv[0]);
994ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood        int fd = adb_connect(command);
995e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project        if(fd >= 0) {
996e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project            read_and_dump(fd);
997e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project            adb_close(fd);
998e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project            return 0;
999e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project        }
1000e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project        fprintf(stderr,"error: %s\n", adb_error());
1001e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project        return 1;
1002e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project    }
1003e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project
1004f56d1b5a76c6cb282a7689fc93f85de63bd205f6Mike Lockwood    if(!strcmp(argv[0], "bugreport")) {
1005c130ea7c29b0149939c8fd6b8da2c981944636f9Dan Egnor        if (argc != 1) return usage();
1006c130ea7c29b0149939c8fd6b8da2c981944636f9Dan Egnor        do_cmd(ttype, serial, "shell", "bugreport", 0);
1007f56d1b5a76c6cb282a7689fc93f85de63bd205f6Mike Lockwood        return 0;
1008f56d1b5a76c6cb282a7689fc93f85de63bd205f6Mike Lockwood    }
1009f56d1b5a76c6cb282a7689fc93f85de63bd205f6Mike Lockwood
1010dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    /* adb_command() wrapper commands */
1011dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
1012dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if(!strncmp(argv[0], "wait-for-", strlen("wait-for-"))) {
1013dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        char* service = argv[0];
1014dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if (!strncmp(service, "wait-for-device", strlen("wait-for-device"))) {
1015dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            if (ttype == kTransportUsb) {
1016dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                service = "wait-for-usb";
1017dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            } else if (ttype == kTransportLocal) {
1018dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                service = "wait-for-local";
1019dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            } else {
1020dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                service = "wait-for-any";
1021dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            }
1022dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
1023dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
1024dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        format_host_command(buf, sizeof buf, service, ttype, serial);
1025dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
1026dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if (adb_command(buf)) {
1027dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            D("failure: %s *\n",adb_error());
1028dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            fprintf(stderr,"error: %s\n", adb_error());
1029dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            return 1;
1030dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
1031dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
1032dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        /* Allow a command to be run after wait-for-device,
1033dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            * e.g. 'adb wait-for-device shell'.
1034dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            */
1035dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if(argc > 1) {
1036dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            argc--;
1037dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            argv++;
1038dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            goto top;
1039dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
1040dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return 0;
1041dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
1042dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
1043dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if(!strcmp(argv[0], "forward")) {
1044dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if(argc != 3) return usage();
1045dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if (serial) {
104664e99545d4b5600bb5ca044fcad636ae8389b381Mike Lockwood            snprintf(buf, sizeof buf, "host-serial:%s:forward:%s;%s",serial, argv[1], argv[2]);
104764e99545d4b5600bb5ca044fcad636ae8389b381Mike Lockwood        } else if (ttype == kTransportUsb) {
104864e99545d4b5600bb5ca044fcad636ae8389b381Mike Lockwood            snprintf(buf, sizeof buf, "host-usb:forward:%s;%s", argv[1], argv[2]);
104964e99545d4b5600bb5ca044fcad636ae8389b381Mike Lockwood        } else if (ttype == kTransportLocal) {
105064e99545d4b5600bb5ca044fcad636ae8389b381Mike Lockwood            snprintf(buf, sizeof buf, "host-local:forward:%s;%s", argv[1], argv[2]);
1051dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        } else {
105264e99545d4b5600bb5ca044fcad636ae8389b381Mike Lockwood            snprintf(buf, sizeof buf, "host:forward:%s;%s", argv[1], argv[2]);
1053dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
1054dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if(adb_command(buf)) {
1055dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            fprintf(stderr,"error: %s\n", adb_error());
1056dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            return 1;
1057dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
1058dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return 0;
1059dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
1060dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
1061dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    /* do_sync_*() commands */
1062dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
1063dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if(!strcmp(argv[0], "ls")) {
1064dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if(argc != 2) return usage();
1065dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return do_sync_ls(argv[1]);
1066dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
1067dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
1068dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if(!strcmp(argv[0], "push")) {
1069dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if(argc != 3) return usage();
1070dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return do_sync_push(argv[1], argv[2], 0 /* no verify APK */);
1071dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
1072dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
1073dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if(!strcmp(argv[0], "pull")) {
107400c0eeac6be1597ce24fccf8e2afaaffab223cb3Joe Onorato        if (argc == 2) {
107500c0eeac6be1597ce24fccf8e2afaaffab223cb3Joe Onorato            return do_sync_pull(argv[1], ".");
107600c0eeac6be1597ce24fccf8e2afaaffab223cb3Joe Onorato        } else if (argc == 3) {
107700c0eeac6be1597ce24fccf8e2afaaffab223cb3Joe Onorato            return do_sync_pull(argv[1], argv[2]);
107800c0eeac6be1597ce24fccf8e2afaaffab223cb3Joe Onorato        } else {
107900c0eeac6be1597ce24fccf8e2afaaffab223cb3Joe Onorato            return usage();
108000c0eeac6be1597ce24fccf8e2afaaffab223cb3Joe Onorato        }
1081dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
1082dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
1083dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if(!strcmp(argv[0], "install")) {
1084dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if (argc < 2) return usage();
1085dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return install_app(ttype, serial, argc, argv);
1086dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
1087dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
1088dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if(!strcmp(argv[0], "uninstall")) {
1089dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if (argc < 2) return usage();
1090dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return uninstall_app(ttype, serial, argc, argv);
1091dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
1092dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
1093dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if(!strcmp(argv[0], "sync")) {
1094dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        char *srcarg, *android_srcpath, *data_srcpath;
1095705c944c0e2a50150ffb41707b6b3daebb45cf79Anthony Newnam        int listonly = 0;
1096705c944c0e2a50150ffb41707b6b3daebb45cf79Anthony Newnam
1097dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        int ret;
1098dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if(argc < 2) {
1099dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            /* No local path was specified. */
1100dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            srcarg = NULL;
1101705c944c0e2a50150ffb41707b6b3daebb45cf79Anthony Newnam        } else if (argc >= 2 && strcmp(argv[1], "-l") == 0) {
1102705c944c0e2a50150ffb41707b6b3daebb45cf79Anthony Newnam            listonly = 1;
1103705c944c0e2a50150ffb41707b6b3daebb45cf79Anthony Newnam            if (argc == 3) {
1104705c944c0e2a50150ffb41707b6b3daebb45cf79Anthony Newnam                srcarg = argv[2];
1105705c944c0e2a50150ffb41707b6b3daebb45cf79Anthony Newnam            } else {
1106705c944c0e2a50150ffb41707b6b3daebb45cf79Anthony Newnam                srcarg = NULL;
1107705c944c0e2a50150ffb41707b6b3daebb45cf79Anthony Newnam            }
1108dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        } else if(argc == 2) {
1109dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            /* A local path or "android"/"data" arg was specified. */
1110dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            srcarg = argv[1];
1111dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        } else {
1112dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            return usage();
1113dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
1114dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        ret = find_sync_dirs(srcarg, &android_srcpath, &data_srcpath);
1115dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if(ret != 0) return usage();
1116dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
1117dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if(android_srcpath != NULL)
1118705c944c0e2a50150ffb41707b6b3daebb45cf79Anthony Newnam            ret = do_sync_sync(android_srcpath, "/system", listonly);
1119dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if(ret == 0 && data_srcpath != NULL)
1120705c944c0e2a50150ffb41707b6b3daebb45cf79Anthony Newnam            ret = do_sync_sync(data_srcpath, "/data", listonly);
1121dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
1122dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        free(android_srcpath);
1123dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        free(data_srcpath);
1124dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return ret;
1125dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
1126dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
1127dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    /* passthrough commands */
1128dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
1129dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if(!strcmp(argv[0],"get-state") ||
1130dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        !strcmp(argv[0],"get-serialno"))
1131dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    {
1132dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        char *tmp;
1133dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
1134dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        format_host_command(buf, sizeof buf, argv[0], ttype, serial);
1135dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        tmp = adb_query(buf);
1136dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if(tmp) {
1137dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            printf("%s\n", tmp);
1138dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            return 0;
1139dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        } else {
1140dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            return 1;
1141dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
1142dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
1143dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
1144dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    /* other commands */
1145dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
1146dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if(!strcmp(argv[0],"status-window")) {
1147dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        status_window(ttype, serial);
1148dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return 0;
1149dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
1150dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
1151dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if(!strcmp(argv[0],"logcat") || !strcmp(argv[0],"lolcat")) {
1152dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return logcat(ttype, serial, argc, argv);
1153dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
1154dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
1155dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if(!strcmp(argv[0],"ppp")) {
1156dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return ppp(argc, argv);
1157dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
1158dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
1159dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (!strcmp(argv[0], "start-server")) {
1160dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return adb_connect("host:start-server");
1161dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
1162dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
1163d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate    if (!strcmp(argv[0], "backup")) {
1164d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate        return backup(argc, argv);
1165d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate    }
1166d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate
1167dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (!strcmp(argv[0], "jdwp")) {
1168dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        int  fd = adb_connect("jdwp");
1169dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if (fd >= 0) {
1170dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            read_and_dump(fd);
1171dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            adb_close(fd);
1172dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            return 0;
1173dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        } else {
1174dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            fprintf(stderr, "error: %s\n", adb_error());
1175dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            return -1;
1176dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
1177dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
1178dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
1179dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    /* "adb /?" is a common idiom under Windows */
1180dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if(!strcmp(argv[0], "help") || !strcmp(argv[0], "/?")) {
1181dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        help();
1182dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return 0;
1183dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
1184dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
1185dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if(!strcmp(argv[0], "version")) {
1186dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        version(stdout);
1187dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return 0;
1188dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
1189dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
1190dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    usage();
1191dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return 1;
1192dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
1193dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
1194dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int do_cmd(transport_type ttype, char* serial, char *cmd, ...)
1195dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
1196dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    char *argv[16];
1197dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int argc;
1198dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    va_list ap;
1199dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
1200dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    va_start(ap, cmd);
1201dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    argc = 0;
1202dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
1203dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (serial) {
1204dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        argv[argc++] = "-s";
1205dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        argv[argc++] = serial;
1206dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    } else if (ttype == kTransportUsb) {
1207dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        argv[argc++] = "-d";
1208dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    } else if (ttype == kTransportLocal) {
1209dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        argv[argc++] = "-e";
1210dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
1211dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
1212dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    argv[argc++] = cmd;
1213dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    while((argv[argc] = va_arg(ap, char*)) != 0) argc++;
1214dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    va_end(ap);
1215dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
1216dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if 0
1217dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int n;
1218dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    fprintf(stderr,"argc = %d\n",argc);
1219dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    for(n = 0; n < argc; n++) {
1220dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        fprintf(stderr,"argv[%d] = \"%s\"\n", n, argv[n]);
1221dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
1222dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif
1223dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
1224dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return adb_commandline(argc, argv);
1225dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
1226dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
1227dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint find_sync_dirs(const char *srcarg,
1228dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        char **android_srcdir_out, char **data_srcdir_out)
1229dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
1230dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    char *android_srcdir, *data_srcdir;
1231dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
1232dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if(srcarg == NULL) {
1233dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        android_srcdir = product_file("system");
1234dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        data_srcdir = product_file("data");
1235dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    } else {
1236dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        /* srcarg may be "data", "system" or NULL.
1237dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project         * if srcarg is NULL, then both data and system are synced
1238dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project         */
1239dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if(strcmp(srcarg, "system") == 0) {
1240dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            android_srcdir = product_file("system");
1241dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            data_srcdir = NULL;
1242dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        } else if(strcmp(srcarg, "data") == 0) {
1243dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            android_srcdir = NULL;
1244dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            data_srcdir = product_file("data");
1245dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        } else {
1246dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            /* It's not "system" or "data".
1247dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project             */
1248dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            return 1;
1249dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
1250dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
1251dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
1252dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if(android_srcdir_out != NULL)
1253dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        *android_srcdir_out = android_srcdir;
1254dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    else
1255dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        free(android_srcdir);
1256dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
1257dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if(data_srcdir_out != NULL)
1258dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        *data_srcdir_out = data_srcdir;
1259dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    else
1260dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        free(data_srcdir);
1261dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
1262dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return 0;
1263dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
1264dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
1265dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int pm_command(transport_type transport, char* serial,
1266dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                      int argc, char** argv)
1267dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
1268dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    char buf[4096];
1269dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
1270dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    snprintf(buf, sizeof(buf), "shell:pm");
1271dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
1272dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    while(argc-- > 0) {
1273dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        char *quoted;
1274dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
1275dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        quoted = dupAndQuote(*argv++);
1276dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
1277dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        strncat(buf, " ", sizeof(buf)-1);
1278dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        strncat(buf, quoted, sizeof(buf)-1);
1279dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        free(quoted);
1280dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
1281dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
1282dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    send_shellcommand(transport, serial, buf);
1283dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return 0;
1284dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
1285dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
1286dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint uninstall_app(transport_type transport, char* serial, int argc, char** argv)
1287dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
1288dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    /* if the user choose the -k option, we refuse to do it until devices are
1289dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project       out with the option to uninstall the remaining data somehow (adb/ui) */
1290dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (argc == 3 && strcmp(argv[1], "-k") == 0)
1291dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    {
1292dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        printf(
1293dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            "The -k option uninstalls the application while retaining the data/cache.\n"
1294dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            "At the moment, there is no way to remove the remaining data.\n"
1295dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            "You will have to reinstall the application with the same signature, and fully uninstall it.\n"
1296dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            "If you truly wish to continue, execute 'adb shell pm uninstall -k %s'\n", argv[2]);
1297dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return -1;
1298dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
1299dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
1300dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    /* 'adb uninstall' takes the same arguments as 'pm uninstall' on device */
1301dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return pm_command(transport, serial, argc, argv);
1302dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
1303dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
1304dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int delete_file(transport_type transport, char* serial, char* filename)
1305dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
1306dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    char buf[4096];
1307dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    char* quoted;
1308dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
1309dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    snprintf(buf, sizeof(buf), "shell:rm ");
1310dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    quoted = dupAndQuote(filename);
1311dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    strncat(buf, quoted, sizeof(buf)-1);
1312dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    free(quoted);
1313dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
1314dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    send_shellcommand(transport, serial, buf);
1315dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return 0;
1316dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
1317dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
1318dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint install_app(transport_type transport, char* serial, int argc, char** argv)
1319dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
1320dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    struct stat st;
1321dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int err;
13220ef3fd048aeaeb59467e43e543f66b96e4e6c7f5Mike Lockwood    const char *const DATA_DEST = "/data/local/tmp/%s";
13230ef3fd048aeaeb59467e43e543f66b96e4e6c7f5Mike Lockwood    const char *const SD_DEST = "/sdcard/tmp/%s";
13240ef3fd048aeaeb59467e43e543f66b96e4e6c7f5Mike Lockwood    const char* where = DATA_DEST;
1325dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    char to[PATH_MAX];
1326dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    char* filename = argv[argc - 1];
1327dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    const char* p;
13280ef3fd048aeaeb59467e43e543f66b96e4e6c7f5Mike Lockwood    int i;
13290ef3fd048aeaeb59467e43e543f66b96e4e6c7f5Mike Lockwood
13300ef3fd048aeaeb59467e43e543f66b96e4e6c7f5Mike Lockwood    for (i = 0; i < argc; i++) {
13310ef3fd048aeaeb59467e43e543f66b96e4e6c7f5Mike Lockwood        if (!strcmp(argv[i], "-s"))
13320ef3fd048aeaeb59467e43e543f66b96e4e6c7f5Mike Lockwood            where = SD_DEST;
13330ef3fd048aeaeb59467e43e543f66b96e4e6c7f5Mike Lockwood    }
1334dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
1335dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    p = adb_dirstop(filename);
1336dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (p) {
1337dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        p++;
13380ef3fd048aeaeb59467e43e543f66b96e4e6c7f5Mike Lockwood        snprintf(to, sizeof to, where, p);
1339dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    } else {
13400ef3fd048aeaeb59467e43e543f66b96e4e6c7f5Mike Lockwood        snprintf(to, sizeof to, where, filename);
1341dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
1342dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (p[0] == '\0') {
1343dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
1344dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
1345dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    err = stat(filename, &st);
1346dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (err != 0) {
1347dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        fprintf(stderr, "can't find '%s' to install\n", filename);
1348dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return 1;
1349dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
1350dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (!S_ISREG(st.st_mode)) {
1351dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        fprintf(stderr, "can't install '%s' because it's not a file\n",
1352dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                filename);
1353dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return 1;
1354dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
1355dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
1356dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (!(err = do_sync_push(filename, to, 1 /* verify APK */))) {
1357dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        /* file in place; tell the Package Manager to install it */
1358dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        argv[argc - 1] = to;       /* destination name, not source location */
1359dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        pm_command(transport, serial, argc, argv);
1360dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        delete_file(transport, serial, to);
1361dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
1362dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
1363dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return err;
1364dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
1365