commandline.c revision 4474ac408105bb31f945ddab53a24ed148e34227
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" 1234474ac408105bb31f945ddab53a24ed148e34227Anonymous Coward " adb install [-l] [-r] [-s] [--algo <algorithm name> --key <hex-encoded key> --iv <hex-encoded iv>] <file>\n" 1244474ac408105bb31f945ddab53a24ed148e34227Anonymous Coward " - push this package file to the device and install it\n" 125dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " ('-l' means forward-lock the app)\n" 126dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " ('-r' means reinstall the app, keeping its data)\n" 1270ef3fd048aeaeb59467e43e543f66b96e4e6c7f5Mike Lockwood " ('-s' means install on SD card instead of internal storage)\n" 1284474ac408105bb31f945ddab53a24ed148e34227Anonymous Coward " ('--algo', '--key', and '--iv' mean the file is encrypted already)\n" 129dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " adb uninstall [-k] <package> - remove this app package from the device\n" 130dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " ('-k' means keep the data and cache directories)\n" 131dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " adb bugreport - return all information from the device\n" 132dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " that should be included in a bug report.\n" 133dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "\n" 13456885094b63af1b0077dec16bc695aa09d8043fcChristopher Tate " adb backup [-f <file>] [-apk|-noapk] [-shared|-noshared] [-all] [-system|-nosystem] [<packages...>]\n" 13556885094b63af1b0077dec16bc695aa09d8043fcChristopher Tate " - write an archive of the device's data to <file>.\n" 13656885094b63af1b0077dec16bc695aa09d8043fcChristopher Tate " If no -f option is supplied then the data is written\n" 13756885094b63af1b0077dec16bc695aa09d8043fcChristopher Tate " to \"backup.ab\" in the current directory.\n" 138d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate " (-apk|-noapk enable/disable backup of the .apks themselves\n" 139de034ec83e2d76db54d1936e706e80853146dcc7Christopher Tate " in the archive; the default is noapk.)\n" 140d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate " (-shared|-noshared enable/disable backup of the device's\n" 141d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate " shared storage / SD card contents; the default is noshared.)\n" 142d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate " (-all means to back up all installed applications)\n" 14356885094b63af1b0077dec16bc695aa09d8043fcChristopher Tate " (-system|-nosystem toggles whether -all automatically includes\n" 14456885094b63af1b0077dec16bc695aa09d8043fcChristopher Tate " system applications; the default is to include system apps)\n" 145d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate " (<packages...> is the list of applications to be backed up. If\n" 146d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate " the -all or -shared flags are passed, then the package\n" 14756885094b63af1b0077dec16bc695aa09d8043fcChristopher Tate " list is optional. Applications explicitly given on the\n" 14856885094b63af1b0077dec16bc695aa09d8043fcChristopher Tate " command line will be included even if -nosystem would\n" 14956885094b63af1b0077dec16bc695aa09d8043fcChristopher Tate " ordinarily cause them to be omitted.)\n" 150d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate "\n" 151de034ec83e2d76db54d1936e706e80853146dcc7Christopher Tate " adb restore <file> - restore device contents from the <file> backup archive\n" 152702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate "\n" 153dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " adb help - show this help message\n" 154dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " adb version - show version num\n" 155dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "\n" 156dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "scripting:\n" 157dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " adb wait-for-device - block until device is online\n" 158dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " adb start-server - ensure that there is a server running\n" 159dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " adb kill-server - kill the server if it is running\n" 160dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " adb get-state - prints: offline | bootloader | device\n" 161dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " adb get-serialno - prints: <serial-number>\n" 162dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " adb status-window - continuously print device status for a specified device\n" 163dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " adb remount - remounts the /system partition on the device read-write\n" 164ee15662140632672a6878787a1ff26f5ebdc1e68Mike Lockwood " adb reboot [bootloader|recovery] - reboots the device, optionally into the bootloader or recovery program\n" 165311add489e4a1712d201c3b83fa364d5569e6788Romain Guy " adb reboot-bootloader - reboots the device into the bootloader\n" 166ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood " adb root - restarts the adbd daemon with root permissions\n" 167311add489e4a1712d201c3b83fa364d5569e6788Romain Guy " adb usb - restarts the adbd daemon listening on USB\n" 168ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood " adb tcpip <port> - restarts the adbd daemon listening on TCP on the specified port" 169dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "\n" 170dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "networking:\n" 171dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " adb ppp <tty> [parameters] - Run PPP over USB.\n" 172c989199ccfbe745a7109f57d2aee2577d2f72b8dKenny Root " Note: you should not automatically start a PPP connection.\n" 173dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " <tty> refers to the tty for PPP stream. Eg. dev:/dev/omap_csmi_tty1\n" 174dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " [parameters] - Eg. defaultroute debug dump local notty usepeerdns\n" 175dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "\n" 176dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "adb sync notes: adb sync [ <directory> ]\n" 177dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " <localdir> can be interpreted in several ways:\n" 178dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "\n" 179dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " - If <directory> is not specified, both /system and /data partitions will be updated.\n" 180dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "\n" 181dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " - If it is \"system\" or \"data\", only the corresponding partition\n" 182dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " is updated.\n" 183cd64315f72537359537c66eebe482495ffefba57Tim "\n" 184cd64315f72537359537c66eebe482495ffefba57Tim "environmental variables:\n" 185cd64315f72537359537c66eebe482495ffefba57Tim " ADB_TRACE - Print debug information. A comma separated list of the following values\n" 186cd64315f72537359537c66eebe482495ffefba57Tim " 1 or all, adb, sockets, packets, rwx, usb, sync, sysdeps, transport, jdwp\n" 187cd64315f72537359537c66eebe482495ffefba57Tim " ANDROID_SERIAL - The serial number to connect to. -s takes priority over this if given.\n" 188cd64315f72537359537c66eebe482495ffefba57Tim " ANDROID_LOG_TAGS - When used with the logcat option, only these debug tags are printed.\n" 189dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ); 190dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 191dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 192dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint usage() 193dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 194dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project help(); 195dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 196dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 197dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 198dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef HAVE_TERMIO_H 199dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic struct termios tio_save; 200dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 201dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void stdin_raw_init(int fd) 202dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 203dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct termios tio; 204dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 205dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(tcgetattr(fd, &tio)) return; 206dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(tcgetattr(fd, &tio_save)) return; 207dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 208dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tio.c_lflag = 0; /* disable CANON, ECHO*, etc */ 209dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 210dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* no timeout but request at least one character per read */ 211dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tio.c_cc[VTIME] = 0; 212dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tio.c_cc[VMIN] = 1; 213dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 214dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tcsetattr(fd, TCSANOW, &tio); 215dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tcflush(fd, TCIFLUSH); 216dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 217dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 218dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void stdin_raw_restore(int fd) 219dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 220dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tcsetattr(fd, TCSANOW, &tio_save); 221dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tcflush(fd, TCIFLUSH); 222dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 223dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 224dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 225dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void read_and_dump(int fd) 226dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 227dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char buf[4096]; 228dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int len; 229dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 230dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while(fd >= 0) { 231408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall D("read_and_dump(): pre adb_read(fd=%d)\n", fd); 232dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project len = adb_read(fd, buf, 4096); 233408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall D("read_and_dump(): post adb_read(fd=%d): len=%d\n", fd, len); 234dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(len == 0) { 235dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 236dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 237dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 238dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(len < 0) { 239dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(errno == EINTR) continue; 240dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 241dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 242dd6b36e334809e7a99f0bce45353cdd7e4dac4e1Mike Lockwood fwrite(buf, 1, len, stdout); 243dd6b36e334809e7a99f0bce45353cdd7e4dac4e1Mike Lockwood fflush(stdout); 244dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 245dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 246dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 247d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tatestatic void copy_to_file(int inFd, int outFd) { 2485b811fa5dd00288954f15209a56aea03d5e4a004Christopher Tate const size_t BUFSIZE = 32 * 1024; 2495b811fa5dd00288954f15209a56aea03d5e4a004Christopher Tate char* buf = (char*) malloc(BUFSIZE); 250d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate int len; 251c9cd3b976111d91ede6cd88bd06eb57b10b2f0e7Christopher Tate long total = 0; 252d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate 253d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate D("copy_to_file(%d -> %d)\n", inFd, outFd); 254d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate for (;;) { 2555b811fa5dd00288954f15209a56aea03d5e4a004Christopher Tate len = adb_read(inFd, buf, BUFSIZE); 256d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate if (len == 0) { 2575b811fa5dd00288954f15209a56aea03d5e4a004Christopher Tate D("copy_to_file() : read 0 bytes; exiting\n"); 258d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate break; 259d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate } 260d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate if (len < 0) { 2615b811fa5dd00288954f15209a56aea03d5e4a004Christopher Tate if (errno == EINTR) { 2625b811fa5dd00288954f15209a56aea03d5e4a004Christopher Tate D("copy_to_file() : EINTR, retrying\n"); 2635b811fa5dd00288954f15209a56aea03d5e4a004Christopher Tate continue; 2645b811fa5dd00288954f15209a56aea03d5e4a004Christopher Tate } 265d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate D("copy_to_file() : error %d\n", errno); 266d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate break; 267d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate } 268d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate adb_write(outFd, buf, len); 269c9cd3b976111d91ede6cd88bd06eb57b10b2f0e7Christopher Tate total += len; 270d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate } 271c9cd3b976111d91ede6cd88bd06eb57b10b2f0e7Christopher Tate D("copy_to_file() finished after %lu bytes\n", total); 2725b811fa5dd00288954f15209a56aea03d5e4a004Christopher Tate free(buf); 273d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate} 274d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate 275dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void *stdin_read_thread(void *x) 276dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 277dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int fd, fdi; 278dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project unsigned char buf[1024]; 279dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int r, n; 280dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int state = 0; 281dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 282dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int *fds = (int*) x; 283dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fd = fds[0]; 284dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fdi = fds[1]; 285dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free(fds); 286dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 287dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for(;;) { 288dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* fdi is really the client's stdin, so use read, not adb_read here */ 289408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall D("stdin_read_thread(): pre unix_read(fdi=%d,...)\n", fdi); 290dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r = unix_read(fdi, buf, 1024); 291408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall D("stdin_read_thread(): post unix_read(fdi=%d,...)\n", fdi); 292dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(r == 0) break; 293dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(r < 0) { 294dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(errno == EINTR) continue; 295dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 296dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 29767d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood for(n = 0; n < r; n++){ 29867d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood switch(buf[n]) { 29967d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood case '\n': 30067d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood state = 1; 30167d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood break; 30267d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood case '\r': 30367d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood state = 1; 30467d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood break; 30567d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood case '~': 30667d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood if(state == 1) state++; 30767d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood break; 30867d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood case '.': 30967d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood if(state == 2) { 31067d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood fprintf(stderr,"\n* disconnect *\n"); 31167d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood#ifdef HAVE_TERMIO_H 31267d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood stdin_raw_restore(fdi); 313dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 31467d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood exit(0); 315dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 31667d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood default: 31767d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood state = 0; 318dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 319dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 320dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r = adb_write(fd, buf, r); 321dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(r <= 0) { 322dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 323dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 324dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 325dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 326dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 327dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 328dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint interactive_shell(void) 329dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 330dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_thread_t thr; 331dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int fdi, fd; 332dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int *fds; 333dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 334dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fd = adb_connect("shell:"); 335dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(fd < 0) { 336dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"error: %s\n", adb_error()); 337dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 338dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 339dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fdi = 0; //dup(0); 340dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 341dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fds = malloc(sizeof(int) * 2); 342dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fds[0] = fd; 343dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fds[1] = fdi; 344dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 345dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef HAVE_TERMIO_H 346dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project stdin_raw_init(fdi); 347dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 348dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_thread_create(&thr, stdin_read_thread, fds); 349dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project read_and_dump(fd); 350dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef HAVE_TERMIO_H 351dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project stdin_raw_restore(fdi); 352dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 353dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 354dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 355dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 356dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 357dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void format_host_command(char* buffer, size_t buflen, const char* command, transport_type ttype, const char* serial) 358dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 359dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (serial) { 360dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project snprintf(buffer, buflen, "host-serial:%s:%s", serial, command); 361dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 362dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char* prefix = "host"; 363dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (ttype == kTransportUsb) 364dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project prefix = "host-usb"; 365dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project else if (ttype == kTransportLocal) 366dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project prefix = "host-local"; 367dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 368dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project snprintf(buffer, buflen, "%s:%s", prefix, command); 369dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 370dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 371dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 372447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongkerint adb_download_buffer(const char *service, const void* data, int sz, 373447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker unsigned progress) 374447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker{ 375447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker char buf[4096]; 376447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker unsigned total; 377447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker int fd; 378447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker const unsigned char *ptr; 379447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker 380447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker sprintf(buf,"%s:%d", service, sz); 381447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker fd = adb_connect(buf); 382447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker if(fd < 0) { 383447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker fprintf(stderr,"error: %s\n", adb_error()); 384447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker return -1; 385447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker } 386447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker 387447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker int opt = CHUNK_SIZE; 388447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker opt = setsockopt(fd, SOL_SOCKET, SO_SNDBUF, &opt, sizeof(opt)); 389447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker 390447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker total = sz; 391447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker ptr = data; 392447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker 393447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker if(progress) { 394447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker char *x = strrchr(service, ':'); 395447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker if(x) service = x + 1; 396447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker } 397447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker 398447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker while(sz > 0) { 399447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker unsigned xfer = (sz > CHUNK_SIZE) ? CHUNK_SIZE : sz; 400447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker if(writex(fd, ptr, xfer)) { 401447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker adb_status(fd); 402447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker fprintf(stderr,"* failed to write data '%s' *\n", adb_error()); 403447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker return -1; 404447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker } 405447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker sz -= xfer; 406447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker ptr += xfer; 407447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker if(progress) { 408447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker printf("sending: '%s' %4d%% \r", service, (int)(100LL - ((100LL * sz) / (total)))); 409447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker fflush(stdout); 410447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker } 411447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker } 412447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker if(progress) { 413447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker printf("\n"); 414447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker } 415447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker 416447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker if(readx(fd, buf, 4)){ 417447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker fprintf(stderr,"* error reading response *\n"); 418447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker adb_close(fd); 419447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker return -1; 420447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker } 421447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker if(memcmp(buf, "OKAY", 4)) { 422447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker buf[4] = 0; 423447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker fprintf(stderr,"* error response '%s' *\n", buf); 424447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker adb_close(fd); 425447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker return -1; 426447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker } 427447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker 428447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker adb_close(fd); 429447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker return 0; 430447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker} 431447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker 432447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker 433447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongkerint adb_download(const char *service, const char *fn, unsigned progress) 434447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker{ 435447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker void *data; 436447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker unsigned sz; 437447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker 438447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker data = load_file(fn, &sz); 439447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker if(data == 0) { 440447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker fprintf(stderr,"* cannot read '%s' *\n", service); 441447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker return -1; 442447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker } 443447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker 444447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker int status = adb_download_buffer(service, data, sz, progress); 445447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker free(data); 446447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker return status; 447447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker} 448447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker 449dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void status_window(transport_type ttype, const char* serial) 450dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 451dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char command[4096]; 452dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *state = 0; 453dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *laststate = 0; 454dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 455dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* silence stderr */ 456dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef _WIN32 457dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* XXX: TODO */ 458dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#else 459dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int fd; 460dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fd = unix_open("/dev/null", O_WRONLY); 461dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project dup2(fd, 2); 462dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_close(fd); 463dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 464dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 465dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project format_host_command(command, sizeof command, "get-state", ttype, serial); 466dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 467dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for(;;) { 468dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_sleep_ms(250); 469dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 470dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(state) { 471dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free(state); 472dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project state = 0; 473dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 474dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 475dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project state = adb_query(command); 476dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 477dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(state) { 478dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(laststate && !strcmp(state,laststate)){ 479dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project continue; 480dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 481dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(laststate) free(laststate); 482dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project laststate = strdup(state); 483dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 484dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 485dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 486dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("%c[2J%c[2H", 27, 27); 487dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("Android Debug Bridge\n"); 488dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("State: %s\n", state ? state : "offline"); 489dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fflush(stdout); 490dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 491dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 492dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 493dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/** duplicate string and quote all \ " ( ) chars + space character. */ 494dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic char * 495dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectdupAndQuote(const char *s) 496dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 497dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char *ts; 498dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project size_t alloc_len; 499dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *ret; 500dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *dest; 501dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 502dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ts = s; 503dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 504dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project alloc_len = 0; 505dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 506dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for( ;*ts != '\0'; ts++) { 507dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project alloc_len++; 508dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (*ts == ' ' || *ts == '"' || *ts == '\\' || *ts == '(' || *ts == ')') { 509dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project alloc_len++; 510dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 511dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 512dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 513dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ret = (char *)malloc(alloc_len + 1); 514dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 515dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ts = s; 516dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project dest = ret; 517dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 518dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for ( ;*ts != '\0'; ts++) { 519dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (*ts == ' ' || *ts == '"' || *ts == '\\' || *ts == '(' || *ts == ')') { 520dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *dest++ = '\\'; 521dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 522dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 523dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *dest++ = *ts; 524dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 525dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 526dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *dest++ = '\0'; 527dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 528dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return ret; 529dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 530dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 531dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/** 532dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Run ppp in "notty" mode against a resource listed as the first parameter 533dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * eg: 534dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 535dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * ppp dev:/dev/omap_csmi_tty0 <ppp options> 536dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 537dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 538dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint ppp(int argc, char **argv) 539dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 540dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef HAVE_WIN32_PROC 541dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "error: adb %s not implemented on Win32\n", argv[0]); 542dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 543dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#else 544dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *adb_service_name; 545dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pid_t pid; 546dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int fd; 547dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 548dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (argc < 2) { 549dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "usage: adb %s <adb service name> [ppp opts]\n", 550dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argv[0]); 551dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 552dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 553dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 554dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 555dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_service_name = argv[1]; 556dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 557dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fd = adb_connect(adb_service_name); 558dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 559dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(fd < 0) { 560dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"Error: Could not open adb service: %s. Error: %s\n", 561dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_service_name, adb_error()); 562dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 563dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 564dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 565dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pid = fork(); 566dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 567dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (pid < 0) { 568dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project perror("from fork()"); 569dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 570dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if (pid == 0) { 571dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int err; 572dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int i; 573dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char **ppp_args; 574dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 575dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // copy args 576dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ppp_args = (const char **) alloca(sizeof(char *) * argc + 1); 577dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ppp_args[0] = "pppd"; 578dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for (i = 2 ; i < argc ; i++) { 579dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project //argv[2] and beyond become ppp_args[1] and beyond 580dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ppp_args[i - 1] = argv[i]; 581dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 582dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ppp_args[i-1] = NULL; 583dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 584dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // child side 585dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 586dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project dup2(fd, STDIN_FILENO); 587dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project dup2(fd, STDOUT_FILENO); 588dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_close(STDERR_FILENO); 589dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_close(fd); 590dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 591dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project err = execvp("pppd", (char * const *)ppp_args); 592dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 593dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (err < 0) { 594dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project perror("execing pppd"); 595dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 596dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project exit(-1); 597dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 598dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // parent side 599dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 600dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_close(fd); 601dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 602dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 603dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif /* !HAVE_WIN32_PROC */ 604dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 605dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 606dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int send_shellcommand(transport_type transport, char* serial, char* buf) 607dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 608dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int fd, ret; 609dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 610dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for(;;) { 611dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fd = adb_connect(buf); 612dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(fd >= 0) 613dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 614dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"- waiting for device -\n"); 615dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_sleep_ms(1000); 616dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project do_cmd(transport, serial, "wait-for-device", 0); 617dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 618dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 619dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project read_and_dump(fd); 620dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ret = adb_close(fd); 621dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (ret) 622dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project perror("close"); 623dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 624dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return ret; 625dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 626dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 627dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int logcat(transport_type transport, char* serial, int argc, char **argv) 628dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 629dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char buf[4096]; 630dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 631dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *log_tags; 632dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *quoted_log_tags; 633dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 634dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project log_tags = getenv("ANDROID_LOG_TAGS"); 635dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project quoted_log_tags = dupAndQuote(log_tags == NULL ? "" : log_tags); 636dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 637dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project snprintf(buf, sizeof(buf), 638dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "shell:export ANDROID_LOG_TAGS=\"\%s\" ; exec logcat", 639dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project quoted_log_tags); 640dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 641dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free(quoted_log_tags); 642dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 643db0a880c4682a90ddf078f03a0e709ddda07a2fdChristopher Tate if (!strcmp(argv[0],"longcat")) { 644db0a880c4682a90ddf078f03a0e709ddda07a2fdChristopher Tate strncat(buf, " -v long", sizeof(buf)-1); 645db0a880c4682a90ddf078f03a0e709ddda07a2fdChristopher Tate } 646db0a880c4682a90ddf078f03a0e709ddda07a2fdChristopher Tate 647dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argc -= 1; 648dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argv += 1; 649dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while(argc-- > 0) { 650dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *quoted; 651dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 652dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project quoted = dupAndQuote (*argv++); 653dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 654dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strncat(buf, " ", sizeof(buf)-1); 655dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strncat(buf, quoted, sizeof(buf)-1); 656dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free(quoted); 657dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 658dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 659dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project send_shellcommand(transport, serial, buf); 660dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 661dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 662dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 663b1dfffe6bb506313a3bc9146d2f6f8c533213193Christopher Tatestatic int mkdirs(char *path) 664b1dfffe6bb506313a3bc9146d2f6f8c533213193Christopher Tate{ 665b1dfffe6bb506313a3bc9146d2f6f8c533213193Christopher Tate int ret; 666b1dfffe6bb506313a3bc9146d2f6f8c533213193Christopher Tate char *x = path + 1; 667b1dfffe6bb506313a3bc9146d2f6f8c533213193Christopher Tate 668b1dfffe6bb506313a3bc9146d2f6f8c533213193Christopher Tate for(;;) { 669b1dfffe6bb506313a3bc9146d2f6f8c533213193Christopher Tate x = adb_dirstart(x); 670b1dfffe6bb506313a3bc9146d2f6f8c533213193Christopher Tate if(x == 0) return 0; 671b1dfffe6bb506313a3bc9146d2f6f8c533213193Christopher Tate *x = 0; 672b1dfffe6bb506313a3bc9146d2f6f8c533213193Christopher Tate ret = adb_mkdir(path, 0775); 673b1dfffe6bb506313a3bc9146d2f6f8c533213193Christopher Tate *x = OS_PATH_SEPARATOR; 674b1dfffe6bb506313a3bc9146d2f6f8c533213193Christopher Tate if((ret < 0) && (errno != EEXIST)) { 675b1dfffe6bb506313a3bc9146d2f6f8c533213193Christopher Tate return ret; 676b1dfffe6bb506313a3bc9146d2f6f8c533213193Christopher Tate } 677b1dfffe6bb506313a3bc9146d2f6f8c533213193Christopher Tate x++; 678b1dfffe6bb506313a3bc9146d2f6f8c533213193Christopher Tate } 679b1dfffe6bb506313a3bc9146d2f6f8c533213193Christopher Tate return 0; 680b1dfffe6bb506313a3bc9146d2f6f8c533213193Christopher Tate} 681b1dfffe6bb506313a3bc9146d2f6f8c533213193Christopher Tate 682d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tatestatic int backup(int argc, char** argv) { 683d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate char buf[4096]; 684b1dfffe6bb506313a3bc9146d2f6f8c533213193Christopher Tate char default_name[32]; 685b1dfffe6bb506313a3bc9146d2f6f8c533213193Christopher Tate const char* filename = strcpy(default_name, "./backup.ab"); 686d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate int fd, outFd; 687c9cd3b976111d91ede6cd88bd06eb57b10b2f0e7Christopher Tate int i, j; 688d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate 689c9cd3b976111d91ede6cd88bd06eb57b10b2f0e7Christopher Tate /* find, extract, and use any -f argument */ 690c9cd3b976111d91ede6cd88bd06eb57b10b2f0e7Christopher Tate for (i = 1; i < argc; i++) { 691c9cd3b976111d91ede6cd88bd06eb57b10b2f0e7Christopher Tate if (!strcmp("-f", argv[i])) { 692c9cd3b976111d91ede6cd88bd06eb57b10b2f0e7Christopher Tate if (i == argc-1) { 693c9cd3b976111d91ede6cd88bd06eb57b10b2f0e7Christopher Tate fprintf(stderr, "adb: -f passed with no filename\n"); 694c9cd3b976111d91ede6cd88bd06eb57b10b2f0e7Christopher Tate return usage(); 695c9cd3b976111d91ede6cd88bd06eb57b10b2f0e7Christopher Tate } 696c9cd3b976111d91ede6cd88bd06eb57b10b2f0e7Christopher Tate filename = argv[i+1]; 697c9cd3b976111d91ede6cd88bd06eb57b10b2f0e7Christopher Tate for (j = i+2; j <= argc; ) { 698c9cd3b976111d91ede6cd88bd06eb57b10b2f0e7Christopher Tate argv[i++] = argv[j++]; 699c9cd3b976111d91ede6cd88bd06eb57b10b2f0e7Christopher Tate } 700c9cd3b976111d91ede6cd88bd06eb57b10b2f0e7Christopher Tate argc -= 2; 701c9cd3b976111d91ede6cd88bd06eb57b10b2f0e7Christopher Tate argv[argc] = NULL; 702c9cd3b976111d91ede6cd88bd06eb57b10b2f0e7Christopher Tate } 703d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate } 704d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate 705bb86bc5892374f3a41784135bebc7ada3270c8c1Christopher Tate /* bare "adb backup" or "adb backup -f filename" are not valid invocations */ 706bb86bc5892374f3a41784135bebc7ada3270c8c1Christopher Tate if (argc < 2) return usage(); 707bb86bc5892374f3a41784135bebc7ada3270c8c1Christopher Tate 708b1dfffe6bb506313a3bc9146d2f6f8c533213193Christopher Tate adb_unlink(filename); 709b1dfffe6bb506313a3bc9146d2f6f8c533213193Christopher Tate mkdirs((char *)filename); 710b1dfffe6bb506313a3bc9146d2f6f8c533213193Christopher Tate outFd = adb_creat(filename, 0640); 711d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate if (outFd < 0) { 712d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate fprintf(stderr, "adb: unable to open file %s\n", filename); 713d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate return -1; 714d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate } 715d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate 716d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate snprintf(buf, sizeof(buf), "backup"); 717d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate for (argc--, argv++; argc; argc--, argv++) { 718d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate strncat(buf, ":", sizeof(buf) - strlen(buf) - 1); 719d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate strncat(buf, argv[0], sizeof(buf) - strlen(buf) - 1); 720d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate } 721d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate 722d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate D("backup. filename=%s buf=%s\n", filename, buf); 723d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate fd = adb_connect(buf); 724d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate if (fd < 0) { 725d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate fprintf(stderr, "adb: unable to connect for backup\n"); 726d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate adb_close(outFd); 727d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate return -1; 728d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate } 729d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate 730bffa4ca9ad2702d51f5b391b7a05be0c7c691e4eChristopher Tate printf("Now unlock your device and confirm the backup operation.\n"); 731d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate copy_to_file(fd, outFd); 732d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate 733d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate adb_close(fd); 734d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate adb_close(outFd); 735d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate return 0; 736d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate} 737d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate 738702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tatestatic int restore(int argc, char** argv) { 739702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate const char* filename; 740702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate int fd, tarFd; 741702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate 742702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate if (argc != 2) return usage(); 743702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate 744702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate filename = argv[1]; 745702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate tarFd = adb_open(filename, O_RDONLY); 746702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate if (tarFd < 0) { 747702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate fprintf(stderr, "adb: unable to open file %s\n", filename); 748702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate return -1; 749702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate } 750702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate 751702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate fd = adb_connect("restore:"); 752702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate if (fd < 0) { 753702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate fprintf(stderr, "adb: unable to connect for backup\n"); 754702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate adb_close(tarFd); 755702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate return -1; 756702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate } 757702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate 758bffa4ca9ad2702d51f5b391b7a05be0c7c691e4eChristopher Tate printf("Now unlock your device and confirm the restore operation.\n"); 759702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate copy_to_file(tarFd, fd); 760702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate 761702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate adb_close(fd); 762702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate adb_close(tarFd); 763702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate return 0; 764702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate} 765702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate 766dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define SENTINEL_FILE "config" OS_PATH_SEPARATOR_STR "envsetup.make" 767dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int top_works(const char *top) 768dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 769dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (top != NULL && adb_is_absolute_host_path(top)) { 770dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char path_buf[PATH_MAX]; 771dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project snprintf(path_buf, sizeof(path_buf), 772dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "%s" OS_PATH_SEPARATOR_STR SENTINEL_FILE, top); 773dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return access(path_buf, F_OK) == 0; 774dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 775dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 776dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 777dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 778dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic char *find_top_from(const char *indir, char path_buf[PATH_MAX]) 779dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 780dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strcpy(path_buf, indir); 781dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while (1) { 782dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (top_works(path_buf)) { 783dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return path_buf; 784dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 785dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *s = adb_dirstop(path_buf); 786dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (s != NULL) { 787dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *s = '\0'; 788dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 789dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project path_buf[0] = '\0'; 790dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return NULL; 791dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 792dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 793dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 794dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 795dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic char *find_top(char path_buf[PATH_MAX]) 796dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 797dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *top = getenv("ANDROID_BUILD_TOP"); 798dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (top != NULL && top[0] != '\0') { 799dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!top_works(top)) { 800dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "adb: bad ANDROID_BUILD_TOP value \"%s\"\n", top); 801dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return NULL; 802dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 803dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 804dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project top = getenv("TOP"); 805dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (top != NULL && top[0] != '\0') { 806dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!top_works(top)) { 807dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "adb: bad TOP value \"%s\"\n", top); 808dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return NULL; 809dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 810dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 811dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project top = NULL; 812dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 813dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 814dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 815dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (top != NULL) { 816dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* The environment pointed to a top directory that works. 817dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 818dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strcpy(path_buf, top); 819dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return path_buf; 820dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 821dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 822dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* The environment didn't help. Walk up the tree from the CWD 823dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * to see if we can find the top. 824dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 825dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char dir[PATH_MAX]; 826dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project top = find_top_from(getcwd(dir, sizeof(dir)), path_buf); 827dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (top == NULL) { 828dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* If the CWD isn't under a good-looking top, see if the 829dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * executable is. 830dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 8313166410a82f43d39201be98a8d35c51baa86cb53Alexey Tarasov get_my_path(dir, PATH_MAX); 832dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project top = find_top_from(dir, path_buf); 833dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 834dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return top; 835dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 836dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 837dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* <hint> may be: 838dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * - A simple product name 839dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * e.g., "sooner" 840dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectTODO: debug? sooner-debug, sooner:debug? 841dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * - A relative path from the CWD to the ANDROID_PRODUCT_OUT dir 842dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * e.g., "out/target/product/sooner" 843dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * - An absolute path to the PRODUCT_OUT dir 844dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * e.g., "/src/device/out/target/product/sooner" 845dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 846dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Given <hint>, try to construct an absolute path to the 847dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * ANDROID_PRODUCT_OUT dir. 848dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 849dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic const char *find_product_out_path(const char *hint) 850dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 851dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project static char path_buf[PATH_MAX]; 852dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 853dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (hint == NULL || hint[0] == '\0') { 854dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return NULL; 855dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 856dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 857dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* If it's already absolute, don't bother doing any work. 858dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 859dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (adb_is_absolute_host_path(hint)) { 860dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strcpy(path_buf, hint); 861dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return path_buf; 862dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 863dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 864dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* If there are any slashes in it, assume it's a relative path; 865dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * make it absolute. 866dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 867dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (adb_dirstart(hint) != NULL) { 868dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (getcwd(path_buf, sizeof(path_buf)) == NULL) { 869dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "adb: Couldn't get CWD: %s\n", strerror(errno)); 870dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return NULL; 871dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 872dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (strlen(path_buf) + 1 + strlen(hint) >= sizeof(path_buf)) { 873dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "adb: Couldn't assemble path\n"); 874dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return NULL; 875dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 876dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strcat(path_buf, OS_PATH_SEPARATOR_STR); 877dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strcat(path_buf, hint); 878dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return path_buf; 879dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 880dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 881dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* It's a string without any slashes. Try to do something with it. 882dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 883dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Try to find the root of the build tree, and build a PRODUCT_OUT 884dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * path from there. 885dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 886dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char top_buf[PATH_MAX]; 887dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char *top = find_top(top_buf); 888dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (top == NULL) { 889dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "adb: Couldn't find top of build tree\n"); 890dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return NULL; 891dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 892dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project//TODO: if we have a way to indicate debug, look in out/debug/target/... 893dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project snprintf(path_buf, sizeof(path_buf), 894dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "%s" OS_PATH_SEPARATOR_STR 895dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "out" OS_PATH_SEPARATOR_STR 896dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "target" OS_PATH_SEPARATOR_STR 897dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "product" OS_PATH_SEPARATOR_STR 898dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "%s", top_buf, hint); 899dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (access(path_buf, F_OK) < 0) { 900dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "adb: Couldn't find a product dir " 901dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "based on \"-p %s\"; \"%s\" doesn't exist\n", hint, path_buf); 902dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return NULL; 903dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 904dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return path_buf; 905dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 906dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 907dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint adb_commandline(int argc, char **argv) 908dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 909dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char buf[4096]; 910dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int no_daemon = 0; 911dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int is_daemon = 0; 912305b4b0f6069d733d3023a57fdc8a6d9cf7de2a6David 'Digit' Turner int is_server = 0; 913dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int persist = 0; 914dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int r; 915dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int quote; 916dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project transport_type ttype = kTransportAny; 917dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char* serial = NULL; 918a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger char* server_port_str = NULL; 919dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 920dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* If defined, this should be an absolute path to 921dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * the directory containing all of the various system images 922dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * for a particular product. If not defined, and the adb 923dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * command requires this information, then the user must 924dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * specify the path using "-p". 925dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 926dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project gProductOutPath = getenv("ANDROID_PRODUCT_OUT"); 927dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (gProductOutPath == NULL || gProductOutPath[0] == '\0') { 928dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project gProductOutPath = NULL; 929dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 930dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // TODO: also try TARGET_PRODUCT/TARGET_DEVICE as a hint 931dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 932db4492640313be9d3fd65ee5bd7648a9570411bbNick Pelly serial = getenv("ANDROID_SERIAL"); 933db4492640313be9d3fd65ee5bd7648a9570411bbNick Pelly 934a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger /* Validate and assign the server port */ 935a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger server_port_str = getenv("ANDROID_ADB_SERVER_PORT"); 936a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger int server_port = DEFAULT_ADB_PORT; 937a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger if (server_port_str && strlen(server_port_str) > 0) { 938a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger server_port = (int) strtol(server_port_str, NULL, 0); 939a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger if (server_port <= 0) { 940a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger fprintf(stderr, 941a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger "adb: Env var ANDROID_ADB_SERVER_PORT must be a positive number. Got \"%s\"\n", 942a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger server_port_str); 943a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger return usage(); 944a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger } 945a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger } 946a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger 947a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger /* modifiers and flags */ 948dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while(argc > 0) { 949305b4b0f6069d733d3023a57fdc8a6d9cf7de2a6David 'Digit' Turner if(!strcmp(argv[0],"server")) { 950305b4b0f6069d733d3023a57fdc8a6d9cf7de2a6David 'Digit' Turner is_server = 1; 951305b4b0f6069d733d3023a57fdc8a6d9cf7de2a6David 'Digit' Turner } else if(!strcmp(argv[0],"nodaemon")) { 952dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project no_daemon = 1; 953dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if (!strcmp(argv[0], "fork-server")) { 954dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* this is a special flag used only when the ADB client launches the ADB Server */ 955dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project is_daemon = 1; 956dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if(!strcmp(argv[0],"persist")) { 957dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project persist = 1; 958dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if(!strncmp(argv[0], "-p", 2)) { 959dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char *product = NULL; 960dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (argv[0][2] == '\0') { 961dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (argc < 2) return usage(); 962dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project product = argv[1]; 963dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argc--; 964dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argv++; 965dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 966dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project product = argv[1] + 2; 967dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 968dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project gProductOutPath = find_product_out_path(product); 969dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (gProductOutPath == NULL) { 970dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "adb: could not resolve \"-p %s\"\n", 971dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project product); 972dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return usage(); 973dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 974dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if (argv[0][0]=='-' && argv[0][1]=='s') { 975dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (isdigit(argv[0][2])) { 976dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project serial = argv[0] + 2; 977dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 978a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger if(argc < 2 || argv[0][2] != '\0') return usage(); 979dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project serial = argv[1]; 980dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argc--; 981dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argv++; 982dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 983dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if (!strcmp(argv[0],"-d")) { 984dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ttype = kTransportUsb; 985dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if (!strcmp(argv[0],"-e")) { 986dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ttype = kTransportLocal; 987dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 988dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* out of recognized modifiers and flags */ 989dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 990dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 991dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argc--; 992dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argv++; 993dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 994dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 995dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_set_transport(ttype, serial); 996a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger adb_set_tcp_specifics(server_port); 997dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 998305b4b0f6069d733d3023a57fdc8a6d9cf7de2a6David 'Digit' Turner if (is_server) { 999dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (no_daemon || is_daemon) { 1000a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger r = adb_main(is_daemon, server_port); 1001dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 1002a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger r = launch_server(server_port); 1003dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1004dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(r) { 1005dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"* could not start server *\n"); 1006dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1007dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return r; 1008dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1009dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1010dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttop: 1011dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(argc == 0) { 1012dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return usage(); 1013dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1014dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1015dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* adb_connect() commands */ 1016dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1017dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(argv[0], "devices")) { 1018dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *tmp; 1019dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project snprintf(buf, sizeof buf, "host:%s", argv[0]); 1020dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tmp = adb_query(buf); 1021dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(tmp) { 1022dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("List of devices attached \n"); 1023dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("%s\n", tmp); 1024dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 1025dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 1026dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 1027dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1028dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1029dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1030cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood if(!strcmp(argv[0], "connect")) { 1031ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood char *tmp; 1032ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood if (argc != 2) { 1033cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood fprintf(stderr, "Usage: adb connect <host>[:<port>]\n"); 1034ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood return 1; 1035ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood } 1036cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood snprintf(buf, sizeof buf, "host:connect:%s", argv[1]); 1037cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood tmp = adb_query(buf); 1038cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood if(tmp) { 1039cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood printf("%s\n", tmp); 1040cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood return 0; 1041cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood } else { 1042cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood return 1; 1043cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood } 1044cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood } 1045cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood 1046cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood if(!strcmp(argv[0], "disconnect")) { 1047cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood char *tmp; 1048cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood if (argc > 2) { 1049cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood fprintf(stderr, "Usage: adb disconnect [<host>[:<port>]]\n"); 1050cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood return 1; 1051cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood } 1052cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood if (argc == 2) { 1053cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood snprintf(buf, sizeof buf, "host:disconnect:%s", argv[1]); 1054cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood } else { 1055cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood snprintf(buf, sizeof buf, "host:disconnect:"); 1056cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood } 1057ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood tmp = adb_query(buf); 1058ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood if(tmp) { 1059ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood printf("%s\n", tmp); 1060ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood return 0; 1061ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood } else { 1062ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood return 1; 1063ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood } 1064ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood } 1065ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood 1066dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!strcmp(argv[0], "emu")) { 1067dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return adb_send_emulator_command(argc, argv); 1068dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1069dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1070ff91ab855b84cdcf110f1a899320d3920e7c55a5Daniel Sandler if(!strcmp(argv[0], "shell") || !strcmp(argv[0], "hell")) { 1071dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int r; 1072dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int fd; 1073dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1074ff91ab855b84cdcf110f1a899320d3920e7c55a5Daniel Sandler char h = (argv[0][0] == 'h'); 1075ff91ab855b84cdcf110f1a899320d3920e7c55a5Daniel Sandler 1076ff91ab855b84cdcf110f1a899320d3920e7c55a5Daniel Sandler if (h) { 1077ff91ab855b84cdcf110f1a899320d3920e7c55a5Daniel Sandler printf("\x1b[41;33m"); 1078ff91ab855b84cdcf110f1a899320d3920e7c55a5Daniel Sandler fflush(stdout); 1079ff91ab855b84cdcf110f1a899320d3920e7c55a5Daniel Sandler } 1080ff91ab855b84cdcf110f1a899320d3920e7c55a5Daniel Sandler 1081dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(argc < 2) { 1082408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall D("starting interactive shell\n"); 1083ff91ab855b84cdcf110f1a899320d3920e7c55a5Daniel Sandler r = interactive_shell(); 1084ff91ab855b84cdcf110f1a899320d3920e7c55a5Daniel Sandler if (h) { 1085ff91ab855b84cdcf110f1a899320d3920e7c55a5Daniel Sandler printf("\x1b[0m"); 1086ff91ab855b84cdcf110f1a899320d3920e7c55a5Daniel Sandler fflush(stdout); 1087ff91ab855b84cdcf110f1a899320d3920e7c55a5Daniel Sandler } 1088ff91ab855b84cdcf110f1a899320d3920e7c55a5Daniel Sandler return r; 1089dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1090dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1091dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project snprintf(buf, sizeof buf, "shell:%s", argv[1]); 1092dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argc -= 2; 1093dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argv += 2; 1094dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while(argc-- > 0) { 1095dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strcat(buf, " "); 1096dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1097dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* quote empty strings and strings with spaces */ 1098dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project quote = (**argv == 0 || strchr(*argv, ' ')); 1099dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (quote) 1100a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger strcat(buf, "\""); 1101dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strcat(buf, *argv++); 1102dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (quote) 1103a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger strcat(buf, "\""); 1104dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1105dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1106dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for(;;) { 1107408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall D("interactive shell loop. buff=%s\n", buf); 1108dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fd = adb_connect(buf); 1109dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(fd >= 0) { 1110408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall D("about to read_and_dump(fd=%d)\n", fd); 1111dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project read_and_dump(fd); 1112408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall D("read_and_dump() done.\n"); 1113dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_close(fd); 1114dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r = 0; 1115dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 1116dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"error: %s\n", adb_error()); 1117dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r = -1; 1118dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1119dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1120dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(persist) { 1121dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"\n- waiting for device -\n"); 1122dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_sleep_ms(1000); 1123dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project do_cmd(ttype, serial, "wait-for-device", 0); 1124dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 1125ff91ab855b84cdcf110f1a899320d3920e7c55a5Daniel Sandler if (h) { 1126ff91ab855b84cdcf110f1a899320d3920e7c55a5Daniel Sandler printf("\x1b[0m"); 1127ff91ab855b84cdcf110f1a899320d3920e7c55a5Daniel Sandler fflush(stdout); 1128ff91ab855b84cdcf110f1a899320d3920e7c55a5Daniel Sandler } 1129408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall D("interactive shell loop. return r=%d\n", r); 1130dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return r; 1131dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1132dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1133dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1134dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1135dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(argv[0], "kill-server")) { 1136dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int fd; 1137dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fd = _adb_connect("host:kill"); 1138dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(fd == -1) { 1139dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"* server not running *\n"); 1140dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 1141dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1142dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 1143dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1144dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1145447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker if(!strcmp(argv[0], "sideload")) { 1146447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker if(argc != 2) return usage(); 1147447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker if(adb_download("sideload", argv[1], 1)) { 1148447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker return 1; 1149447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker } else { 1150447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker return 0; 1151447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker } 1152447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker } 1153447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker 1154ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood if(!strcmp(argv[0], "remount") || !strcmp(argv[0], "reboot") 1155311add489e4a1712d201c3b83fa364d5569e6788Romain Guy || !strcmp(argv[0], "reboot-bootloader") 1156ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood || !strcmp(argv[0], "tcpip") || !strcmp(argv[0], "usb") 1157f56d1b5a76c6cb282a7689fc93f85de63bd205f6Mike Lockwood || !strcmp(argv[0], "root")) { 1158ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood char command[100]; 1159311add489e4a1712d201c3b83fa364d5569e6788Romain Guy if (!strcmp(argv[0], "reboot-bootloader")) 1160311add489e4a1712d201c3b83fa364d5569e6788Romain Guy snprintf(command, sizeof(command), "reboot:bootloader"); 1161311add489e4a1712d201c3b83fa364d5569e6788Romain Guy else if (argc > 1) 1162ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood snprintf(command, sizeof(command), "%s:%s", argv[0], argv[1]); 1163ee15662140632672a6878787a1ff26f5ebdc1e68Mike Lockwood else 1164ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood snprintf(command, sizeof(command), "%s:", argv[0]); 1165ff19670d485fd5ee296e23b00b035ac22975c647Mike Lockwood int fd = adb_connect(command); 1166e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project if(fd >= 0) { 1167e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project read_and_dump(fd); 1168e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project adb_close(fd); 1169e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project return 0; 1170e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project } 1171e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project fprintf(stderr,"error: %s\n", adb_error()); 1172e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project return 1; 1173e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project } 1174e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project 1175f56d1b5a76c6cb282a7689fc93f85de63bd205f6Mike Lockwood if(!strcmp(argv[0], "bugreport")) { 1176c130ea7c29b0149939c8fd6b8da2c981944636f9Dan Egnor if (argc != 1) return usage(); 1177c130ea7c29b0149939c8fd6b8da2c981944636f9Dan Egnor do_cmd(ttype, serial, "shell", "bugreport", 0); 1178f56d1b5a76c6cb282a7689fc93f85de63bd205f6Mike Lockwood return 0; 1179f56d1b5a76c6cb282a7689fc93f85de63bd205f6Mike Lockwood } 1180f56d1b5a76c6cb282a7689fc93f85de63bd205f6Mike Lockwood 1181dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* adb_command() wrapper commands */ 1182dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1183dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strncmp(argv[0], "wait-for-", strlen("wait-for-"))) { 1184dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char* service = argv[0]; 1185dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!strncmp(service, "wait-for-device", strlen("wait-for-device"))) { 1186dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (ttype == kTransportUsb) { 1187dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project service = "wait-for-usb"; 1188dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if (ttype == kTransportLocal) { 1189dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project service = "wait-for-local"; 1190dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 1191dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project service = "wait-for-any"; 1192dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1193dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1194dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1195dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project format_host_command(buf, sizeof buf, service, ttype, serial); 1196dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1197dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (adb_command(buf)) { 1198dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project D("failure: %s *\n",adb_error()); 1199dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"error: %s\n", adb_error()); 1200dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 1201dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1202dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1203dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* Allow a command to be run after wait-for-device, 1204dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * e.g. 'adb wait-for-device shell'. 1205dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 1206dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(argc > 1) { 1207dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argc--; 1208dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argv++; 1209dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project goto top; 1210dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1211dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 1212dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1213dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1214dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(argv[0], "forward")) { 1215dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(argc != 3) return usage(); 1216dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (serial) { 121764e99545d4b5600bb5ca044fcad636ae8389b381Mike Lockwood snprintf(buf, sizeof buf, "host-serial:%s:forward:%s;%s",serial, argv[1], argv[2]); 121864e99545d4b5600bb5ca044fcad636ae8389b381Mike Lockwood } else if (ttype == kTransportUsb) { 121964e99545d4b5600bb5ca044fcad636ae8389b381Mike Lockwood snprintf(buf, sizeof buf, "host-usb:forward:%s;%s", argv[1], argv[2]); 122064e99545d4b5600bb5ca044fcad636ae8389b381Mike Lockwood } else if (ttype == kTransportLocal) { 122164e99545d4b5600bb5ca044fcad636ae8389b381Mike Lockwood snprintf(buf, sizeof buf, "host-local:forward:%s;%s", argv[1], argv[2]); 1222dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 122364e99545d4b5600bb5ca044fcad636ae8389b381Mike Lockwood snprintf(buf, sizeof buf, "host:forward:%s;%s", argv[1], argv[2]); 1224dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1225dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(adb_command(buf)) { 1226dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"error: %s\n", adb_error()); 1227dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 1228dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1229dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 1230dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1231dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1232dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* do_sync_*() commands */ 1233dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1234dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(argv[0], "ls")) { 1235dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(argc != 2) return usage(); 1236dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return do_sync_ls(argv[1]); 1237dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1238dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1239dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(argv[0], "push")) { 1240dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(argc != 3) return usage(); 1241dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return do_sync_push(argv[1], argv[2], 0 /* no verify APK */); 1242dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1243dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1244dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(argv[0], "pull")) { 124500c0eeac6be1597ce24fccf8e2afaaffab223cb3Joe Onorato if (argc == 2) { 124600c0eeac6be1597ce24fccf8e2afaaffab223cb3Joe Onorato return do_sync_pull(argv[1], "."); 124700c0eeac6be1597ce24fccf8e2afaaffab223cb3Joe Onorato } else if (argc == 3) { 124800c0eeac6be1597ce24fccf8e2afaaffab223cb3Joe Onorato return do_sync_pull(argv[1], argv[2]); 124900c0eeac6be1597ce24fccf8e2afaaffab223cb3Joe Onorato } else { 125000c0eeac6be1597ce24fccf8e2afaaffab223cb3Joe Onorato return usage(); 125100c0eeac6be1597ce24fccf8e2afaaffab223cb3Joe Onorato } 1252dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1253dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1254dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(argv[0], "install")) { 1255dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (argc < 2) return usage(); 1256dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return install_app(ttype, serial, argc, argv); 1257dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1258dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1259dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(argv[0], "uninstall")) { 1260dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (argc < 2) return usage(); 1261dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return uninstall_app(ttype, serial, argc, argv); 1262dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1263dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1264dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(argv[0], "sync")) { 1265dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *srcarg, *android_srcpath, *data_srcpath; 1266705c944c0e2a50150ffb41707b6b3daebb45cf79Anthony Newnam int listonly = 0; 1267705c944c0e2a50150ffb41707b6b3daebb45cf79Anthony Newnam 1268dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int ret; 1269dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(argc < 2) { 1270dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* No local path was specified. */ 1271dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project srcarg = NULL; 1272705c944c0e2a50150ffb41707b6b3daebb45cf79Anthony Newnam } else if (argc >= 2 && strcmp(argv[1], "-l") == 0) { 1273705c944c0e2a50150ffb41707b6b3daebb45cf79Anthony Newnam listonly = 1; 1274705c944c0e2a50150ffb41707b6b3daebb45cf79Anthony Newnam if (argc == 3) { 1275705c944c0e2a50150ffb41707b6b3daebb45cf79Anthony Newnam srcarg = argv[2]; 1276705c944c0e2a50150ffb41707b6b3daebb45cf79Anthony Newnam } else { 1277705c944c0e2a50150ffb41707b6b3daebb45cf79Anthony Newnam srcarg = NULL; 1278705c944c0e2a50150ffb41707b6b3daebb45cf79Anthony Newnam } 1279dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if(argc == 2) { 1280dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* A local path or "android"/"data" arg was specified. */ 1281dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project srcarg = argv[1]; 1282dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 1283dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return usage(); 1284dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1285dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ret = find_sync_dirs(srcarg, &android_srcpath, &data_srcpath); 1286dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(ret != 0) return usage(); 1287dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1288dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(android_srcpath != NULL) 1289705c944c0e2a50150ffb41707b6b3daebb45cf79Anthony Newnam ret = do_sync_sync(android_srcpath, "/system", listonly); 1290dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(ret == 0 && data_srcpath != NULL) 1291705c944c0e2a50150ffb41707b6b3daebb45cf79Anthony Newnam ret = do_sync_sync(data_srcpath, "/data", listonly); 1292dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1293dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free(android_srcpath); 1294dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free(data_srcpath); 1295dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return ret; 1296dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1297dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1298dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* passthrough commands */ 1299dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1300dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(argv[0],"get-state") || 1301dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project !strcmp(argv[0],"get-serialno")) 1302dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { 1303dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *tmp; 1304dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1305dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project format_host_command(buf, sizeof buf, argv[0], ttype, serial); 1306dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tmp = adb_query(buf); 1307dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(tmp) { 1308dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("%s\n", tmp); 1309dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 1310dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 1311dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 1312dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1313dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1314dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1315dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* other commands */ 1316dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1317dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(argv[0],"status-window")) { 1318dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project status_window(ttype, serial); 1319dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 1320dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1321dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1322db0a880c4682a90ddf078f03a0e709ddda07a2fdChristopher Tate if(!strcmp(argv[0],"logcat") || !strcmp(argv[0],"lolcat") || !strcmp(argv[0],"longcat")) { 1323dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return logcat(ttype, serial, argc, argv); 1324dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1325dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1326dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(argv[0],"ppp")) { 1327dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return ppp(argc, argv); 1328dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1329dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1330dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!strcmp(argv[0], "start-server")) { 1331dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return adb_connect("host:start-server"); 1332dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1333dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1334d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate if (!strcmp(argv[0], "backup")) { 1335d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate return backup(argc, argv); 1336d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate } 1337d2f5415c603f7d9961f7a0b05579a0768e071410Christopher Tate 1338702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate if (!strcmp(argv[0], "restore")) { 1339702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate return restore(argc, argv); 1340702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate } 1341702967afb1bebc97c0b8a23c075d4932820ef7a3Christopher Tate 1342dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!strcmp(argv[0], "jdwp")) { 1343dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int fd = adb_connect("jdwp"); 1344dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (fd >= 0) { 1345dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project read_and_dump(fd); 1346dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_close(fd); 1347dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 1348dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 1349dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "error: %s\n", adb_error()); 1350dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 1351dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1352dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1353dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1354dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* "adb /?" is a common idiom under Windows */ 1355dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(argv[0], "help") || !strcmp(argv[0], "/?")) { 1356dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project help(); 1357dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 1358dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1359dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1360dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(argv[0], "version")) { 1361dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project version(stdout); 1362dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 1363dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1364dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1365dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project usage(); 1366dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 1367dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 1368dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1369dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int do_cmd(transport_type ttype, char* serial, char *cmd, ...) 1370dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 1371dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *argv[16]; 1372dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int argc; 1373dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project va_list ap; 1374dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1375dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project va_start(ap, cmd); 1376dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argc = 0; 1377dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1378dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (serial) { 1379dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argv[argc++] = "-s"; 1380dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argv[argc++] = serial; 1381dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if (ttype == kTransportUsb) { 1382dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argv[argc++] = "-d"; 1383dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if (ttype == kTransportLocal) { 1384dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argv[argc++] = "-e"; 1385dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1386dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1387dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argv[argc++] = cmd; 1388dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while((argv[argc] = va_arg(ap, char*)) != 0) argc++; 1389dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project va_end(ap); 1390dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1391dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if 0 1392dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int n; 1393dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"argc = %d\n",argc); 1394dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for(n = 0; n < argc; n++) { 1395dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"argv[%d] = \"%s\"\n", n, argv[n]); 1396dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1397dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 1398dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1399dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return adb_commandline(argc, argv); 1400dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 1401dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1402dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint find_sync_dirs(const char *srcarg, 1403dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char **android_srcdir_out, char **data_srcdir_out) 1404dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 1405dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *android_srcdir, *data_srcdir; 1406dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1407dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(srcarg == NULL) { 1408dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project android_srcdir = product_file("system"); 1409dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project data_srcdir = product_file("data"); 1410dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 1411dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* srcarg may be "data", "system" or NULL. 1412dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * if srcarg is NULL, then both data and system are synced 1413dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 1414dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(strcmp(srcarg, "system") == 0) { 1415dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project android_srcdir = product_file("system"); 1416dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project data_srcdir = NULL; 1417dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if(strcmp(srcarg, "data") == 0) { 1418dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project android_srcdir = NULL; 1419dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project data_srcdir = product_file("data"); 1420dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 1421dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* It's not "system" or "data". 1422dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 1423dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 1424dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1425dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1426dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1427dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(android_srcdir_out != NULL) 1428dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *android_srcdir_out = android_srcdir; 1429dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project else 1430dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free(android_srcdir); 1431dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1432dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(data_srcdir_out != NULL) 1433dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *data_srcdir_out = data_srcdir; 1434dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project else 1435dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free(data_srcdir); 1436dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1437dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 1438dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 1439dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1440dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int pm_command(transport_type transport, char* serial, 1441dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int argc, char** argv) 1442dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 1443dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char buf[4096]; 1444dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1445dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project snprintf(buf, sizeof(buf), "shell:pm"); 1446dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1447dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while(argc-- > 0) { 1448dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *quoted; 1449dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1450dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project quoted = dupAndQuote(*argv++); 1451dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1452dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strncat(buf, " ", sizeof(buf)-1); 1453dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strncat(buf, quoted, sizeof(buf)-1); 1454dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free(quoted); 1455dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1456dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1457dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project send_shellcommand(transport, serial, buf); 1458dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 1459dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 1460dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1461dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint uninstall_app(transport_type transport, char* serial, int argc, char** argv) 1462dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 1463dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* if the user choose the -k option, we refuse to do it until devices are 1464dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project out with the option to uninstall the remaining data somehow (adb/ui) */ 1465dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (argc == 3 && strcmp(argv[1], "-k") == 0) 1466dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { 1467dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf( 1468dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "The -k option uninstalls the application while retaining the data/cache.\n" 1469dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "At the moment, there is no way to remove the remaining data.\n" 1470dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "You will have to reinstall the application with the same signature, and fully uninstall it.\n" 1471dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "If you truly wish to continue, execute 'adb shell pm uninstall -k %s'\n", argv[2]); 1472dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 1473dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1474dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1475dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* 'adb uninstall' takes the same arguments as 'pm uninstall' on device */ 1476dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return pm_command(transport, serial, argc, argv); 1477dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 1478dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1479dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int delete_file(transport_type transport, char* serial, char* filename) 1480dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 1481dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char buf[4096]; 1482dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char* quoted; 1483dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1484dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project snprintf(buf, sizeof(buf), "shell:rm "); 1485dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project quoted = dupAndQuote(filename); 1486dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strncat(buf, quoted, sizeof(buf)-1); 1487dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free(quoted); 1488dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1489dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project send_shellcommand(transport, serial, buf); 1490dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 1491dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 1492dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1493597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Rootstatic const char* get_basename(const char* filename) 1494597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root{ 1495597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root const char* basename = adb_dirstop(filename); 1496597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root if (basename) { 1497597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root basename++; 1498597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root return basename; 1499597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root } else { 1500597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root return filename; 1501597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root } 1502597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root} 1503597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root 1504597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Rootstatic int check_file(const char* filename) 1505dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 1506dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct stat st; 1507597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root 1508597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root if (filename == NULL) { 1509597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root return 0; 1510597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root } 1511597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root 1512597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root if (stat(filename, &st) != 0) { 1513597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root fprintf(stderr, "can't find '%s' to install\n", filename); 1514597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root return 1; 1515597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root } 1516597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root 1517597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root if (!S_ISREG(st.st_mode)) { 1518597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root fprintf(stderr, "can't install '%s' because it's not a file\n", filename); 1519597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root return 1; 1520597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root } 1521597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root 1522597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root return 0; 1523597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root} 1524597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root 1525597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Rootint install_app(transport_type transport, char* serial, int argc, char** argv) 1526597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root{ 1527597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root static const char *const DATA_DEST = "/data/local/tmp/%s"; 1528597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root static const char *const SD_DEST = "/sdcard/tmp/%s"; 15290ef3fd048aeaeb59467e43e543f66b96e4e6c7f5Mike Lockwood const char* where = DATA_DEST; 1530597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root char apk_dest[PATH_MAX]; 1531597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root char verification_dest[PATH_MAX]; 1532597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root char* apk_file; 1533597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root char* verification_file = NULL; 1534597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root int file_arg = -1; 1535597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root int err; 15360ef3fd048aeaeb59467e43e543f66b96e4e6c7f5Mike Lockwood int i; 15374474ac408105bb31f945ddab53a24ed148e34227Anonymous Coward int verify_apk = 1; 15380ef3fd048aeaeb59467e43e543f66b96e4e6c7f5Mike Lockwood 1539597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root for (i = 1; i < argc; i++) { 1540597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root if (*argv[i] != '-') { 1541597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root file_arg = i; 1542597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root break; 1543a031a91b9518af9a38290713b0c2126d9b8f6cdeKenny Root } else if (!strcmp(argv[i], "-i")) { 1544a031a91b9518af9a38290713b0c2126d9b8f6cdeKenny Root // Skip the installer package name. 1545a031a91b9518af9a38290713b0c2126d9b8f6cdeKenny Root i++; 1546597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root } else if (!strcmp(argv[i], "-s")) { 15470ef3fd048aeaeb59467e43e543f66b96e4e6c7f5Mike Lockwood where = SD_DEST; 15484474ac408105bb31f945ddab53a24ed148e34227Anonymous Coward } else if (!strcmp(argv[i], "--algo")) { 15494474ac408105bb31f945ddab53a24ed148e34227Anonymous Coward verify_apk = 0; 15504474ac408105bb31f945ddab53a24ed148e34227Anonymous Coward i++; 15514474ac408105bb31f945ddab53a24ed148e34227Anonymous Coward } else if (!strcmp(argv[i], "--iv")) { 15524474ac408105bb31f945ddab53a24ed148e34227Anonymous Coward verify_apk = 0; 15534474ac408105bb31f945ddab53a24ed148e34227Anonymous Coward i++; 15544474ac408105bb31f945ddab53a24ed148e34227Anonymous Coward } else if (!strcmp(argv[i], "--key")) { 15554474ac408105bb31f945ddab53a24ed148e34227Anonymous Coward verify_apk = 0; 15564474ac408105bb31f945ddab53a24ed148e34227Anonymous Coward i++; 1557597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root } 15580ef3fd048aeaeb59467e43e543f66b96e4e6c7f5Mike Lockwood } 1559dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1560597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root if (file_arg < 0) { 1561a031a91b9518af9a38290713b0c2126d9b8f6cdeKenny Root fprintf(stderr, "can't find filename in arguments\n"); 1562597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root return 1; 1563597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root } else if (file_arg + 2 < argc) { 1564a031a91b9518af9a38290713b0c2126d9b8f6cdeKenny Root fprintf(stderr, "too many files specified; only takes APK file and verifier file\n"); 1565597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root return 1; 1566dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1567597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root 1568597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root apk_file = argv[file_arg]; 1569597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root 1570597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root if (file_arg != argc - 1) { 1571597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root verification_file = argv[file_arg + 1]; 1572dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1573dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1574597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root if (check_file(apk_file) || check_file(verification_file)) { 1575dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 1576dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1577597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root 1578597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root snprintf(apk_dest, sizeof apk_dest, where, get_basename(apk_file)); 1579597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root if (verification_file != NULL) { 1580597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root snprintf(verification_dest, sizeof(verification_dest), where, get_basename(verification_file)); 1581597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root 1582597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root if (!strcmp(apk_dest, verification_dest)) { 1583597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root fprintf(stderr, "APK and verification file can't have the same name\n"); 1584597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root return 1; 1585597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root } 1586597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root } 1587597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root 15884474ac408105bb31f945ddab53a24ed148e34227Anonymous Coward err = do_sync_push(apk_file, apk_dest, verify_apk); 1589597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root if (err) { 159060733e9280ebd693293d6e7683af0bd94f8909aaKenny Root goto cleanup_apk; 1591597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root } else { 1592597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root argv[file_arg] = apk_dest; /* destination name, not source location */ 1593dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1594dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1595597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root if (verification_file != NULL) { 1596597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root err = do_sync_push(verification_file, verification_dest, 0 /* no verify APK */); 1597597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root if (err) { 1598597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root goto cleanup_apk; 1599597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root } else { 1600597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root argv[file_arg + 1] = verification_dest; /* destination name, not source location */ 1601597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root } 1602597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root } 1603597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root 1604597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root pm_command(transport, serial, argc, argv); 1605597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root 160660733e9280ebd693293d6e7683af0bd94f8909aaKenny Rootcleanup_apk: 1607597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root if (verification_file != NULL) { 1608597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root delete_file(transport, serial, verification_dest); 1609dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1610dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1611597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root delete_file(transport, serial, apk_dest); 1612597ea5b63f764b4403fd0d34400ab37cf944b479Kenny Root 1613dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return err; 1614dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 1615