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