commandline.c revision 67d5358e2a870f9e9447517bfa49bf5c6b410a50
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 Projectenum { 41dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project IGNORE_DATA, 42dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project WIPE_DATA, 43dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project FLASH_DATA 44dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}; 45dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 46dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int do_cmd(transport_type ttype, char* serial, char *cmd, ...); 47dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 483166410a82f43d39201be98a8d35c51baa86cb53Alexey Tarasovvoid get_my_path(char *s, size_t maxLen); 49dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint find_sync_dirs(const char *srcarg, 50dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char **android_srcdir_out, char **data_srcdir_out); 51dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint install_app(transport_type transport, char* serial, int argc, char** argv); 52dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint uninstall_app(transport_type transport, char* serial, int argc, char** argv); 53dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 54dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic const char *gProductOutPath = NULL; 55dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 56dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic char *product_file(const char *extra) 57dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 58dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int n; 59dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *x; 60dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 61dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (gProductOutPath == NULL) { 62dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "adb: Product directory not specified; " 63dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "use -p or define ANDROID_PRODUCT_OUT\n"); 64dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project exit(1); 65dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 66dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 67dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project n = strlen(gProductOutPath) + strlen(extra) + 2; 68dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project x = malloc(n); 69dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (x == 0) { 70dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "adb: Out of memory (product_file())\n"); 71dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project exit(1); 72dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 73dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 74dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project snprintf(x, (size_t)n, "%s" OS_PATH_SEPARATOR_STR "%s", gProductOutPath, extra); 75dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return x; 76dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 77dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 78dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid version(FILE * out) { 79dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(out, "Android Debug Bridge version %d.%d.%d\n", 80dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ADB_VERSION_MAJOR, ADB_VERSION_MINOR, ADB_SERVER_VERSION); 81dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 82dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 83dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid help() 84dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 85dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project version(stderr); 86dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 87dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, 88dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "\n" 89dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " -d - directs command to the only connected USB device\n" 90dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " returns an error if more than one USB device is present.\n" 91dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " -e - directs command to the only running emulator.\n" 92dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " returns an error if more than one emulator is running.\n" 93dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " -s <serial number> - directs command to the USB device or emulator with\n" 9422048ef3257719a4e03e6a81a989b071abe7655cNick Pelly " the given serial number. Overrides ANDROID_SERIAL\n" 9522048ef3257719a4e03e6a81a989b071abe7655cNick Pelly " envivornment variable.\n" 96dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " -p <product name or path> - simple product name like 'sooner', or\n" 97dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " a relative/absolute path to a product\n" 98dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " out directory like 'out/target/product/sooner'.\n" 99dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " If -p is not specified, the ANDROID_PRODUCT_OUT\n" 100dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " environment variable is used, which must\n" 101dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " be an absolute path.\n" 102dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " devices - list all connected devices\n" 103805c4a70300ed918853eec2f67e7b45919e48e10Brian Carlstrom " connect <host>:<port> - connect to a device via TCP/IP\n" 104805c4a70300ed918853eec2f67e7b45919e48e10Brian Carlstrom " disconnect <host>:<port> - disconnect from a TCP/IP device\n" 105dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "\n" 106dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "device commands:\n" 107dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " adb push <local> <remote> - copy file/dir to device\n" 1088071a4bdb6e437baa4efcb8cf777d4caeaf069e4Joe Onorato " adb pull <remote> [<local>] - copy file/dir from device\n" 109dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " adb sync [ <directory> ] - copy host->device only if changed\n" 110705c944c0e2a50150ffb41707b6b3daebb45cf79Anthony Newnam " (-l means list but don't copy)\n" 111dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " (see 'adb help all')\n" 112dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " adb shell - run remote shell interactively\n" 113dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " adb shell <command> - run remote shell command\n" 114dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " adb emu <command> - run emulator console command\n" 115dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " adb logcat [ <filter-spec> ] - View device log\n" 116dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " adb forward <local> <remote> - forward socket connections\n" 117dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " forward specs are one of: \n" 118dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " tcp:<port>\n" 119dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " localabstract:<unix domain socket name>\n" 120dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " localreserved:<unix domain socket name>\n" 121dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " localfilesystem:<unix domain socket name>\n" 122dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " dev:<character device name>\n" 123dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " jdwp:<process pid> (remote only)\n" 124dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " adb jdwp - list PIDs of processes hosting a JDWP transport\n" 125dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " adb install [-l] [-r] <file> - push this package file to the device and install it\n" 126dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " ('-l' means forward-lock the app)\n" 127dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " ('-r' means reinstall the app, keeping its data)\n" 128dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " adb uninstall [-k] <package> - remove this app package from the device\n" 129dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " ('-k' means keep the data and cache directories)\n" 130dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " adb bugreport - return all information from the device\n" 131dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " that should be included in a bug report.\n" 132dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "\n" 133dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " adb help - show this help message\n" 134dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " adb version - show version num\n" 135dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "\n" 136dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "DATAOPTS:\n" 137dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " (no option) - don't touch the data partition\n" 138dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " -w - wipe the data partition\n" 139dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " -d - flash the data partition\n" 140dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "\n" 141dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "scripting:\n" 142dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " adb wait-for-device - block until device is online\n" 143dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " adb start-server - ensure that there is a server running\n" 144dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " adb kill-server - kill the server if it is running\n" 145dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " adb get-state - prints: offline | bootloader | device\n" 146dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " adb get-serialno - prints: <serial-number>\n" 147dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " adb status-window - continuously print device status for a specified device\n" 148dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " adb remount - remounts the /system partition on the device read-write\n" 1495f4b051235c3e9e9e5b34b4af885e42a1c711fc4Mike Lockwood " adb reboot [bootloader|recovery] - reboots the device, optionally into the bootloader or recovery program\n" 150a48d43a0777494b3a686fa0c6d58f986547982ebRomain Guy " adb reboot-bootloader - reboots the device into the bootloader\n" 1512f38b699713dc2587a771bd5d4c6a47329728f5eMike Lockwood " adb root - restarts the adbd daemon with root permissions\n" 152a48d43a0777494b3a686fa0c6d58f986547982ebRomain Guy " adb usb - restarts the adbd daemon listening on USB\n" 1532f38b699713dc2587a771bd5d4c6a47329728f5eMike Lockwood " adb tcpip <port> - restarts the adbd daemon listening on TCP on the specified port" 154dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "\n" 155dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "networking:\n" 156dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " adb ppp <tty> [parameters] - Run PPP over USB.\n" 157417a3235350b2bb016625f40ffb22c356a51f046Kenny Root " Note: you should not automatically start a PPP connection.\n" 158dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " <tty> refers to the tty for PPP stream. Eg. dev:/dev/omap_csmi_tty1\n" 159dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " [parameters] - Eg. defaultroute debug dump local notty usepeerdns\n" 160dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "\n" 161dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "adb sync notes: adb sync [ <directory> ]\n" 162dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " <localdir> can be interpreted in several ways:\n" 163dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "\n" 164dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " - If <directory> is not specified, both /system and /data partitions will be updated.\n" 165dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "\n" 166dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " - If it is \"system\" or \"data\", only the corresponding partition\n" 167dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " is updated.\n" 168cd64315f72537359537c66eebe482495ffefba57Tim "\n" 169cd64315f72537359537c66eebe482495ffefba57Tim "environmental variables:\n" 170cd64315f72537359537c66eebe482495ffefba57Tim " ADB_TRACE - Print debug information. A comma separated list of the following values\n" 171cd64315f72537359537c66eebe482495ffefba57Tim " 1 or all, adb, sockets, packets, rwx, usb, sync, sysdeps, transport, jdwp\n" 172cd64315f72537359537c66eebe482495ffefba57Tim " ANDROID_SERIAL - The serial number to connect to. -s takes priority over this if given.\n" 173cd64315f72537359537c66eebe482495ffefba57Tim " ANDROID_LOG_TAGS - When used with the logcat option, only these debug tags are printed.\n" 174dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ); 175dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 176dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 177dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint usage() 178dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 179dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project help(); 180dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 181dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 182dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 183dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef HAVE_TERMIO_H 184dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic struct termios tio_save; 185dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 186dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void stdin_raw_init(int fd) 187dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 188dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct termios tio; 189dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 190dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(tcgetattr(fd, &tio)) return; 191dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(tcgetattr(fd, &tio_save)) return; 192dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 193dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tio.c_lflag = 0; /* disable CANON, ECHO*, etc */ 194dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 195dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* no timeout but request at least one character per read */ 196dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tio.c_cc[VTIME] = 0; 197dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tio.c_cc[VMIN] = 1; 198dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 199dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tcsetattr(fd, TCSANOW, &tio); 200dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tcflush(fd, TCIFLUSH); 201dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 202dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 203dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void stdin_raw_restore(int fd) 204dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 205dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tcsetattr(fd, TCSANOW, &tio_save); 206dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tcflush(fd, TCIFLUSH); 207dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 208dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 209dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 210dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void read_and_dump(int fd) 211dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 212dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char buf[4096]; 213dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int len; 214dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 215dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while(fd >= 0) { 216dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project len = adb_read(fd, buf, 4096); 217dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(len == 0) { 218dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 219dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 220dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 221dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(len < 0) { 222dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(errno == EINTR) continue; 223dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 224dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 225c519c00c367c9017eed70973022813e828448818Mike Lockwood fwrite(buf, 1, len, stdout); 226c519c00c367c9017eed70973022813e828448818Mike Lockwood fflush(stdout); 227dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 228dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 229dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 230dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void *stdin_read_thread(void *x) 231dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 232dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int fd, fdi; 233dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project unsigned char buf[1024]; 234dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int r, n; 235dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int state = 0; 236dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 237dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int *fds = (int*) x; 238dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fd = fds[0]; 239dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fdi = fds[1]; 240dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free(fds); 241dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 242dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for(;;) { 243dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* fdi is really the client's stdin, so use read, not adb_read here */ 244dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r = unix_read(fdi, buf, 1024); 245dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(r == 0) break; 246dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(r < 0) { 247dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(errno == EINTR) continue; 248dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 249dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 25067d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood for(n = 0; n < r; n++){ 25167d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood switch(buf[n]) { 25267d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood case '\n': 25367d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood state = 1; 25467d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood break; 25567d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood case '\r': 25667d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood state = 1; 25767d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood break; 25867d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood case '~': 25967d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood if(state == 1) state++; 26067d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood break; 26167d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood case '.': 26267d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood if(state == 2) { 26367d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood fprintf(stderr,"\n* disconnect *\n"); 26467d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood#ifdef HAVE_TERMIO_H 26567d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood stdin_raw_restore(fdi); 266dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 26767d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood exit(0); 268dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 26967d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood default: 27067d5358e2a870f9e9447517bfa49bf5c6b410a50Mike Lockwood state = 0; 271dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 272dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 273dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r = adb_write(fd, buf, r); 274dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(r <= 0) { 275dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 276dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 277dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 278dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 279dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 280dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 281dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint interactive_shell(void) 282dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 283dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_thread_t thr; 284dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int fdi, fd; 285dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int *fds; 286dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 287dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fd = adb_connect("shell:"); 288dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(fd < 0) { 289dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"error: %s\n", adb_error()); 290dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 291dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 292dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fdi = 0; //dup(0); 293dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 294dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fds = malloc(sizeof(int) * 2); 295dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fds[0] = fd; 296dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fds[1] = fdi; 297dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 298dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef HAVE_TERMIO_H 299dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project stdin_raw_init(fdi); 300dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 301dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_thread_create(&thr, stdin_read_thread, fds); 302dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project read_and_dump(fd); 303dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef HAVE_TERMIO_H 304dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project stdin_raw_restore(fdi); 305dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 306dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 307dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 308dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 309dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 310dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void format_host_command(char* buffer, size_t buflen, const char* command, transport_type ttype, const char* serial) 311dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 312dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (serial) { 313dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project snprintf(buffer, buflen, "host-serial:%s:%s", serial, command); 314dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 315dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char* prefix = "host"; 316dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (ttype == kTransportUsb) 317dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project prefix = "host-usb"; 318dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project else if (ttype == kTransportLocal) 319dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project prefix = "host-local"; 320dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 321dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project snprintf(buffer, buflen, "%s:%s", prefix, command); 322dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 323dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 324dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 325dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void status_window(transport_type ttype, const char* serial) 326dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 327dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char command[4096]; 328dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *state = 0; 329dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *laststate = 0; 330dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 331dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* silence stderr */ 332dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef _WIN32 333dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* XXX: TODO */ 334dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#else 335dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int fd; 336dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fd = unix_open("/dev/null", O_WRONLY); 337dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project dup2(fd, 2); 338dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_close(fd); 339dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 340dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 341dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project format_host_command(command, sizeof command, "get-state", ttype, serial); 342dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 343dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for(;;) { 344dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_sleep_ms(250); 345dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 346dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(state) { 347dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free(state); 348dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project state = 0; 349dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 350dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 351dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project state = adb_query(command); 352dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 353dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(state) { 354dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(laststate && !strcmp(state,laststate)){ 355dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project continue; 356dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 357dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(laststate) free(laststate); 358dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project laststate = strdup(state); 359dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 360dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 361dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 362dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("%c[2J%c[2H", 27, 27); 363dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("Android Debug Bridge\n"); 364dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("State: %s\n", state ? state : "offline"); 365dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fflush(stdout); 366dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 367dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 368dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 369dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/** duplicate string and quote all \ " ( ) chars + space character. */ 370dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic char * 371dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectdupAndQuote(const char *s) 372dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 373dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char *ts; 374dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project size_t alloc_len; 375dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *ret; 376dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *dest; 377dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 378dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ts = s; 379dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 380dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project alloc_len = 0; 381dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 382dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for( ;*ts != '\0'; ts++) { 383dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project alloc_len++; 384dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (*ts == ' ' || *ts == '"' || *ts == '\\' || *ts == '(' || *ts == ')') { 385dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project alloc_len++; 386dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 387dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 388dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 389dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ret = (char *)malloc(alloc_len + 1); 390dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 391dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ts = s; 392dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project dest = ret; 393dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 394dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for ( ;*ts != '\0'; ts++) { 395dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (*ts == ' ' || *ts == '"' || *ts == '\\' || *ts == '(' || *ts == ')') { 396dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *dest++ = '\\'; 397dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 398dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 399dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *dest++ = *ts; 400dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 401dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 402dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *dest++ = '\0'; 403dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 404dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return ret; 405dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 406dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 407dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/** 408dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Run ppp in "notty" mode against a resource listed as the first parameter 409dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * eg: 410dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 411dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * ppp dev:/dev/omap_csmi_tty0 <ppp options> 412dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 413dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 414dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint ppp(int argc, char **argv) 415dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 416dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef HAVE_WIN32_PROC 417dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "error: adb %s not implemented on Win32\n", argv[0]); 418dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 419dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#else 420dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *adb_service_name; 421dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pid_t pid; 422dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int fd; 423dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 424dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (argc < 2) { 425dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "usage: adb %s <adb service name> [ppp opts]\n", 426dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argv[0]); 427dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 428dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 429dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 430dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 431dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_service_name = argv[1]; 432dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 433dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fd = adb_connect(adb_service_name); 434dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 435dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(fd < 0) { 436dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"Error: Could not open adb service: %s. Error: %s\n", 437dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_service_name, adb_error()); 438dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 439dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 440dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 441dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pid = fork(); 442dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 443dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (pid < 0) { 444dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project perror("from fork()"); 445dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 446dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if (pid == 0) { 447dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int err; 448dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int i; 449dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char **ppp_args; 450dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 451dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // copy args 452dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ppp_args = (const char **) alloca(sizeof(char *) * argc + 1); 453dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ppp_args[0] = "pppd"; 454dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for (i = 2 ; i < argc ; i++) { 455dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project //argv[2] and beyond become ppp_args[1] and beyond 456dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ppp_args[i - 1] = argv[i]; 457dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 458dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ppp_args[i-1] = NULL; 459dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 460dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // child side 461dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 462dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project dup2(fd, STDIN_FILENO); 463dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project dup2(fd, STDOUT_FILENO); 464dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_close(STDERR_FILENO); 465dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_close(fd); 466dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 467dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project err = execvp("pppd", (char * const *)ppp_args); 468dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 469dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (err < 0) { 470dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project perror("execing pppd"); 471dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 472dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project exit(-1); 473dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 474dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // parent side 475dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 476dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_close(fd); 477dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 478dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 479dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif /* !HAVE_WIN32_PROC */ 480dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 481dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 482dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int send_shellcommand(transport_type transport, char* serial, char* buf) 483dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 484dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int fd, ret; 485dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 486dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for(;;) { 487dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fd = adb_connect(buf); 488dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(fd >= 0) 489dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 490dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"- waiting for device -\n"); 491dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_sleep_ms(1000); 492dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project do_cmd(transport, serial, "wait-for-device", 0); 493dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 494dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 495dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project read_and_dump(fd); 496dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ret = adb_close(fd); 497dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (ret) 498dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project perror("close"); 499dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 500dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return ret; 501dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 502dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 503dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int logcat(transport_type transport, char* serial, int argc, char **argv) 504dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 505dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char buf[4096]; 506dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 507dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *log_tags; 508dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *quoted_log_tags; 509dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 510dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project log_tags = getenv("ANDROID_LOG_TAGS"); 511dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project quoted_log_tags = dupAndQuote(log_tags == NULL ? "" : log_tags); 512dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 513dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project snprintf(buf, sizeof(buf), 514dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "shell:export ANDROID_LOG_TAGS=\"\%s\" ; exec logcat", 515dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project quoted_log_tags); 516dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 517dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free(quoted_log_tags); 518dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 519dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argc -= 1; 520dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argv += 1; 521dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while(argc-- > 0) { 522dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *quoted; 523dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 524dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project quoted = dupAndQuote (*argv++); 525dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 526dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strncat(buf, " ", sizeof(buf)-1); 527dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strncat(buf, quoted, sizeof(buf)-1); 528dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free(quoted); 529dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 530dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 531dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project send_shellcommand(transport, serial, buf); 532dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 533dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 534dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 535dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define SENTINEL_FILE "config" OS_PATH_SEPARATOR_STR "envsetup.make" 536dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int top_works(const char *top) 537dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 538dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (top != NULL && adb_is_absolute_host_path(top)) { 539dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char path_buf[PATH_MAX]; 540dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project snprintf(path_buf, sizeof(path_buf), 541dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "%s" OS_PATH_SEPARATOR_STR SENTINEL_FILE, top); 542dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return access(path_buf, F_OK) == 0; 543dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 544dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 545dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 546dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 547dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic char *find_top_from(const char *indir, char path_buf[PATH_MAX]) 548dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 549dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strcpy(path_buf, indir); 550dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while (1) { 551dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (top_works(path_buf)) { 552dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return path_buf; 553dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 554dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *s = adb_dirstop(path_buf); 555dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (s != NULL) { 556dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *s = '\0'; 557dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 558dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project path_buf[0] = '\0'; 559dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return NULL; 560dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 561dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 562dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 563dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 564dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic char *find_top(char path_buf[PATH_MAX]) 565dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 566dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *top = getenv("ANDROID_BUILD_TOP"); 567dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (top != NULL && top[0] != '\0') { 568dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!top_works(top)) { 569dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "adb: bad ANDROID_BUILD_TOP value \"%s\"\n", top); 570dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return NULL; 571dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 572dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 573dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project top = getenv("TOP"); 574dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (top != NULL && top[0] != '\0') { 575dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!top_works(top)) { 576dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "adb: bad TOP value \"%s\"\n", top); 577dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return NULL; 578dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 579dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 580dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project top = NULL; 581dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 582dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 583dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 584dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (top != NULL) { 585dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* The environment pointed to a top directory that works. 586dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 587dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strcpy(path_buf, top); 588dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return path_buf; 589dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 590dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 591dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* The environment didn't help. Walk up the tree from the CWD 592dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * to see if we can find the top. 593dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 594dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char dir[PATH_MAX]; 595dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project top = find_top_from(getcwd(dir, sizeof(dir)), path_buf); 596dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (top == NULL) { 597dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* If the CWD isn't under a good-looking top, see if the 598dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * executable is. 599dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 6003166410a82f43d39201be98a8d35c51baa86cb53Alexey Tarasov get_my_path(dir, PATH_MAX); 601dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project top = find_top_from(dir, path_buf); 602dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 603dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return top; 604dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 605dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 606dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* <hint> may be: 607dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * - A simple product name 608dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * e.g., "sooner" 609dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectTODO: debug? sooner-debug, sooner:debug? 610dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * - A relative path from the CWD to the ANDROID_PRODUCT_OUT dir 611dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * e.g., "out/target/product/sooner" 612dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * - An absolute path to the PRODUCT_OUT dir 613dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * e.g., "/src/device/out/target/product/sooner" 614dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 615dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Given <hint>, try to construct an absolute path to the 616dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * ANDROID_PRODUCT_OUT dir. 617dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 618dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic const char *find_product_out_path(const char *hint) 619dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 620dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project static char path_buf[PATH_MAX]; 621dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 622dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (hint == NULL || hint[0] == '\0') { 623dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return NULL; 624dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 625dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 626dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* If it's already absolute, don't bother doing any work. 627dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 628dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (adb_is_absolute_host_path(hint)) { 629dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strcpy(path_buf, hint); 630dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return path_buf; 631dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 632dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 633dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* If there are any slashes in it, assume it's a relative path; 634dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * make it absolute. 635dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 636dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (adb_dirstart(hint) != NULL) { 637dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (getcwd(path_buf, sizeof(path_buf)) == NULL) { 638dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "adb: Couldn't get CWD: %s\n", strerror(errno)); 639dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return NULL; 640dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 641dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (strlen(path_buf) + 1 + strlen(hint) >= sizeof(path_buf)) { 642dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "adb: Couldn't assemble path\n"); 643dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return NULL; 644dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 645dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strcat(path_buf, OS_PATH_SEPARATOR_STR); 646dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strcat(path_buf, hint); 647dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return path_buf; 648dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 649dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 650dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* It's a string without any slashes. Try to do something with it. 651dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 652dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Try to find the root of the build tree, and build a PRODUCT_OUT 653dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * path from there. 654dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 655dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char top_buf[PATH_MAX]; 656dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char *top = find_top(top_buf); 657dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (top == NULL) { 658dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "adb: Couldn't find top of build tree\n"); 659dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return NULL; 660dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 661dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project//TODO: if we have a way to indicate debug, look in out/debug/target/... 662dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project snprintf(path_buf, sizeof(path_buf), 663dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "%s" OS_PATH_SEPARATOR_STR 664dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "out" OS_PATH_SEPARATOR_STR 665dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "target" OS_PATH_SEPARATOR_STR 666dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "product" OS_PATH_SEPARATOR_STR 667dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "%s", top_buf, hint); 668dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (access(path_buf, F_OK) < 0) { 669dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "adb: Couldn't find a product dir " 670dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "based on \"-p %s\"; \"%s\" doesn't exist\n", hint, path_buf); 671dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return NULL; 672dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 673dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return path_buf; 674dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 675dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 676dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint adb_commandline(int argc, char **argv) 677dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 678dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char buf[4096]; 679dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int no_daemon = 0; 680dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int is_daemon = 0; 681dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int persist = 0; 682dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int r; 683dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int quote; 684dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project transport_type ttype = kTransportAny; 685dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char* serial = NULL; 686a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger char* server_port_str = NULL; 687dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 688dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* If defined, this should be an absolute path to 689dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * the directory containing all of the various system images 690dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * for a particular product. If not defined, and the adb 691dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * command requires this information, then the user must 692dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * specify the path using "-p". 693dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 694dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project gProductOutPath = getenv("ANDROID_PRODUCT_OUT"); 695dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (gProductOutPath == NULL || gProductOutPath[0] == '\0') { 696dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project gProductOutPath = NULL; 697dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 698dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // TODO: also try TARGET_PRODUCT/TARGET_DEVICE as a hint 699dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 70022048ef3257719a4e03e6a81a989b071abe7655cNick Pelly serial = getenv("ANDROID_SERIAL"); 70122048ef3257719a4e03e6a81a989b071abe7655cNick Pelly 702a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger /* Validate and assign the server port */ 703a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger server_port_str = getenv("ANDROID_ADB_SERVER_PORT"); 704a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger int server_port = DEFAULT_ADB_PORT; 705a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger if (server_port_str && strlen(server_port_str) > 0) { 706a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger server_port = (int) strtol(server_port_str, NULL, 0); 707a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger if (server_port <= 0) { 708a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger fprintf(stderr, 709a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger "adb: Env var ANDROID_ADB_SERVER_PORT must be a positive number. Got \"%s\"\n", 710a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger server_port_str); 711a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger return usage(); 712a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger } 713a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger } 714a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger 715a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger /* modifiers and flags */ 716dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while(argc > 0) { 717dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(argv[0],"nodaemon")) { 718dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project no_daemon = 1; 719dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if (!strcmp(argv[0], "fork-server")) { 720dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* this is a special flag used only when the ADB client launches the ADB Server */ 721dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project is_daemon = 1; 722dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if(!strcmp(argv[0],"persist")) { 723dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project persist = 1; 724dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if(!strncmp(argv[0], "-p", 2)) { 725dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char *product = NULL; 726dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (argv[0][2] == '\0') { 727dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (argc < 2) return usage(); 728dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project product = argv[1]; 729dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argc--; 730dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argv++; 731dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 732dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project product = argv[1] + 2; 733dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 734dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project gProductOutPath = find_product_out_path(product); 735dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (gProductOutPath == NULL) { 736dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "adb: could not resolve \"-p %s\"\n", 737dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project product); 738dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return usage(); 739dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 740dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if (argv[0][0]=='-' && argv[0][1]=='s') { 741dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (isdigit(argv[0][2])) { 742dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project serial = argv[0] + 2; 743dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 744a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger if(argc < 2 || argv[0][2] != '\0') return usage(); 745dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project serial = argv[1]; 746dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argc--; 747dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argv++; 748dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 749dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if (!strcmp(argv[0],"-d")) { 750dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ttype = kTransportUsb; 751dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if (!strcmp(argv[0],"-e")) { 752dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ttype = kTransportLocal; 753dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 754dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* out of recognized modifiers and flags */ 755dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 756dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 757dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argc--; 758dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argv++; 759dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 760dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 761dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_set_transport(ttype, serial); 762a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger adb_set_tcp_specifics(server_port); 763dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 764dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if ((argc > 0) && (!strcmp(argv[0],"server"))) { 765dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (no_daemon || is_daemon) { 766a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger r = adb_main(is_daemon, server_port); 767dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 768a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger r = launch_server(server_port); 769dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 770dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(r) { 771dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"* could not start server *\n"); 772dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 773dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return r; 774dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 775dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 776dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttop: 777dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(argc == 0) { 778dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return usage(); 779dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 780dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 781dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* adb_connect() commands */ 782dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 783dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(argv[0], "devices")) { 784dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *tmp; 785dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project snprintf(buf, sizeof buf, "host:%s", argv[0]); 786dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tmp = adb_query(buf); 787dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(tmp) { 788dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("List of devices attached \n"); 789dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("%s\n", tmp); 790dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 791dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 792dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 793dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 794dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 795dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 79674d7ff8cfd490852d3df1c4b9d8a21beed619caaMike Lockwood if(!strcmp(argv[0], "connect") || !strcmp(argv[0], "disconnect")) { 7972f38b699713dc2587a771bd5d4c6a47329728f5eMike Lockwood char *tmp; 7982f38b699713dc2587a771bd5d4c6a47329728f5eMike Lockwood if (argc != 2) { 79974d7ff8cfd490852d3df1c4b9d8a21beed619caaMike Lockwood fprintf(stderr, "Usage: adb %s <host>:<port>\n", argv[0]); 8002f38b699713dc2587a771bd5d4c6a47329728f5eMike Lockwood return 1; 8012f38b699713dc2587a771bd5d4c6a47329728f5eMike Lockwood } 8022f38b699713dc2587a771bd5d4c6a47329728f5eMike Lockwood snprintf(buf, sizeof buf, "host:%s:%s", argv[0], argv[1]); 8032f38b699713dc2587a771bd5d4c6a47329728f5eMike Lockwood tmp = adb_query(buf); 8042f38b699713dc2587a771bd5d4c6a47329728f5eMike Lockwood if(tmp) { 8052f38b699713dc2587a771bd5d4c6a47329728f5eMike Lockwood printf("%s\n", tmp); 8062f38b699713dc2587a771bd5d4c6a47329728f5eMike Lockwood return 0; 8072f38b699713dc2587a771bd5d4c6a47329728f5eMike Lockwood } else { 8082f38b699713dc2587a771bd5d4c6a47329728f5eMike Lockwood return 1; 8092f38b699713dc2587a771bd5d4c6a47329728f5eMike Lockwood } 8102f38b699713dc2587a771bd5d4c6a47329728f5eMike Lockwood } 8112f38b699713dc2587a771bd5d4c6a47329728f5eMike Lockwood 812dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!strcmp(argv[0], "emu")) { 813dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return adb_send_emulator_command(argc, argv); 814dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 815dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 816dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(argv[0], "shell")) { 817dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int r; 818dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int fd; 819dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 820dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(argc < 2) { 821dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return interactive_shell(); 822dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 823dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 824dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project snprintf(buf, sizeof buf, "shell:%s", argv[1]); 825dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argc -= 2; 826dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argv += 2; 827dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while(argc-- > 0) { 828dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strcat(buf, " "); 829dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 830dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* quote empty strings and strings with spaces */ 831dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project quote = (**argv == 0 || strchr(*argv, ' ')); 832dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (quote) 833a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger strcat(buf, "\""); 834dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strcat(buf, *argv++); 835dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (quote) 836a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger strcat(buf, "\""); 837dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 838dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 839dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for(;;) { 840dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fd = adb_connect(buf); 841dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(fd >= 0) { 842dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project read_and_dump(fd); 843dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_close(fd); 844dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r = 0; 845dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 846dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"error: %s\n", adb_error()); 847dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r = -1; 848dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 849dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 850dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(persist) { 851dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"\n- waiting for device -\n"); 852dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_sleep_ms(1000); 853dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project do_cmd(ttype, serial, "wait-for-device", 0); 854dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 855dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return r; 856dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 857dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 858dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 859dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 860dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(argv[0], "kill-server")) { 861dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int fd; 862dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fd = _adb_connect("host:kill"); 863dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(fd == -1) { 864dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"* server not running *\n"); 865dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 866dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 867dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 868dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 869dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 8702f38b699713dc2587a771bd5d4c6a47329728f5eMike Lockwood if(!strcmp(argv[0], "remount") || !strcmp(argv[0], "reboot") 871a48d43a0777494b3a686fa0c6d58f986547982ebRomain Guy || !strcmp(argv[0], "reboot-bootloader") 8722f38b699713dc2587a771bd5d4c6a47329728f5eMike Lockwood || !strcmp(argv[0], "tcpip") || !strcmp(argv[0], "usb") 873f71c71148cb65e61ab483b1b0351922c11d862d8Xavier Ducrohet || !strcmp(argv[0], "root")) { 8742f38b699713dc2587a771bd5d4c6a47329728f5eMike Lockwood char command[100]; 875a48d43a0777494b3a686fa0c6d58f986547982ebRomain Guy if (!strcmp(argv[0], "reboot-bootloader")) 876a48d43a0777494b3a686fa0c6d58f986547982ebRomain Guy snprintf(command, sizeof(command), "reboot:bootloader"); 877a48d43a0777494b3a686fa0c6d58f986547982ebRomain Guy else if (argc > 1) 8782f38b699713dc2587a771bd5d4c6a47329728f5eMike Lockwood snprintf(command, sizeof(command), "%s:%s", argv[0], argv[1]); 8795f4b051235c3e9e9e5b34b4af885e42a1c711fc4Mike Lockwood else 8802f38b699713dc2587a771bd5d4c6a47329728f5eMike Lockwood snprintf(command, sizeof(command), "%s:", argv[0]); 8812f38b699713dc2587a771bd5d4c6a47329728f5eMike Lockwood int fd = adb_connect(command); 882e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project if(fd >= 0) { 883e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project read_and_dump(fd); 884e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project adb_close(fd); 885e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project return 0; 886e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project } 887e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project fprintf(stderr,"error: %s\n", adb_error()); 888e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project return 1; 889e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project } 890e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project 891dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(argv[0], "bugreport")) { 8927eced2b86aa4ad91307b6531cae73ce1a4064b18Dan Egnor if (argc != 1) return usage(); 8937eced2b86aa4ad91307b6531cae73ce1a4064b18Dan Egnor do_cmd(ttype, serial, "shell", "bugreport", 0); 894dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 895dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 896dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 897dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* adb_command() wrapper commands */ 898dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 899dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strncmp(argv[0], "wait-for-", strlen("wait-for-"))) { 900dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char* service = argv[0]; 901dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!strncmp(service, "wait-for-device", strlen("wait-for-device"))) { 902dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (ttype == kTransportUsb) { 903dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project service = "wait-for-usb"; 904dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if (ttype == kTransportLocal) { 905dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project service = "wait-for-local"; 906dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 907dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project service = "wait-for-any"; 908dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 909dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 910dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 911dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project format_host_command(buf, sizeof buf, service, ttype, serial); 912dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 913dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (adb_command(buf)) { 914dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project D("failure: %s *\n",adb_error()); 915dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"error: %s\n", adb_error()); 916dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 917dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 918dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 919dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* Allow a command to be run after wait-for-device, 920dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * e.g. 'adb wait-for-device shell'. 921dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 922dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(argc > 1) { 923dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argc--; 924dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argv++; 925dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project goto top; 926dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 927dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 928dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 929dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 930dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(argv[0], "forward")) { 931dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(argc != 3) return usage(); 932dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (serial) { 933a59387b508efd99031de2f23363092fdf4dfc130Mike Lockwood snprintf(buf, sizeof buf, "host-serial:%s:forward:%s;%s",serial, argv[1], argv[2]); 934a59387b508efd99031de2f23363092fdf4dfc130Mike Lockwood } else if (ttype == kTransportUsb) { 935a59387b508efd99031de2f23363092fdf4dfc130Mike Lockwood snprintf(buf, sizeof buf, "host-usb:forward:%s;%s", argv[1], argv[2]); 936a59387b508efd99031de2f23363092fdf4dfc130Mike Lockwood } else if (ttype == kTransportLocal) { 937a59387b508efd99031de2f23363092fdf4dfc130Mike Lockwood snprintf(buf, sizeof buf, "host-local:forward:%s;%s", argv[1], argv[2]); 938dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 939a59387b508efd99031de2f23363092fdf4dfc130Mike Lockwood snprintf(buf, sizeof buf, "host:forward:%s;%s", argv[1], argv[2]); 940dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 941dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(adb_command(buf)) { 942dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"error: %s\n", adb_error()); 943dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 944dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 945dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 946dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 947dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 948dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* do_sync_*() commands */ 949dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 950dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(argv[0], "ls")) { 951dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(argc != 2) return usage(); 952dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return do_sync_ls(argv[1]); 953dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 954dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 955dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(argv[0], "push")) { 956dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(argc != 3) return usage(); 957dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return do_sync_push(argv[1], argv[2], 0 /* no verify APK */); 958dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 959dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 960dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(argv[0], "pull")) { 9618071a4bdb6e437baa4efcb8cf777d4caeaf069e4Joe Onorato if (argc == 2) { 9628071a4bdb6e437baa4efcb8cf777d4caeaf069e4Joe Onorato return do_sync_pull(argv[1], "."); 9638071a4bdb6e437baa4efcb8cf777d4caeaf069e4Joe Onorato } else if (argc == 3) { 9648071a4bdb6e437baa4efcb8cf777d4caeaf069e4Joe Onorato return do_sync_pull(argv[1], argv[2]); 9658071a4bdb6e437baa4efcb8cf777d4caeaf069e4Joe Onorato } else { 9668071a4bdb6e437baa4efcb8cf777d4caeaf069e4Joe Onorato return usage(); 9678071a4bdb6e437baa4efcb8cf777d4caeaf069e4Joe Onorato } 968dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 969dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 970dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(argv[0], "install")) { 971dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (argc < 2) return usage(); 972dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return install_app(ttype, serial, argc, argv); 973dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 974dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 975dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(argv[0], "uninstall")) { 976dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (argc < 2) return usage(); 977dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return uninstall_app(ttype, serial, argc, argv); 978dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 979dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 980dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(argv[0], "sync")) { 981dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *srcarg, *android_srcpath, *data_srcpath; 982705c944c0e2a50150ffb41707b6b3daebb45cf79Anthony Newnam int listonly = 0; 983705c944c0e2a50150ffb41707b6b3daebb45cf79Anthony Newnam 984dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int ret; 985dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(argc < 2) { 986dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* No local path was specified. */ 987dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project srcarg = NULL; 988705c944c0e2a50150ffb41707b6b3daebb45cf79Anthony Newnam } else if (argc >= 2 && strcmp(argv[1], "-l") == 0) { 989705c944c0e2a50150ffb41707b6b3daebb45cf79Anthony Newnam listonly = 1; 990705c944c0e2a50150ffb41707b6b3daebb45cf79Anthony Newnam if (argc == 3) { 991705c944c0e2a50150ffb41707b6b3daebb45cf79Anthony Newnam srcarg = argv[2]; 992705c944c0e2a50150ffb41707b6b3daebb45cf79Anthony Newnam } else { 993705c944c0e2a50150ffb41707b6b3daebb45cf79Anthony Newnam srcarg = NULL; 994705c944c0e2a50150ffb41707b6b3daebb45cf79Anthony Newnam } 995dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if(argc == 2) { 996dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* A local path or "android"/"data" arg was specified. */ 997dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project srcarg = argv[1]; 998dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 999dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return usage(); 1000dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1001dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ret = find_sync_dirs(srcarg, &android_srcpath, &data_srcpath); 1002dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(ret != 0) return usage(); 1003dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1004dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(android_srcpath != NULL) 1005705c944c0e2a50150ffb41707b6b3daebb45cf79Anthony Newnam ret = do_sync_sync(android_srcpath, "/system", listonly); 1006dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(ret == 0 && data_srcpath != NULL) 1007705c944c0e2a50150ffb41707b6b3daebb45cf79Anthony Newnam ret = do_sync_sync(data_srcpath, "/data", listonly); 1008dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1009dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free(android_srcpath); 1010dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free(data_srcpath); 1011dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return ret; 1012dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1013dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1014dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* passthrough commands */ 1015dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1016dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(argv[0],"get-state") || 1017dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project !strcmp(argv[0],"get-serialno")) 1018dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { 1019dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *tmp; 1020dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1021dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project format_host_command(buf, sizeof buf, argv[0], ttype, serial); 1022dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tmp = adb_query(buf); 1023dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(tmp) { 1024dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("%s\n", tmp); 1025dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 1026dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 1027dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 1028dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1029dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1030dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1031dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* other commands */ 1032dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1033dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(argv[0],"status-window")) { 1034dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project status_window(ttype, serial); 1035dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 1036dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1037dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1038dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(argv[0],"logcat") || !strcmp(argv[0],"lolcat")) { 1039dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return logcat(ttype, serial, argc, argv); 1040dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1041dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1042dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(argv[0],"ppp")) { 1043dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return ppp(argc, argv); 1044dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1045dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1046dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!strcmp(argv[0], "start-server")) { 1047dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return adb_connect("host:start-server"); 1048dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1049dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1050dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!strcmp(argv[0], "jdwp")) { 1051dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int fd = adb_connect("jdwp"); 1052dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (fd >= 0) { 1053dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project read_and_dump(fd); 1054dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_close(fd); 1055dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 1056dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 1057dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "error: %s\n", adb_error()); 1058dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 1059dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1060dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1061dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1062dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* "adb /?" is a common idiom under Windows */ 1063dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(argv[0], "help") || !strcmp(argv[0], "/?")) { 1064dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project help(); 1065dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 1066dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1067dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1068dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(argv[0], "version")) { 1069dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project version(stdout); 1070dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 1071dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1072dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1073dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project usage(); 1074dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 1075dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 1076dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1077dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int do_cmd(transport_type ttype, char* serial, char *cmd, ...) 1078dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 1079dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *argv[16]; 1080dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int argc; 1081dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project va_list ap; 1082dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1083dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project va_start(ap, cmd); 1084dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argc = 0; 1085dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1086dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (serial) { 1087dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argv[argc++] = "-s"; 1088dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argv[argc++] = serial; 1089dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if (ttype == kTransportUsb) { 1090dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argv[argc++] = "-d"; 1091dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if (ttype == kTransportLocal) { 1092dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argv[argc++] = "-e"; 1093dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1094dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1095dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argv[argc++] = cmd; 1096dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while((argv[argc] = va_arg(ap, char*)) != 0) argc++; 1097dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project va_end(ap); 1098dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1099dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if 0 1100dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int n; 1101dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"argc = %d\n",argc); 1102dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for(n = 0; n < argc; n++) { 1103dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"argv[%d] = \"%s\"\n", n, argv[n]); 1104dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1105dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 1106dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1107dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return adb_commandline(argc, argv); 1108dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 1109dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1110dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint find_sync_dirs(const char *srcarg, 1111dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char **android_srcdir_out, char **data_srcdir_out) 1112dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 1113dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *android_srcdir, *data_srcdir; 1114dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1115dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(srcarg == NULL) { 1116dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project android_srcdir = product_file("system"); 1117dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project data_srcdir = product_file("data"); 1118dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 1119dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* srcarg may be "data", "system" or NULL. 1120dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * if srcarg is NULL, then both data and system are synced 1121dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 1122dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(strcmp(srcarg, "system") == 0) { 1123dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project android_srcdir = product_file("system"); 1124dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project data_srcdir = NULL; 1125dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if(strcmp(srcarg, "data") == 0) { 1126dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project android_srcdir = NULL; 1127dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project data_srcdir = product_file("data"); 1128dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 1129dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* It's not "system" or "data". 1130dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 1131dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 1132dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1133dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1134dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1135dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(android_srcdir_out != NULL) 1136dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *android_srcdir_out = android_srcdir; 1137dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project else 1138dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free(android_srcdir); 1139dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1140dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(data_srcdir_out != NULL) 1141dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *data_srcdir_out = data_srcdir; 1142dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project else 1143dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free(data_srcdir); 1144dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1145dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 1146dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 1147dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1148dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int pm_command(transport_type transport, char* serial, 1149dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int argc, char** argv) 1150dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 1151dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char buf[4096]; 1152dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1153dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project snprintf(buf, sizeof(buf), "shell:pm"); 1154dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1155dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while(argc-- > 0) { 1156dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *quoted; 1157dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1158dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project quoted = dupAndQuote(*argv++); 1159dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1160dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strncat(buf, " ", sizeof(buf)-1); 1161dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strncat(buf, quoted, sizeof(buf)-1); 1162dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free(quoted); 1163dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1164dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1165dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project send_shellcommand(transport, serial, buf); 1166dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 1167dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 1168dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1169dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint uninstall_app(transport_type transport, char* serial, int argc, char** argv) 1170dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 1171dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* if the user choose the -k option, we refuse to do it until devices are 1172dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project out with the option to uninstall the remaining data somehow (adb/ui) */ 1173dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (argc == 3 && strcmp(argv[1], "-k") == 0) 1174dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { 1175dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf( 1176dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "The -k option uninstalls the application while retaining the data/cache.\n" 1177dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "At the moment, there is no way to remove the remaining data.\n" 1178dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "You will have to reinstall the application with the same signature, and fully uninstall it.\n" 1179dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "If you truly wish to continue, execute 'adb shell pm uninstall -k %s'\n", argv[2]); 1180dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 1181dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1182dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1183dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* 'adb uninstall' takes the same arguments as 'pm uninstall' on device */ 1184dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return pm_command(transport, serial, argc, argv); 1185dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 1186dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1187dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int delete_file(transport_type transport, char* serial, char* filename) 1188dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 1189dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char buf[4096]; 1190dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char* quoted; 1191dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1192dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project snprintf(buf, sizeof(buf), "shell:rm "); 1193dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project quoted = dupAndQuote(filename); 1194dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strncat(buf, quoted, sizeof(buf)-1); 1195dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free(quoted); 1196dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1197dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project send_shellcommand(transport, serial, buf); 1198dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 1199dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 1200dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1201dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint install_app(transport_type transport, char* serial, int argc, char** argv) 1202dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 1203dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct stat st; 1204dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int err; 1205dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char *const WHERE = "/data/local/tmp/%s"; 1206dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char to[PATH_MAX]; 1207dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char* filename = argv[argc - 1]; 1208dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char* p; 1209dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1210dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project p = adb_dirstop(filename); 1211dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (p) { 1212dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project p++; 1213dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project snprintf(to, sizeof to, WHERE, p); 1214dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 1215dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project snprintf(to, sizeof to, WHERE, filename); 1216dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1217dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (p[0] == '\0') { 1218dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1219dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1220dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project err = stat(filename, &st); 1221dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (err != 0) { 1222dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "can't find '%s' to install\n", filename); 1223dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 1224dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1225dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!S_ISREG(st.st_mode)) { 1226dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "can't install '%s' because it's not a file\n", 1227dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project filename); 1228dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 1229dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1230dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1231dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!(err = do_sync_push(filename, to, 1 /* verify APK */))) { 1232dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* file in place; tell the Package Manager to install it */ 1233dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argv[argc - 1] = to; /* destination name, not source location */ 1234dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pm_command(transport, serial, argc, argv); 1235dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project delete_file(transport, serial, to); 1236dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1237dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1238dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return err; 1239dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 1240