commandline.c revision bb86bc5892374f3a41784135bebc7ada3270c8c1
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" 1016715a4390f482815f51577d25d464537f7e7b823Bernhard Reutner-Fischer " Using this command 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" 133de034ec83e2d76db54d1936e706e80853146dcc7Christopher Tate " - Write an archive of the device's data to <file>.\n" 134c9cd3b976111d91ede6cd88bd06eb57b10b2f0e7Christopher Tate " If a -f option is not supplied then the data is\n" 135de034ec83e2d76db54d1936e706e80853146dcc7Christopher Tate " written to \"backup.ab\" in the current directory.\n" 136d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate " (-apk|-noapk enable/disable backup of the .apks themselves\n" 137de034ec83e2d76db54d1936e706e80853146dcc7Christopher Tate " in the archive; 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" 145de034ec83e2d76db54d1936e706e80853146dcc7Christopher Tate " adb restore <file> - restore device contents from the <file> backup archive\n" 146702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate "\n" 147dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " adb help - show this help message\n" 148dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " adb version - show version num\n" 149dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "\n" 150dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "scripting:\n" 151dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " adb wait-for-device - block until device is online\n" 152dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " adb start-server - ensure that there is a server running\n" 153dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " adb kill-server - kill the server if it is running\n" 154dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " adb get-state - prints: offline | bootloader | device\n" 155dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " adb get-serialno - prints: <serial-number>\n" 156dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " adb status-window - continuously print device status for a specified device\n" 157dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " adb remount - remounts the /system partition on the device read-write\n" 158ee15662140632672a6878787a1ff26f5ebdc1e68Mike Lockwood " adb reboot [bootloader|recovery] - reboots the device, optionally into the bootloader or recovery program\n" 159311add489e4a1712d201c3b83fa364d5569e6788Romain Guy " adb reboot-bootloader - reboots the device into the bootloader\n" 160ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood " adb root - restarts the adbd daemon with root permissions\n" 161311add489e4a1712d201c3b83fa364d5569e6788Romain Guy " adb usb - restarts the adbd daemon listening on USB\n" 162ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood " adb tcpip <port> - restarts the adbd daemon listening on TCP on the specified port" 163dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "\n" 164dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "networking:\n" 165dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " adb ppp <tty> [parameters] - Run PPP over USB.\n" 166c989199ccfbe745a7109f57d2aee2577d2f72b8dKenny Root " Note: you should not automatically start a PPP connection.\n" 167dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " <tty> refers to the tty for PPP stream. Eg. dev:/dev/omap_csmi_tty1\n" 168dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " [parameters] - Eg. defaultroute debug dump local notty usepeerdns\n" 169dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "\n" 170dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "adb sync notes: adb sync [ <directory> ]\n" 171dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " <localdir> can be interpreted in several ways:\n" 172dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "\n" 173dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " - If <directory> is not specified, both /system and /data partitions will be updated.\n" 174dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "\n" 175dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " - If it is \"system\" or \"data\", only the corresponding partition\n" 176dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " is updated.\n" 177cd64315f72537359537c66eebe482495ffefba57Tim "\n" 178cd64315f72537359537c66eebe482495ffefba57Tim "environmental variables:\n" 179cd64315f72537359537c66eebe482495ffefba57Tim " ADB_TRACE - Print debug information. A comma separated list of the following values\n" 180cd64315f72537359537c66eebe482495ffefba57Tim " 1 or all, adb, sockets, packets, rwx, usb, sync, sysdeps, transport, jdwp\n" 181cd64315f72537359537c66eebe482495ffefba57Tim " ANDROID_SERIAL - The serial number to connect to. -s takes priority over this if given.\n" 182cd64315f72537359537c66eebe482495ffefba57Tim " ANDROID_LOG_TAGS - When used with the logcat option, only these debug tags are printed.\n" 183dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ); 184dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 185dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 186dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint usage() 187dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 188dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project help(); 189dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 190dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 191dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 192dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef HAVE_TERMIO_H 193dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic struct termios tio_save; 194dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 195dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void stdin_raw_init(int fd) 196dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 197dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct termios tio; 198dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 199dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(tcgetattr(fd, &tio)) return; 200dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(tcgetattr(fd, &tio_save)) return; 201dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 202dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tio.c_lflag = 0; /* disable CANON, ECHO*, etc */ 203dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 204dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* no timeout but request at least one character per read */ 205dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tio.c_cc[VTIME] = 0; 206dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tio.c_cc[VMIN] = 1; 207dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 208dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tcsetattr(fd, TCSANOW, &tio); 209dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tcflush(fd, TCIFLUSH); 210dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 211dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 212dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void stdin_raw_restore(int fd) 213dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 214dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tcsetattr(fd, TCSANOW, &tio_save); 215dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tcflush(fd, TCIFLUSH); 216dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 217dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 218dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 219dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void read_and_dump(int fd) 220dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 221dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char buf[4096]; 222dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int len; 223dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 224dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while(fd >= 0) { 225408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall D("read_and_dump(): pre adb_read(fd=%d)\n", fd); 226dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project len = adb_read(fd, buf, 4096); 227408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall D("read_and_dump(): post adb_read(fd=%d): len=%d\n", fd, len); 228dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(len == 0) { 229dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 230dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 231dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 232dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(len < 0) { 233dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(errno == EINTR) continue; 234dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 235dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 236dd6b36e334809e7a99f0bce45353cdd7e4dac4e1Mike Lockwood fwrite(buf, 1, len, stdout); 237dd6b36e334809e7a99f0bce45353cdd7e4dac4e1Mike Lockwood fflush(stdout); 238dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 239dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 240dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 241d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tatestatic void copy_to_file(int inFd, int outFd) { 2425b811fa5dd00288954f15209a56aea03d5e4a004Christopher Tate const size_t BUFSIZE = 32 * 1024; 2435b811fa5dd00288954f15209a56aea03d5e4a004Christopher Tate char* buf = (char*) malloc(BUFSIZE); 244d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate int len; 245c9cd3b976111d91ede6cd88bd06eb57b10b2f0e7Christopher Tate long total = 0; 246d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate 247d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate D("copy_to_file(%d -> %d)\n", inFd, outFd); 248d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate for (;;) { 2495b811fa5dd00288954f15209a56aea03d5e4a004Christopher Tate len = adb_read(inFd, buf, BUFSIZE); 250d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate if (len == 0) { 2515b811fa5dd00288954f15209a56aea03d5e4a004Christopher Tate D("copy_to_file() : read 0 bytes; exiting\n"); 252d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate break; 253d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate } 254d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate if (len < 0) { 2555b811fa5dd00288954f15209a56aea03d5e4a004Christopher Tate if (errno == EINTR) { 2565b811fa5dd00288954f15209a56aea03d5e4a004Christopher Tate D("copy_to_file() : EINTR, retrying\n"); 2575b811fa5dd00288954f15209a56aea03d5e4a004Christopher Tate continue; 2585b811fa5dd00288954f15209a56aea03d5e4a004Christopher Tate } 259d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate D("copy_to_file() : error %d\n", errno); 260d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate break; 261d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate } 262d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate adb_write(outFd, buf, len); 263c9cd3b976111d91ede6cd88bd06eb57b10b2f0e7Christopher Tate total += len; 264d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate } 265c9cd3b976111d91ede6cd88bd06eb57b10b2f0e7Christopher Tate D("copy_to_file() finished after %lu bytes\n", total); 2665b811fa5dd00288954f15209a56aea03d5e4a004Christopher Tate free(buf); 267d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate} 268d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate 269dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void *stdin_read_thread(void *x) 270dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 271dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int fd, fdi; 272dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project unsigned char buf[1024]; 273dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int r, n; 274dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int state = 0; 275dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 276dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int *fds = (int*) x; 277dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fd = fds[0]; 278dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fdi = fds[1]; 279dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free(fds); 280dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 281dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for(;;) { 282dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* fdi is really the client's stdin, so use read, not adb_read here */ 283408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall D("stdin_read_thread(): pre unix_read(fdi=%d,...)\n", fdi); 284dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r = unix_read(fdi, buf, 1024); 285408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall D("stdin_read_thread(): post unix_read(fdi=%d,...)\n", fdi); 286dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(r == 0) break; 287dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(r < 0) { 288dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(errno == EINTR) continue; 289dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 290dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 29167d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood for(n = 0; n < r; n++){ 29267d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood switch(buf[n]) { 29367d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood case '\n': 29467d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood state = 1; 29567d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood break; 29667d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood case '\r': 29767d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood state = 1; 29867d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood break; 29967d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood case '~': 30067d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood if(state == 1) state++; 30167d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood break; 30267d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood case '.': 30367d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood if(state == 2) { 30467d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood fprintf(stderr,"\n* disconnect *\n"); 30567d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood#ifdef HAVE_TERMIO_H 30667d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood stdin_raw_restore(fdi); 307dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 30867d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood exit(0); 309dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 31067d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood default: 31167d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood state = 0; 312dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 313dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 314dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r = adb_write(fd, buf, r); 315dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(r <= 0) { 316dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 317dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 318dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 319dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 320dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 321dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 322dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint interactive_shell(void) 323dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 324dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_thread_t thr; 325dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int fdi, fd; 326dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int *fds; 327dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 328dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fd = adb_connect("shell:"); 329dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(fd < 0) { 330dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"error: %s\n", adb_error()); 331dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 332dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 333dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fdi = 0; //dup(0); 334dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 335dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fds = malloc(sizeof(int) * 2); 336dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fds[0] = fd; 337dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fds[1] = fdi; 338dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 339dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef HAVE_TERMIO_H 340dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project stdin_raw_init(fdi); 341dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 342dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_thread_create(&thr, stdin_read_thread, fds); 343dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project read_and_dump(fd); 344dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef HAVE_TERMIO_H 345dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project stdin_raw_restore(fdi); 346dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 347dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 348dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 349dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 350dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 351dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void format_host_command(char* buffer, size_t buflen, const char* command, transport_type ttype, const char* serial) 352dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 353dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (serial) { 354dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project snprintf(buffer, buflen, "host-serial:%s:%s", serial, command); 355dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 356dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char* prefix = "host"; 357dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (ttype == kTransportUsb) 358dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project prefix = "host-usb"; 359dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project else if (ttype == kTransportLocal) 360dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project prefix = "host-local"; 361dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 362dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project snprintf(buffer, buflen, "%s:%s", prefix, command); 363dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 364dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 365dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 366dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void status_window(transport_type ttype, const char* serial) 367dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 368dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char command[4096]; 369dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *state = 0; 370dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *laststate = 0; 371dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 372dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* silence stderr */ 373dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef _WIN32 374dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* XXX: TODO */ 375dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#else 376dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int fd; 377dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fd = unix_open("/dev/null", O_WRONLY); 378dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project dup2(fd, 2); 379dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_close(fd); 380dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 381dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 382dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project format_host_command(command, sizeof command, "get-state", ttype, serial); 383dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 384dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for(;;) { 385dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_sleep_ms(250); 386dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 387dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(state) { 388dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free(state); 389dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project state = 0; 390dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 391dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 392dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project state = adb_query(command); 393dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 394dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(state) { 395dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(laststate && !strcmp(state,laststate)){ 396dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project continue; 397dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 398dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(laststate) free(laststate); 399dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project laststate = strdup(state); 400dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 401dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 402dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 403dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("%c[2J%c[2H", 27, 27); 404dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("Android Debug Bridge\n"); 405dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("State: %s\n", state ? state : "offline"); 406dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fflush(stdout); 407dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 408dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 409dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 410dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/** duplicate string and quote all \ " ( ) chars + space character. */ 411dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic char * 412dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectdupAndQuote(const char *s) 413dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 414dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char *ts; 415dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project size_t alloc_len; 416dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *ret; 417dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *dest; 418dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 419dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ts = s; 420dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 421dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project alloc_len = 0; 422dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 423dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for( ;*ts != '\0'; ts++) { 424dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project alloc_len++; 425dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (*ts == ' ' || *ts == '"' || *ts == '\\' || *ts == '(' || *ts == ')') { 426dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project alloc_len++; 427dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 428dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 429dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 430dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ret = (char *)malloc(alloc_len + 1); 431dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 432dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ts = s; 433dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project dest = ret; 434dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 435dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for ( ;*ts != '\0'; ts++) { 436dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (*ts == ' ' || *ts == '"' || *ts == '\\' || *ts == '(' || *ts == ')') { 437dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *dest++ = '\\'; 438dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 439dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 440dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *dest++ = *ts; 441dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 442dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 443dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *dest++ = '\0'; 444dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 445dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return ret; 446dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 447dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 448dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/** 449dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Run ppp in "notty" mode against a resource listed as the first parameter 450dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * eg: 451dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 452dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * ppp dev:/dev/omap_csmi_tty0 <ppp options> 453dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 454dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 455dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint ppp(int argc, char **argv) 456dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 457dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef HAVE_WIN32_PROC 458dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "error: adb %s not implemented on Win32\n", argv[0]); 459dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 460dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#else 461dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *adb_service_name; 462dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pid_t pid; 463dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int fd; 464dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 465dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (argc < 2) { 466dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "usage: adb %s <adb service name> [ppp opts]\n", 467dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argv[0]); 468dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 469dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 470dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 471dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 472dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_service_name = argv[1]; 473dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 474dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fd = adb_connect(adb_service_name); 475dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 476dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(fd < 0) { 477dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"Error: Could not open adb service: %s. Error: %s\n", 478dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_service_name, adb_error()); 479dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 480dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 481dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 482dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pid = fork(); 483dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 484dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (pid < 0) { 485dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project perror("from fork()"); 486dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 487dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if (pid == 0) { 488dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int err; 489dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int i; 490dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char **ppp_args; 491dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 492dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // copy args 493dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ppp_args = (const char **) alloca(sizeof(char *) * argc + 1); 494dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ppp_args[0] = "pppd"; 495dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for (i = 2 ; i < argc ; i++) { 496dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project //argv[2] and beyond become ppp_args[1] and beyond 497dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ppp_args[i - 1] = argv[i]; 498dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 499dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ppp_args[i-1] = NULL; 500dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 501dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // child side 502dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 503dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project dup2(fd, STDIN_FILENO); 504dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project dup2(fd, STDOUT_FILENO); 505dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_close(STDERR_FILENO); 506dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_close(fd); 507dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 508dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project err = execvp("pppd", (char * const *)ppp_args); 509dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 510dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (err < 0) { 511dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project perror("execing pppd"); 512dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 513dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project exit(-1); 514dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 515dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // parent side 516dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 517dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_close(fd); 518dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 519dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 520dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif /* !HAVE_WIN32_PROC */ 521dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 522dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 523dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int send_shellcommand(transport_type transport, char* serial, char* buf) 524dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 525dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int fd, ret; 526dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 527dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for(;;) { 528dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fd = adb_connect(buf); 529dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(fd >= 0) 530dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 531dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"- waiting for device -\n"); 532dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_sleep_ms(1000); 533dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project do_cmd(transport, serial, "wait-for-device", 0); 534dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 535dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 536dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project read_and_dump(fd); 537dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ret = adb_close(fd); 538dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (ret) 539dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project perror("close"); 540dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 541dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return ret; 542dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 543dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 544dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int logcat(transport_type transport, char* serial, int argc, char **argv) 545dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 546dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char buf[4096]; 547dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 548dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *log_tags; 549dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *quoted_log_tags; 550dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 551dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project log_tags = getenv("ANDROID_LOG_TAGS"); 552dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project quoted_log_tags = dupAndQuote(log_tags == NULL ? "" : log_tags); 553dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 554dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project snprintf(buf, sizeof(buf), 555dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "shell:export ANDROID_LOG_TAGS=\"\%s\" ; exec logcat", 556dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project quoted_log_tags); 557dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 558dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free(quoted_log_tags); 559dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 560dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argc -= 1; 561dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argv += 1; 562dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while(argc-- > 0) { 563dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *quoted; 564dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 565dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project quoted = dupAndQuote (*argv++); 566dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 567dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strncat(buf, " ", sizeof(buf)-1); 568dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strncat(buf, quoted, sizeof(buf)-1); 569dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free(quoted); 570dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 571dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 572dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project send_shellcommand(transport, serial, buf); 573dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 574dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 575dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 576d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tatestatic int backup(int argc, char** argv) { 577d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate char buf[4096]; 578de034ec83e2d76db54d1936e706e80853146dcc7Christopher Tate const char* filename = "./backup.ab"; 579d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate int fd, outFd; 580c9cd3b976111d91ede6cd88bd06eb57b10b2f0e7Christopher Tate int i, j; 581d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate 582c9cd3b976111d91ede6cd88bd06eb57b10b2f0e7Christopher Tate /* find, extract, and use any -f argument */ 583c9cd3b976111d91ede6cd88bd06eb57b10b2f0e7Christopher Tate for (i = 1; i < argc; i++) { 584c9cd3b976111d91ede6cd88bd06eb57b10b2f0e7Christopher Tate if (!strcmp("-f", argv[i])) { 585c9cd3b976111d91ede6cd88bd06eb57b10b2f0e7Christopher Tate if (i == argc-1) { 586c9cd3b976111d91ede6cd88bd06eb57b10b2f0e7Christopher Tate fprintf(stderr, "adb: -f passed with no filename\n"); 587c9cd3b976111d91ede6cd88bd06eb57b10b2f0e7Christopher Tate return usage(); 588c9cd3b976111d91ede6cd88bd06eb57b10b2f0e7Christopher Tate } 589c9cd3b976111d91ede6cd88bd06eb57b10b2f0e7Christopher Tate filename = argv[i+1]; 590c9cd3b976111d91ede6cd88bd06eb57b10b2f0e7Christopher Tate for (j = i+2; j <= argc; ) { 591c9cd3b976111d91ede6cd88bd06eb57b10b2f0e7Christopher Tate argv[i++] = argv[j++]; 592c9cd3b976111d91ede6cd88bd06eb57b10b2f0e7Christopher Tate } 593c9cd3b976111d91ede6cd88bd06eb57b10b2f0e7Christopher Tate argc -= 2; 594c9cd3b976111d91ede6cd88bd06eb57b10b2f0e7Christopher Tate argv[argc] = NULL; 595c9cd3b976111d91ede6cd88bd06eb57b10b2f0e7Christopher Tate } 596d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate } 597d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate 598bb86bc5892374f3a41784135bebc7ada3270c8c1Christopher Tate /* bare "adb backup" or "adb backup -f filename" are not valid invocations */ 599bb86bc5892374f3a41784135bebc7ada3270c8c1Christopher Tate if (argc < 2) return usage(); 600bb86bc5892374f3a41784135bebc7ada3270c8c1Christopher Tate 601d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate outFd = adb_open_mode(filename, O_WRONLY | O_CREAT | O_TRUNC, 0640); 602d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate if (outFd < 0) { 603d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate fprintf(stderr, "adb: unable to open file %s\n", filename); 604d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate return -1; 605d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate } 606d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate 607d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate snprintf(buf, sizeof(buf), "backup"); 608d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate for (argc--, argv++; argc; argc--, argv++) { 609d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate strncat(buf, ":", sizeof(buf) - strlen(buf) - 1); 610d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate strncat(buf, argv[0], sizeof(buf) - strlen(buf) - 1); 611d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate } 612d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate 613d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate D("backup. filename=%s buf=%s\n", filename, buf); 614d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate fd = adb_connect(buf); 615d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate if (fd < 0) { 616d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate fprintf(stderr, "adb: unable to connect for backup\n"); 617d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate adb_close(outFd); 618d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate return -1; 619d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate } 620d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate 621d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate copy_to_file(fd, outFd); 622d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate 623d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate adb_close(fd); 624d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate adb_close(outFd); 625d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate return 0; 626d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate} 627d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate 628702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tatestatic int restore(int argc, char** argv) { 629702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate const char* filename; 630702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate int fd, tarFd; 631702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate 632702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate if (argc != 2) return usage(); 633702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate 634702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate filename = argv[1]; 635702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate tarFd = adb_open(filename, O_RDONLY); 636702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate if (tarFd < 0) { 637702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate fprintf(stderr, "adb: unable to open file %s\n", filename); 638702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate return -1; 639702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate } 640702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate 641702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate fd = adb_connect("restore:"); 642702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate if (fd < 0) { 643702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate fprintf(stderr, "adb: unable to connect for backup\n"); 644702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate adb_close(tarFd); 645702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate return -1; 646702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate } 647702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate 648702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate copy_to_file(tarFd, fd); 649702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate 650702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate adb_close(fd); 651702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate adb_close(tarFd); 652702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate return 0; 653702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate} 654702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate 655dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define SENTINEL_FILE "config" OS_PATH_SEPARATOR_STR "envsetup.make" 656dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int top_works(const char *top) 657dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 658dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (top != NULL && adb_is_absolute_host_path(top)) { 659dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char path_buf[PATH_MAX]; 660dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project snprintf(path_buf, sizeof(path_buf), 661dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "%s" OS_PATH_SEPARATOR_STR SENTINEL_FILE, top); 662dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return access(path_buf, F_OK) == 0; 663dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 664dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 665dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 666dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 667dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic char *find_top_from(const char *indir, char path_buf[PATH_MAX]) 668dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 669dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strcpy(path_buf, indir); 670dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while (1) { 671dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (top_works(path_buf)) { 672dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return path_buf; 673dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 674dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *s = adb_dirstop(path_buf); 675dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (s != NULL) { 676dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *s = '\0'; 677dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 678dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project path_buf[0] = '\0'; 679dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return NULL; 680dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 681dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 682dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 683dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 684dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic char *find_top(char path_buf[PATH_MAX]) 685dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 686dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *top = getenv("ANDROID_BUILD_TOP"); 687dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (top != NULL && top[0] != '\0') { 688dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!top_works(top)) { 689dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "adb: bad ANDROID_BUILD_TOP value \"%s\"\n", top); 690dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return NULL; 691dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 692dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 693dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project top = getenv("TOP"); 694dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (top != NULL && top[0] != '\0') { 695dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!top_works(top)) { 696dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "adb: bad TOP value \"%s\"\n", top); 697dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return NULL; 698dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 699dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 700dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project top = NULL; 701dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 702dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 703dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 704dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (top != NULL) { 705dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* The environment pointed to a top directory that works. 706dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 707dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strcpy(path_buf, top); 708dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return path_buf; 709dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 710dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 711dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* The environment didn't help. Walk up the tree from the CWD 712dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * to see if we can find the top. 713dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 714dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char dir[PATH_MAX]; 715dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project top = find_top_from(getcwd(dir, sizeof(dir)), path_buf); 716dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (top == NULL) { 717dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* If the CWD isn't under a good-looking top, see if the 718dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * executable is. 719dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 7203166410a82f43d39201be98a8d35c51baa86cb53Alexey Tarasov get_my_path(dir, PATH_MAX); 721dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project top = find_top_from(dir, path_buf); 722dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 723dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return top; 724dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 725dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 726dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* <hint> may be: 727dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * - A simple product name 728dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * e.g., "sooner" 729dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectTODO: debug? sooner-debug, sooner:debug? 730dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * - A relative path from the CWD to the ANDROID_PRODUCT_OUT dir 731dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * e.g., "out/target/product/sooner" 732dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * - An absolute path to the PRODUCT_OUT dir 733dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * e.g., "/src/device/out/target/product/sooner" 734dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 735dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Given <hint>, try to construct an absolute path to the 736dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * ANDROID_PRODUCT_OUT dir. 737dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 738dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic const char *find_product_out_path(const char *hint) 739dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 740dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project static char path_buf[PATH_MAX]; 741dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 742dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (hint == NULL || hint[0] == '\0') { 743dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return NULL; 744dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 745dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 746dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* If it's already absolute, don't bother doing any work. 747dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 748dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (adb_is_absolute_host_path(hint)) { 749dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strcpy(path_buf, hint); 750dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return path_buf; 751dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 752dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 753dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* If there are any slashes in it, assume it's a relative path; 754dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * make it absolute. 755dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 756dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (adb_dirstart(hint) != NULL) { 757dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (getcwd(path_buf, sizeof(path_buf)) == NULL) { 758dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "adb: Couldn't get CWD: %s\n", strerror(errno)); 759dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return NULL; 760dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 761dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (strlen(path_buf) + 1 + strlen(hint) >= sizeof(path_buf)) { 762dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "adb: Couldn't assemble path\n"); 763dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return NULL; 764dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 765dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strcat(path_buf, OS_PATH_SEPARATOR_STR); 766dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strcat(path_buf, hint); 767dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return path_buf; 768dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 769dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 770dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* It's a string without any slashes. Try to do something with it. 771dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 772dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Try to find the root of the build tree, and build a PRODUCT_OUT 773dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * path from there. 774dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 775dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char top_buf[PATH_MAX]; 776dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char *top = find_top(top_buf); 777dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (top == NULL) { 778dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "adb: Couldn't find top of build tree\n"); 779dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return NULL; 780dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 781dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project//TODO: if we have a way to indicate debug, look in out/debug/target/... 782dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project snprintf(path_buf, sizeof(path_buf), 783dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "%s" OS_PATH_SEPARATOR_STR 784dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "out" OS_PATH_SEPARATOR_STR 785dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "target" OS_PATH_SEPARATOR_STR 786dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "product" OS_PATH_SEPARATOR_STR 787dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "%s", top_buf, hint); 788dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (access(path_buf, F_OK) < 0) { 789dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "adb: Couldn't find a product dir " 790dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "based on \"-p %s\"; \"%s\" doesn't exist\n", hint, path_buf); 791dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return NULL; 792dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 793dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return path_buf; 794dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 795dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 796dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint adb_commandline(int argc, char **argv) 797dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 798dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char buf[4096]; 799dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int no_daemon = 0; 800dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int is_daemon = 0; 801305b4b0f6069d733d3023a57fdc8a6d9cf7de2a6David 'Digit' Turner int is_server = 0; 802dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int persist = 0; 803dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int r; 804dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int quote; 805dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project transport_type ttype = kTransportAny; 806dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char* serial = NULL; 807a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger char* server_port_str = NULL; 808dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 809dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* If defined, this should be an absolute path to 810dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * the directory containing all of the various system images 811dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * for a particular product. If not defined, and the adb 812dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * command requires this information, then the user must 813dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * specify the path using "-p". 814dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 815dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project gProductOutPath = getenv("ANDROID_PRODUCT_OUT"); 816dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (gProductOutPath == NULL || gProductOutPath[0] == '\0') { 817dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project gProductOutPath = NULL; 818dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 819dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // TODO: also try TARGET_PRODUCT/TARGET_DEVICE as a hint 820dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 821db4492640313be9d3fd65ee5bd7648a9570411bbNick Pelly serial = getenv("ANDROID_SERIAL"); 822db4492640313be9d3fd65ee5bd7648a9570411bbNick Pelly 823a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger /* Validate and assign the server port */ 824a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger server_port_str = getenv("ANDROID_ADB_SERVER_PORT"); 825a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger int server_port = DEFAULT_ADB_PORT; 826a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger if (server_port_str && strlen(server_port_str) > 0) { 827a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger server_port = (int) strtol(server_port_str, NULL, 0); 828a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger if (server_port <= 0) { 829a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger fprintf(stderr, 830a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger "adb: Env var ANDROID_ADB_SERVER_PORT must be a positive number. Got \"%s\"\n", 831a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger server_port_str); 832a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger return usage(); 833a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger } 834a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger } 835a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger 836a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger /* modifiers and flags */ 837dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while(argc > 0) { 838305b4b0f6069d733d3023a57fdc8a6d9cf7de2a6David 'Digit' Turner if(!strcmp(argv[0],"server")) { 839305b4b0f6069d733d3023a57fdc8a6d9cf7de2a6David 'Digit' Turner is_server = 1; 840305b4b0f6069d733d3023a57fdc8a6d9cf7de2a6David 'Digit' Turner } else if(!strcmp(argv[0],"nodaemon")) { 841dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project no_daemon = 1; 842dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if (!strcmp(argv[0], "fork-server")) { 843dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* this is a special flag used only when the ADB client launches the ADB Server */ 844dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project is_daemon = 1; 845dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if(!strcmp(argv[0],"persist")) { 846dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project persist = 1; 847dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if(!strncmp(argv[0], "-p", 2)) { 848dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char *product = NULL; 849dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (argv[0][2] == '\0') { 850dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (argc < 2) return usage(); 851dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project product = argv[1]; 852dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argc--; 853dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argv++; 854dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 855dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project product = argv[1] + 2; 856dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 857dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project gProductOutPath = find_product_out_path(product); 858dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (gProductOutPath == NULL) { 859dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "adb: could not resolve \"-p %s\"\n", 860dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project product); 861dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return usage(); 862dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 863dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if (argv[0][0]=='-' && argv[0][1]=='s') { 864dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (isdigit(argv[0][2])) { 865dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project serial = argv[0] + 2; 866dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 867a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger if(argc < 2 || argv[0][2] != '\0') return usage(); 868dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project serial = argv[1]; 869dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argc--; 870dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argv++; 871dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 872dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if (!strcmp(argv[0],"-d")) { 873dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ttype = kTransportUsb; 874dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if (!strcmp(argv[0],"-e")) { 875dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ttype = kTransportLocal; 876dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 877dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* out of recognized modifiers and flags */ 878dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 879dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 880dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argc--; 881dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argv++; 882dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 883dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 884dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_set_transport(ttype, serial); 885a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger adb_set_tcp_specifics(server_port); 886dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 887305b4b0f6069d733d3023a57fdc8a6d9cf7de2a6David 'Digit' Turner if (is_server) { 888dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (no_daemon || is_daemon) { 889a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger r = adb_main(is_daemon, server_port); 890dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 891a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger r = launch_server(server_port); 892dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 893dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(r) { 894dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"* could not start server *\n"); 895dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 896dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return r; 897dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 898dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 899dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttop: 900dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(argc == 0) { 901dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return usage(); 902dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 903dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 904dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* adb_connect() commands */ 905dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 906dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(argv[0], "devices")) { 907dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *tmp; 908dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project snprintf(buf, sizeof buf, "host:%s", argv[0]); 909dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tmp = adb_query(buf); 910dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(tmp) { 911dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("List of devices attached \n"); 912dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("%s\n", tmp); 913dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 914dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 915dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 916dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 917dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 918dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 919cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood if(!strcmp(argv[0], "connect")) { 920ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood char *tmp; 921ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood if (argc != 2) { 922cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood fprintf(stderr, "Usage: adb connect <host>[:<port>]\n"); 923ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood return 1; 924ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood } 925cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood snprintf(buf, sizeof buf, "host:connect:%s", argv[1]); 926cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood tmp = adb_query(buf); 927cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood if(tmp) { 928cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood printf("%s\n", tmp); 929cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood return 0; 930cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood } else { 931cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood return 1; 932cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood } 933cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood } 934cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood 935cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood if(!strcmp(argv[0], "disconnect")) { 936cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood char *tmp; 937cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood if (argc > 2) { 938cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood fprintf(stderr, "Usage: adb disconnect [<host>[:<port>]]\n"); 939cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood return 1; 940cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood } 941cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood if (argc == 2) { 942cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood snprintf(buf, sizeof buf, "host:disconnect:%s", argv[1]); 943cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood } else { 944cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood snprintf(buf, sizeof buf, "host:disconnect:"); 945cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood } 946ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood tmp = adb_query(buf); 947ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood if(tmp) { 948ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood printf("%s\n", tmp); 949ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood return 0; 950ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood } else { 951ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood return 1; 952ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood } 953ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood } 954ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood 955dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!strcmp(argv[0], "emu")) { 956dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return adb_send_emulator_command(argc, argv); 957dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 958dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 959ff91ab855b84cdcf110f1a899320d3920e7c55a5Daniel Sandler if(!strcmp(argv[0], "shell") || !strcmp(argv[0], "hell")) { 960dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int r; 961dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int fd; 962dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 963ff91ab855b84cdcf110f1a899320d3920e7c55a5Daniel Sandler char h = (argv[0][0] == 'h'); 964ff91ab855b84cdcf110f1a899320d3920e7c55a5Daniel Sandler 965ff91ab855b84cdcf110f1a899320d3920e7c55a5Daniel Sandler if (h) { 966ff91ab855b84cdcf110f1a899320d3920e7c55a5Daniel Sandler printf("\x1b[41;33m"); 967ff91ab855b84cdcf110f1a899320d3920e7c55a5Daniel Sandler fflush(stdout); 968ff91ab855b84cdcf110f1a899320d3920e7c55a5Daniel Sandler } 969ff91ab855b84cdcf110f1a899320d3920e7c55a5Daniel Sandler 970dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(argc < 2) { 971408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall D("starting interactive shell\n"); 972ff91ab855b84cdcf110f1a899320d3920e7c55a5Daniel Sandler r = interactive_shell(); 973ff91ab855b84cdcf110f1a899320d3920e7c55a5Daniel Sandler if (h) { 974ff91ab855b84cdcf110f1a899320d3920e7c55a5Daniel Sandler printf("\x1b[0m"); 975ff91ab855b84cdcf110f1a899320d3920e7c55a5Daniel Sandler fflush(stdout); 976ff91ab855b84cdcf110f1a899320d3920e7c55a5Daniel Sandler } 977ff91ab855b84cdcf110f1a899320d3920e7c55a5Daniel Sandler return r; 978dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 979dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 980dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project snprintf(buf, sizeof buf, "shell:%s", argv[1]); 981dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argc -= 2; 982dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argv += 2; 983dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while(argc-- > 0) { 984dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strcat(buf, " "); 985dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 986dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* quote empty strings and strings with spaces */ 987dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project quote = (**argv == 0 || strchr(*argv, ' ')); 988dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (quote) 989a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger strcat(buf, "\""); 990dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strcat(buf, *argv++); 991dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (quote) 992a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger strcat(buf, "\""); 993dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 994dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 995dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for(;;) { 996408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall D("interactive shell loop. buff=%s\n", buf); 997dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fd = adb_connect(buf); 998dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(fd >= 0) { 999408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall D("about to read_and_dump(fd=%d)\n", fd); 1000dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project read_and_dump(fd); 1001408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall D("read_and_dump() done.\n"); 1002dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_close(fd); 1003dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r = 0; 1004dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 1005dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"error: %s\n", adb_error()); 1006dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r = -1; 1007dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1008dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1009dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(persist) { 1010dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"\n- waiting for device -\n"); 1011dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_sleep_ms(1000); 1012dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project do_cmd(ttype, serial, "wait-for-device", 0); 1013dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 1014ff91ab855b84cdcf110f1a899320d3920e7c55a5Daniel Sandler if (h) { 1015ff91ab855b84cdcf110f1a899320d3920e7c55a5Daniel Sandler printf("\x1b[0m"); 1016ff91ab855b84cdcf110f1a899320d3920e7c55a5Daniel Sandler fflush(stdout); 1017ff91ab855b84cdcf110f1a899320d3920e7c55a5Daniel Sandler } 1018408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall D("interactive shell loop. return r=%d\n", r); 1019dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return r; 1020dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1021dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1022dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1023dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1024dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(argv[0], "kill-server")) { 1025dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int fd; 1026dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fd = _adb_connect("host:kill"); 1027dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(fd == -1) { 1028dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"* server not running *\n"); 1029dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 1030dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1031dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 1032dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1033dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1034ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood if(!strcmp(argv[0], "remount") || !strcmp(argv[0], "reboot") 1035311add489e4a1712d201c3b83fa364d5569e6788Romain Guy || !strcmp(argv[0], "reboot-bootloader") 1036ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood || !strcmp(argv[0], "tcpip") || !strcmp(argv[0], "usb") 1037f56d1b5a76c6cb282a7689fc93f85de63bd205f6Mike Lockwood || !strcmp(argv[0], "root")) { 1038ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood char command[100]; 1039311add489e4a1712d201c3b83fa364d5569e6788Romain Guy if (!strcmp(argv[0], "reboot-bootloader")) 1040311add489e4a1712d201c3b83fa364d5569e6788Romain Guy snprintf(command, sizeof(command), "reboot:bootloader"); 1041311add489e4a1712d201c3b83fa364d5569e6788Romain Guy else if (argc > 1) 1042ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood snprintf(command, sizeof(command), "%s:%s", argv[0], argv[1]); 1043ee15662140632672a6878787a1ff26f5ebdc1e68Mike Lockwood else 1044ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood snprintf(command, sizeof(command), "%s:", argv[0]); 1045ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood int fd = adb_connect(command); 1046e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project if(fd >= 0) { 1047e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project read_and_dump(fd); 1048e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project adb_close(fd); 1049e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project return 0; 1050e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project } 1051e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project fprintf(stderr,"error: %s\n", adb_error()); 1052e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project return 1; 1053e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project } 1054e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project 1055f56d1b5a76c6cb282a7689fc93f85de63bd205f6Mike Lockwood if(!strcmp(argv[0], "bugreport")) { 1056c130ea7c29b0149939c8fd6b8da2c981944636f9Dan Egnor if (argc != 1) return usage(); 1057c130ea7c29b0149939c8fd6b8da2c981944636f9Dan Egnor do_cmd(ttype, serial, "shell", "bugreport", 0); 1058f56d1b5a76c6cb282a7689fc93f85de63bd205f6Mike Lockwood return 0; 1059f56d1b5a76c6cb282a7689fc93f85de63bd205f6Mike Lockwood } 1060f56d1b5a76c6cb282a7689fc93f85de63bd205f6Mike Lockwood 1061dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* adb_command() wrapper commands */ 1062dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1063dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strncmp(argv[0], "wait-for-", strlen("wait-for-"))) { 1064dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char* service = argv[0]; 1065dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!strncmp(service, "wait-for-device", strlen("wait-for-device"))) { 1066dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (ttype == kTransportUsb) { 1067dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project service = "wait-for-usb"; 1068dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if (ttype == kTransportLocal) { 1069dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project service = "wait-for-local"; 1070dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 1071dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project service = "wait-for-any"; 1072dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1073dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1074dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1075dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project format_host_command(buf, sizeof buf, service, ttype, serial); 1076dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1077dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (adb_command(buf)) { 1078dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project D("failure: %s *\n",adb_error()); 1079dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"error: %s\n", adb_error()); 1080dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 1081dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1082dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1083dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* Allow a command to be run after wait-for-device, 1084dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * e.g. 'adb wait-for-device shell'. 1085dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 1086dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(argc > 1) { 1087dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argc--; 1088dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argv++; 1089dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project goto top; 1090dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1091dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 1092dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1093dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1094dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(argv[0], "forward")) { 1095dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(argc != 3) return usage(); 1096dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (serial) { 109764e99545d4b5600bb5ca044fcad636ae8389b381Mike Lockwood snprintf(buf, sizeof buf, "host-serial:%s:forward:%s;%s",serial, argv[1], argv[2]); 109864e99545d4b5600bb5ca044fcad636ae8389b381Mike Lockwood } else if (ttype == kTransportUsb) { 109964e99545d4b5600bb5ca044fcad636ae8389b381Mike Lockwood snprintf(buf, sizeof buf, "host-usb:forward:%s;%s", argv[1], argv[2]); 110064e99545d4b5600bb5ca044fcad636ae8389b381Mike Lockwood } else if (ttype == kTransportLocal) { 110164e99545d4b5600bb5ca044fcad636ae8389b381Mike Lockwood snprintf(buf, sizeof buf, "host-local:forward:%s;%s", argv[1], argv[2]); 1102dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 110364e99545d4b5600bb5ca044fcad636ae8389b381Mike Lockwood snprintf(buf, sizeof buf, "host:forward:%s;%s", argv[1], argv[2]); 1104dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1105dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(adb_command(buf)) { 1106dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"error: %s\n", adb_error()); 1107dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 1108dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1109dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 1110dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1111dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1112dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* do_sync_*() commands */ 1113dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1114dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(argv[0], "ls")) { 1115dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(argc != 2) return usage(); 1116dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return do_sync_ls(argv[1]); 1117dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1118dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1119dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(argv[0], "push")) { 1120dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(argc != 3) return usage(); 1121dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return do_sync_push(argv[1], argv[2], 0 /* no verify APK */); 1122dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1123dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1124dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(argv[0], "pull")) { 112500c0eeac6be1597ce24fccf8e2afaaffab223cb3Joe Onorato if (argc == 2) { 112600c0eeac6be1597ce24fccf8e2afaaffab223cb3Joe Onorato return do_sync_pull(argv[1], "."); 112700c0eeac6be1597ce24fccf8e2afaaffab223cb3Joe Onorato } else if (argc == 3) { 112800c0eeac6be1597ce24fccf8e2afaaffab223cb3Joe Onorato return do_sync_pull(argv[1], argv[2]); 112900c0eeac6be1597ce24fccf8e2afaaffab223cb3Joe Onorato } else { 113000c0eeac6be1597ce24fccf8e2afaaffab223cb3Joe Onorato return usage(); 113100c0eeac6be1597ce24fccf8e2afaaffab223cb3Joe Onorato } 1132dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1133dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1134dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(argv[0], "install")) { 1135dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (argc < 2) return usage(); 1136dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return install_app(ttype, serial, argc, argv); 1137dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1138dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1139dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(argv[0], "uninstall")) { 1140dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (argc < 2) return usage(); 1141dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return uninstall_app(ttype, serial, argc, argv); 1142dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1143dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1144dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(argv[0], "sync")) { 1145dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *srcarg, *android_srcpath, *data_srcpath; 1146705c944c0e2a50150ffb41707b6b3daebb45cf79Anthony Newnam int listonly = 0; 1147705c944c0e2a50150ffb41707b6b3daebb45cf79Anthony Newnam 1148dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int ret; 1149dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(argc < 2) { 1150dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* No local path was specified. */ 1151dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project srcarg = NULL; 1152705c944c0e2a50150ffb41707b6b3daebb45cf79Anthony Newnam } else if (argc >= 2 && strcmp(argv[1], "-l") == 0) { 1153705c944c0e2a50150ffb41707b6b3daebb45cf79Anthony Newnam listonly = 1; 1154705c944c0e2a50150ffb41707b6b3daebb45cf79Anthony Newnam if (argc == 3) { 1155705c944c0e2a50150ffb41707b6b3daebb45cf79Anthony Newnam srcarg = argv[2]; 1156705c944c0e2a50150ffb41707b6b3daebb45cf79Anthony Newnam } else { 1157705c944c0e2a50150ffb41707b6b3daebb45cf79Anthony Newnam srcarg = NULL; 1158705c944c0e2a50150ffb41707b6b3daebb45cf79Anthony Newnam } 1159dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if(argc == 2) { 1160dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* A local path or "android"/"data" arg was specified. */ 1161dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project srcarg = argv[1]; 1162dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 1163dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return usage(); 1164dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1165dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ret = find_sync_dirs(srcarg, &android_srcpath, &data_srcpath); 1166dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(ret != 0) return usage(); 1167dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1168dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(android_srcpath != NULL) 1169705c944c0e2a50150ffb41707b6b3daebb45cf79Anthony Newnam ret = do_sync_sync(android_srcpath, "/system", listonly); 1170dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(ret == 0 && data_srcpath != NULL) 1171705c944c0e2a50150ffb41707b6b3daebb45cf79Anthony Newnam ret = do_sync_sync(data_srcpath, "/data", listonly); 1172dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1173dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free(android_srcpath); 1174dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free(data_srcpath); 1175dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return ret; 1176dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1177dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1178dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* passthrough commands */ 1179dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1180dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(argv[0],"get-state") || 1181dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project !strcmp(argv[0],"get-serialno")) 1182dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { 1183dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *tmp; 1184dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1185dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project format_host_command(buf, sizeof buf, argv[0], ttype, serial); 1186dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tmp = adb_query(buf); 1187dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(tmp) { 1188dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("%s\n", tmp); 1189dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 1190dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 1191dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 1192dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1193dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1194dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1195dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* other commands */ 1196dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1197dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(argv[0],"status-window")) { 1198dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project status_window(ttype, serial); 1199dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 1200dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1201dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1202dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(argv[0],"logcat") || !strcmp(argv[0],"lolcat")) { 1203dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return logcat(ttype, serial, argc, argv); 1204dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1205dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1206dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(argv[0],"ppp")) { 1207dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return ppp(argc, argv); 1208dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1209dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1210dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!strcmp(argv[0], "start-server")) { 1211dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return adb_connect("host:start-server"); 1212dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1213dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1214d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate if (!strcmp(argv[0], "backup")) { 1215d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate return backup(argc, argv); 1216d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate } 1217d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate 1218702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate if (!strcmp(argv[0], "restore")) { 1219702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate return restore(argc, argv); 1220702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate } 1221702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate 1222dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!strcmp(argv[0], "jdwp")) { 1223dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int fd = adb_connect("jdwp"); 1224dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (fd >= 0) { 1225dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project read_and_dump(fd); 1226dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_close(fd); 1227dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 1228dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 1229dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "error: %s\n", adb_error()); 1230dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 1231dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1232dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1233dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1234dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* "adb /?" is a common idiom under Windows */ 1235dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(argv[0], "help") || !strcmp(argv[0], "/?")) { 1236dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project help(); 1237dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 1238dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1239dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1240dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(argv[0], "version")) { 1241dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project version(stdout); 1242dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 1243dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1244dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1245dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project usage(); 1246dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 1247dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 1248dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1249dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int do_cmd(transport_type ttype, char* serial, char *cmd, ...) 1250dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 1251dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *argv[16]; 1252dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int argc; 1253dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project va_list ap; 1254dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1255dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project va_start(ap, cmd); 1256dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argc = 0; 1257dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1258dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (serial) { 1259dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argv[argc++] = "-s"; 1260dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argv[argc++] = serial; 1261dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if (ttype == kTransportUsb) { 1262dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argv[argc++] = "-d"; 1263dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if (ttype == kTransportLocal) { 1264dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argv[argc++] = "-e"; 1265dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1266dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1267dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argv[argc++] = cmd; 1268dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while((argv[argc] = va_arg(ap, char*)) != 0) argc++; 1269dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project va_end(ap); 1270dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1271dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if 0 1272dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int n; 1273dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"argc = %d\n",argc); 1274dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for(n = 0; n < argc; n++) { 1275dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"argv[%d] = \"%s\"\n", n, argv[n]); 1276dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1277dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 1278dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1279dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return adb_commandline(argc, argv); 1280dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 1281dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1282dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint find_sync_dirs(const char *srcarg, 1283dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char **android_srcdir_out, char **data_srcdir_out) 1284dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 1285dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *android_srcdir, *data_srcdir; 1286dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1287dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(srcarg == NULL) { 1288dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project android_srcdir = product_file("system"); 1289dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project data_srcdir = product_file("data"); 1290dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 1291dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* srcarg may be "data", "system" or NULL. 1292dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * if srcarg is NULL, then both data and system are synced 1293dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 1294dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(strcmp(srcarg, "system") == 0) { 1295dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project android_srcdir = product_file("system"); 1296dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project data_srcdir = NULL; 1297dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if(strcmp(srcarg, "data") == 0) { 1298dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project android_srcdir = NULL; 1299dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project data_srcdir = product_file("data"); 1300dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 1301dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* It's not "system" or "data". 1302dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 1303dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 1304dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1305dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1306dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1307dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(android_srcdir_out != NULL) 1308dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *android_srcdir_out = android_srcdir; 1309dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project else 1310dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free(android_srcdir); 1311dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1312dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(data_srcdir_out != NULL) 1313dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *data_srcdir_out = data_srcdir; 1314dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project else 1315dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free(data_srcdir); 1316dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1317dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 1318dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 1319dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1320dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int pm_command(transport_type transport, char* serial, 1321dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int argc, char** argv) 1322dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 1323dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char buf[4096]; 1324dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1325dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project snprintf(buf, sizeof(buf), "shell:pm"); 1326dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1327dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while(argc-- > 0) { 1328dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *quoted; 1329dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1330dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project quoted = dupAndQuote(*argv++); 1331dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1332dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strncat(buf, " ", sizeof(buf)-1); 1333dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strncat(buf, quoted, sizeof(buf)-1); 1334dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free(quoted); 1335dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1336dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1337dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project send_shellcommand(transport, serial, buf); 1338dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 1339dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 1340dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1341dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint uninstall_app(transport_type transport, char* serial, int argc, char** argv) 1342dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 1343dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* if the user choose the -k option, we refuse to do it until devices are 1344dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project out with the option to uninstall the remaining data somehow (adb/ui) */ 1345dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (argc == 3 && strcmp(argv[1], "-k") == 0) 1346dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { 1347dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf( 1348dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "The -k option uninstalls the application while retaining the data/cache.\n" 1349dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "At the moment, there is no way to remove the remaining data.\n" 1350dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "You will have to reinstall the application with the same signature, and fully uninstall it.\n" 1351dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "If you truly wish to continue, execute 'adb shell pm uninstall -k %s'\n", argv[2]); 1352dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 1353dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1354dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1355dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* 'adb uninstall' takes the same arguments as 'pm uninstall' on device */ 1356dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return pm_command(transport, serial, argc, argv); 1357dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 1358dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1359dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int delete_file(transport_type transport, char* serial, char* filename) 1360dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 1361dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char buf[4096]; 1362dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char* quoted; 1363dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1364dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project snprintf(buf, sizeof(buf), "shell:rm "); 1365dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project quoted = dupAndQuote(filename); 1366dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strncat(buf, quoted, sizeof(buf)-1); 1367dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free(quoted); 1368dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1369dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project send_shellcommand(transport, serial, buf); 1370dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 1371dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 1372dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1373597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Rootstatic const char* get_basename(const char* filename) 1374597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root{ 1375597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root const char* basename = adb_dirstop(filename); 1376597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root if (basename) { 1377597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root basename++; 1378597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root return basename; 1379597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root } else { 1380597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root return filename; 1381597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root } 1382597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root} 1383597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root 1384597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Rootstatic int check_file(const char* filename) 1385dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 1386dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct stat st; 1387597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root 1388597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root if (filename == NULL) { 1389597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root return 0; 1390597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root } 1391597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root 1392597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root if (stat(filename, &st) != 0) { 1393597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root fprintf(stderr, "can't find '%s' to install\n", filename); 1394597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root return 1; 1395597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root } 1396597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root 1397597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root if (!S_ISREG(st.st_mode)) { 1398597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root fprintf(stderr, "can't install '%s' because it's not a file\n", filename); 1399597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root return 1; 1400597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root } 1401597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root 1402597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root return 0; 1403597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root} 1404597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root 1405597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Rootint install_app(transport_type transport, char* serial, int argc, char** argv) 1406597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root{ 1407597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root static const char *const DATA_DEST = "/data/local/tmp/%s"; 1408597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root static const char *const SD_DEST = "/sdcard/tmp/%s"; 14090ef3fd048aeaeb59467e43e543f66b96e4e6c7f5Mike Lockwood const char* where = DATA_DEST; 1410597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root char apk_dest[PATH_MAX]; 1411597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root char verification_dest[PATH_MAX]; 1412597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root char* apk_file; 1413597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root char* verification_file = NULL; 1414597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root int file_arg = -1; 1415597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root int err; 14160ef3fd048aeaeb59467e43e543f66b96e4e6c7f5Mike Lockwood int i; 14170ef3fd048aeaeb59467e43e543f66b96e4e6c7f5Mike Lockwood 1418597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root for (i = 1; i < argc; i++) { 1419597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root if (*argv[i] != '-') { 1420597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root file_arg = i; 1421597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root break; 1422597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root } else if (!strcmp(argv[i], "-s")) { 14230ef3fd048aeaeb59467e43e543f66b96e4e6c7f5Mike Lockwood where = SD_DEST; 1424597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root } 14250ef3fd048aeaeb59467e43e543f66b96e4e6c7f5Mike Lockwood } 1426dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1427597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root if (file_arg < 0) { 1428597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root fprintf(stderr, "can't find filename in arguments"); 1429597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root return 1; 1430597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root } else if (file_arg + 2 < argc) { 1431597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root fprintf(stderr, "too many files specified; only takes APK file and verifier file"); 1432597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root return 1; 1433dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1434597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root 1435597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root apk_file = argv[file_arg]; 1436597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root 1437597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root if (file_arg != argc - 1) { 1438597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root verification_file = argv[file_arg + 1]; 1439dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1440dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1441597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root if (check_file(apk_file) || check_file(verification_file)) { 1442dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 1443dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1444597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root 1445597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root snprintf(apk_dest, sizeof apk_dest, where, get_basename(apk_file)); 1446597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root if (verification_file != NULL) { 1447597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root snprintf(verification_dest, sizeof(verification_dest), where, get_basename(verification_file)); 1448597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root 1449597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root if (!strcmp(apk_dest, verification_dest)) { 1450597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root fprintf(stderr, "APK and verification file can't have the same name\n"); 1451597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root return 1; 1452597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root } 1453597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root } 1454597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root 1455597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root err = do_sync_push(apk_file, apk_dest, 1 /* verify APK */); 1456597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root if (err) { 1457597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root return err; 1458597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root } else { 1459597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root argv[file_arg] = apk_dest; /* destination name, not source location */ 1460dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1461dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1462597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root if (verification_file != NULL) { 1463597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root err = do_sync_push(verification_file, verification_dest, 0 /* no verify APK */); 1464597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root if (err) { 1465597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root goto cleanup_apk; 1466597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root } else { 1467597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root argv[file_arg + 1] = verification_dest; /* destination name, not source location */ 1468597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root } 1469597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root } 1470597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root 1471597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root pm_command(transport, serial, argc, argv); 1472597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root 1473597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root if (verification_file != NULL) { 1474597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root delete_file(transport, serial, verification_dest); 1475dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1476dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1477597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Rootcleanup_apk: 1478597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root delete_file(transport, serial, apk_dest); 1479597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root 1480dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return err; 1481dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 1482