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#define TRACE_TAG TRACE_ADB 18dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 19dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdio.h> 20dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdlib.h> 21dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <ctype.h> 22dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdarg.h> 23dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <errno.h> 24c7993af64baec271a238646bc20aaa846866c4a9Scott Anderson#include <stddef.h> 25dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <string.h> 26dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <time.h> 271f546e6d1f6ccd1964336ddf0d8e8b3b11b1e945Mike Lockwood#include <sys/time.h> 28cbb9891049628a2a89d566cade88c80ba1ba4a7bRay Donnelly#include <stdint.h> 29dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 30dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "sysdeps.h" 31dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "adb.h" 32d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby#include "adb_auth.h" 33dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 34e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) 35e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson 36dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if !ADB_HOST 37893a4a47e8c9290128b9254af0246e36f821c260Nick Kralevich#include <cutils/properties.h> 38dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <private/android_filesystem_config.h> 39e2864bf727d6a404bd871f063c03e36cc8eedeecNick Kralevich#include <sys/capability.h> 405f4b051235c3e9e9e5b34b4af885e42a1c711fc4Mike Lockwood#include <linux/prctl.h> 41885342a0f2c834a6b680284047c47c9d04b32565Jeff Sharkey#include <sys/mount.h> 42a09fbd164d2e088bc5433d310e25640ae048d47dXavier Ducrohet#else 43a09fbd164d2e088bc5433d310e25640ae048d47dXavier Ducrohet#include "usb_vendors.h" 44dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 45dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 46408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall#if ADB_TRACE 47408fa57864c01113deaa213e5c1848a9c594ae92JP AbgrallADB_MUTEX_DEFINE( D_lock ); 48408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall#endif 49dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 50dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint HOST = 0; 51d7b33085117ccbb908a883f624cb1fe5495ee92aMatt Gumbelint gListenAll = 0; 52dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 53d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Gobystatic int auth_enabled = 0; 54d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby 55e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson#if !ADB_HOST 56dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic const char *adb_device_banner = "device"; 57e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson#endif 58dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 59dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid fatal(const char *fmt, ...) 60dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 61dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project va_list ap; 62dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project va_start(ap, fmt); 63dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "error: "); 64dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project vfprintf(stderr, fmt, ap); 65dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "\n"); 66dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project va_end(ap); 67dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project exit(-1); 68dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 69dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 70dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid fatal_errno(const char *fmt, ...) 71dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 72dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project va_list ap; 73dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project va_start(ap, fmt); 74dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "error: %s: ", strerror(errno)); 75dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project vfprintf(stderr, fmt, ap); 76dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "\n"); 77dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project va_end(ap); 78dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project exit(-1); 79dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 80dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 81dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint adb_trace_mask; 82dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 83dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* read a comma/space/colum/semi-column separated list of tags 84dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * from the ADB_TRACE environment variable and build the trace 85dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * mask from it. note that '1' and 'all' are special cases to 86dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * enable all tracing 87dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 88dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid adb_trace_init(void) 89dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 90dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char* p = getenv("ADB_TRACE"); 91dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char* q; 92dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 93dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project static const struct { 94dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char* tag; 95dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int flag; 96dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } tags[] = { 97dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { "1", 0 }, 98dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { "all", 0 }, 99dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { "adb", TRACE_ADB }, 100dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { "sockets", TRACE_SOCKETS }, 101dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { "packets", TRACE_PACKETS }, 102dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { "rwx", TRACE_RWX }, 103dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { "usb", TRACE_USB }, 104dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { "sync", TRACE_SYNC }, 105dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { "sysdeps", TRACE_SYSDEPS }, 106dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { "transport", TRACE_TRANSPORT }, 107dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { "jdwp", TRACE_JDWP }, 108408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall { "services", TRACE_SERVICES }, 109d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby { "auth", TRACE_AUTH }, 110dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { NULL, 0 } 111dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project }; 112dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 113dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (p == NULL) 114dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return; 115dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 116dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* use a comma/column/semi-colum/space separated list */ 117dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while (*p) { 118dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int len, tagn; 119dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 120dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project q = strpbrk(p, " ,:;"); 121dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (q == NULL) { 122dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project q = p + strlen(p); 123dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 124dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project len = q - p; 125dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 126dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for (tagn = 0; tags[tagn].tag != NULL; tagn++) 127dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { 128dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int taglen = strlen(tags[tagn].tag); 129dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 130dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (len == taglen && !memcmp(tags[tagn].tag, p, len) ) 131dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { 132dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int flag = tags[tagn].flag; 133dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (flag == 0) { 134dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_trace_mask = ~0; 135dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return; 136dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 137dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_trace_mask |= (1 << flag); 138dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 139dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 140dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 141dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project p = q; 142dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (*p) 143dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project p++; 144dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 145dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 146dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 14728781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine#if !ADB_HOST 14828781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine/* 14928781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine * Implements ADB tracing inside the emulator. 15028781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine */ 15128781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine 15228781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine#include <stdarg.h> 15328781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine 15428781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine/* 15528781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine * Redefine open and write for qemu_pipe.h that contains inlined references 15628781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine * to those routines. We will redifine them back after qemu_pipe.h inclusion. 15728781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine */ 15828781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine 15928781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine#undef open 16028781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine#undef write 16128781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine#define open adb_open 16228781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine#define write adb_write 16328781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine#include <hardware/qemu_pipe.h> 16428781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine#undef open 16528781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine#undef write 16628781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine#define open ___xxx_open 16728781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine#define write ___xxx_write 16828781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine 16928781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine/* A handle to adb-debug qemud service in the emulator. */ 17028781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkineint adb_debug_qemu = -1; 17128781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine 17228781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine/* Initializes connection with the adb-debug qemud service in the emulator. */ 17328781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkinestatic int adb_qemu_trace_init(void) 17428781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine{ 17528781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine char con_name[32]; 17628781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine 17728781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine if (adb_debug_qemu >= 0) { 17828781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine return 0; 17928781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine } 18028781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine 18128781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine /* adb debugging QEMUD service connection request. */ 18228781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine snprintf(con_name, sizeof(con_name), "qemud:adb-debug"); 18328781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine adb_debug_qemu = qemu_pipe_open(con_name); 18428781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine return (adb_debug_qemu >= 0) ? 0 : -1; 18528781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine} 18628781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine 18728781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkinevoid adb_qemu_trace(const char* fmt, ...) 18828781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine{ 18928781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine va_list args; 19028781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine va_start(args, fmt); 19128781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine char msg[1024]; 19228781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine 19328781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine if (adb_debug_qemu >= 0) { 19428781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine vsnprintf(msg, sizeof(msg), fmt, args); 19528781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine adb_write(adb_debug_qemu, msg, strlen(msg)); 19628781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine } 19728781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine} 19828781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine#endif /* !ADB_HOST */ 199dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 200dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectapacket *get_apacket(void) 201dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 202dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project apacket *p = malloc(sizeof(apacket)); 203dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(p == 0) fatal("failed to allocate an apacket"); 204dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project memset(p, 0, sizeof(apacket) - MAX_PAYLOAD); 205dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return p; 206dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 207dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 208dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid put_apacket(apacket *p) 209dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 210dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free(p); 211dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 212dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 213d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Gobyvoid handle_online(atransport *t) 214dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 215dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project D("adb: online\n"); 216d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby t->online = 1; 217dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 218dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 219dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid handle_offline(atransport *t) 220dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 221dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project D("adb: offline\n"); 222dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project //Close the associated usb 223d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby t->online = 0; 224dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project run_transport_disconnects(t); 225dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 226dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 227d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby#if DEBUG_PACKETS 228dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define DUMPMAX 32 229dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid print_packet(const char *label, apacket *p) 230dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 231dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *tag; 232dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *x; 233dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project unsigned count; 234dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 235dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project switch(p->msg.command){ 236dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case A_SYNC: tag = "SYNC"; break; 237dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case A_CNXN: tag = "CNXN" ; break; 238dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case A_OPEN: tag = "OPEN"; break; 239dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case A_OKAY: tag = "OKAY"; break; 240dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case A_CLSE: tag = "CLSE"; break; 241dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case A_WRTE: tag = "WRTE"; break; 242d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby case A_AUTH: tag = "AUTH"; break; 243dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project default: tag = "????"; break; 244dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 245dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 246dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "%s: %s %08x %08x %04x \"", 247dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project label, tag, p->msg.arg0, p->msg.arg1, p->msg.data_length); 248dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project count = p->msg.data_length; 249dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project x = (char*) p->data; 250dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(count > DUMPMAX) { 251dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project count = DUMPMAX; 252dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tag = "\n"; 253dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 254dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tag = "\"\n"; 255dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 256dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while(count-- > 0){ 257dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if((*x >= ' ') && (*x < 127)) { 258dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fputc(*x, stderr); 259dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 260dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fputc('.', stderr); 261dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 262dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project x++; 263dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 264d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby fputs(tag, stderr); 265dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 266dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 267dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 268dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void send_ready(unsigned local, unsigned remote, atransport *t) 269dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 270dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project D("Calling send_ready \n"); 271dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project apacket *p = get_apacket(); 272dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project p->msg.command = A_OKAY; 273dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project p->msg.arg0 = local; 274dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project p->msg.arg1 = remote; 275dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project send_packet(p, t); 276dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 277dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 278dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void send_close(unsigned local, unsigned remote, atransport *t) 279dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 280dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project D("Calling send_close \n"); 281dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project apacket *p = get_apacket(); 282dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project p->msg.command = A_CLSE; 283dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project p->msg.arg0 = local; 284dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project p->msg.arg1 = remote; 285dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project send_packet(p, t); 286dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 287dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 288e82c2db05cae70a0490a1f84b7211ef42c329671Scott Andersonstatic size_t fill_connect_data(char *buf, size_t bufsize) 289e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson{ 290e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson#if ADB_HOST 291e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson return snprintf(buf, bufsize, "host::") + 1; 292e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson#else 293e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson static const char *cnxn_props[] = { 294e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson "ro.product.name", 295e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson "ro.product.model", 296e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson "ro.product.device", 297e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson }; 298e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson static const int num_cnxn_props = ARRAY_SIZE(cnxn_props); 299e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson int i; 300e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson size_t remaining = bufsize; 301e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson size_t len; 302e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson 303e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson len = snprintf(buf, remaining, "%s::", adb_device_banner); 304e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson remaining -= len; 305e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson buf += len; 306e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson for (i = 0; i < num_cnxn_props; i++) { 307e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson char value[PROPERTY_VALUE_MAX]; 308e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson property_get(cnxn_props[i], value, ""); 309e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson len = snprintf(buf, remaining, "%s=%s;", cnxn_props[i], value); 310e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson remaining -= len; 311e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson buf += len; 312e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson } 313e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson 314e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson return bufsize - remaining + 1; 315e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson#endif 316e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson} 317e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson 318dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void send_connect(atransport *t) 319dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 320dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project D("Calling send_connect \n"); 321dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project apacket *cp = get_apacket(); 322dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project cp->msg.command = A_CNXN; 323dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project cp->msg.arg0 = A_VERSION; 324dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project cp->msg.arg1 = MAX_PAYLOAD; 325e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson cp->msg.data_length = fill_connect_data((char *)cp->data, 326e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson sizeof(cp->data)); 327dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project send_packet(cp, t); 328d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby} 329d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby 330045a4a9c3a317e60ab1078f5a689bf302ee2ab19Benoit Gobyvoid send_auth_request(atransport *t) 331d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby{ 332d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby D("Calling send_auth_request\n"); 333d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby apacket *p; 334d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby int ret; 335d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby 336d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby ret = adb_auth_generate_token(t->token, sizeof(t->token)); 337d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby if (ret != sizeof(t->token)) { 338d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby D("Error generating token ret=%d\n", ret); 339d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby return; 340d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby } 341d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby 342d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby p = get_apacket(); 343d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby memcpy(p->data, t->token, ret); 344d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby p->msg.command = A_AUTH; 345d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby p->msg.arg0 = ADB_AUTH_TOKEN; 346d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby p->msg.data_length = ret; 347d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby send_packet(p, t); 348d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby} 349d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby 350d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Gobystatic void send_auth_response(uint8_t *token, size_t token_size, atransport *t) 351d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby{ 352d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby D("Calling send_auth_response\n"); 353d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby apacket *p = get_apacket(); 354d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby int ret; 355d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby 356d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby ret = adb_auth_sign(t->key, token, token_size, p->data); 357d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby if (!ret) { 358d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby D("Error signing the token\n"); 359d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby put_apacket(p); 360d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby return; 361d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby } 362d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby 363d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby p->msg.command = A_AUTH; 364d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby p->msg.arg0 = ADB_AUTH_SIGNATURE; 365d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby p->msg.data_length = ret; 366d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby send_packet(p, t); 367d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby} 368d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby 369d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Gobystatic void send_auth_publickey(atransport *t) 370d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby{ 371d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby D("Calling send_auth_publickey\n"); 372d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby apacket *p = get_apacket(); 373d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby int ret; 374d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby 375d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby ret = adb_auth_get_userkey(p->data, sizeof(p->data)); 376d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby if (!ret) { 377d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby D("Failed to get user public key\n"); 378d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby put_apacket(p); 379d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby return; 380d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby } 381d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby 382d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby p->msg.command = A_AUTH; 383d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby p->msg.arg0 = ADB_AUTH_RSAPUBLICKEY; 384d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby p->msg.data_length = ret; 385d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby send_packet(p, t); 386d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby} 387d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby 388d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Gobyvoid adb_auth_verified(atransport *t) 389d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby{ 390d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby handle_online(t); 391d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby send_connect(t); 392dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 393dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 394dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic char *connection_state_name(atransport *t) 395dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 396dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (t == NULL) { 397dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return "unknown"; 398dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 399dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 400dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project switch(t->connection_state) { 401dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case CS_BOOTLOADER: 402dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return "bootloader"; 403dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case CS_DEVICE: 404dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return "device"; 405a5ad539cff9dba92650425b8bec79c071ef5993btrevd case CS_RECOVERY: 406a5ad539cff9dba92650425b8bec79c071ef5993btrevd return "recovery"; 407a5ad539cff9dba92650425b8bec79c071ef5993btrevd case CS_SIDELOAD: 408a5ad539cff9dba92650425b8bec79c071ef5993btrevd return "sideload"; 409dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case CS_OFFLINE: 410dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return "offline"; 41177e8e5851d3b951b5382663bd50f1f83cb531eb2Benoit Goby case CS_UNAUTHORIZED: 41277e8e5851d3b951b5382663bd50f1f83cb531eb2Benoit Goby return "unauthorized"; 413dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project default: 414dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return "unknown"; 415dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 416dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 417dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 418e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson/* qual_overwrite is used to overwrite a qualifier string. dst is a 419e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson * pointer to a char pointer. It is assumed that if *dst is non-NULL, it 4202ca3e6b35f79136418ebc32fef57580698dbd045Scott Anderson * was malloc'ed and needs to freed. *dst will be set to a dup of src. 421e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson */ 422e82c2db05cae70a0490a1f84b7211ef42c329671Scott Andersonstatic void qual_overwrite(char **dst, const char *src) 423e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson{ 424e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson if (!dst) 425e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson return; 426e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson 427e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson free(*dst); 428e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson *dst = NULL; 429e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson 430e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson if (!src || !*src) 431e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson return; 432e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson 433e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson *dst = strdup(src); 434e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson} 435e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson 436dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid parse_banner(char *banner, atransport *t) 437dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 438e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson static const char *prop_seps = ";"; 439e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson static const char key_val_sep = '='; 4402ca3e6b35f79136418ebc32fef57580698dbd045Scott Anderson char *cp; 4412ca3e6b35f79136418ebc32fef57580698dbd045Scott Anderson char *type; 442dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 443dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project D("parse_banner: %s\n", banner); 444dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project type = banner; 445e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson cp = strchr(type, ':'); 446e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson if (cp) { 447e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson *cp++ = 0; 448e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson /* Nothing is done with second field. */ 449e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson cp = strchr(cp, ':'); 450e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson if (cp) { 451e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson char *save; 452e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson char *key; 4531b7a7e81195ff06a7482f81cb92b094bb3481cb1Scott Anderson key = adb_strtok_r(cp + 1, prop_seps, &save); 454e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson while (key) { 455e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson cp = strchr(key, key_val_sep); 456e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson if (cp) { 457e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson *cp++ = '\0'; 458e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson if (!strcmp(key, "ro.product.name")) 459e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson qual_overwrite(&t->product, cp); 460e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson else if (!strcmp(key, "ro.product.model")) 461e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson qual_overwrite(&t->model, cp); 462e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson else if (!strcmp(key, "ro.product.device")) 463e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson qual_overwrite(&t->device, cp); 464e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson } 4651b7a7e81195ff06a7482f81cb92b094bb3481cb1Scott Anderson key = adb_strtok_r(NULL, prop_seps, &save); 466e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson } 467e82c2db05cae70a0490a1f84b7211ef42c329671Scott Anderson } 468dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 469dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 470dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(type, "bootloader")){ 471dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project D("setting connection_state to CS_BOOTLOADER\n"); 472dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project t->connection_state = CS_BOOTLOADER; 473dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project update_transports(); 474dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return; 475dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 476dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 477dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(type, "device")) { 478dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project D("setting connection_state to CS_DEVICE\n"); 479dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project t->connection_state = CS_DEVICE; 480dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project update_transports(); 481dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return; 482dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 483dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 484dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(type, "recovery")) { 485dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project D("setting connection_state to CS_RECOVERY\n"); 486dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project t->connection_state = CS_RECOVERY; 487dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project update_transports(); 488dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return; 489dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 490dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 491447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker if(!strcmp(type, "sideload")) { 492447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker D("setting connection_state to CS_SIDELOAD\n"); 493447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker t->connection_state = CS_SIDELOAD; 494447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker update_transports(); 495447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker return; 496447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker } 497447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker 498dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project t->connection_state = CS_HOST; 499dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 500dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 501dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid handle_packet(apacket *p, atransport *t) 502dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 503dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project asocket *s; 504dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 505899913f8168b54e00971c0e8d4ae16d06a4651feViral Mehta D("handle_packet() %c%c%c%c\n", ((char*) (&(p->msg.command)))[0], 506899913f8168b54e00971c0e8d4ae16d06a4651feViral Mehta ((char*) (&(p->msg.command)))[1], 507899913f8168b54e00971c0e8d4ae16d06a4651feViral Mehta ((char*) (&(p->msg.command)))[2], 508899913f8168b54e00971c0e8d4ae16d06a4651feViral Mehta ((char*) (&(p->msg.command)))[3]); 509dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project print_packet("recv", p); 510dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 511dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project switch(p->msg.command){ 512dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case A_SYNC: 513dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(p->msg.arg0){ 514dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project send_packet(p, t); 515dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(HOST) send_connect(t); 516dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 517dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project t->connection_state = CS_OFFLINE; 518dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project handle_offline(t); 519dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project send_packet(p, t); 520dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 521dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return; 522dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 523dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case A_CNXN: /* CONNECT(version, maxdata, "system-id-string") */ 524dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* XXX verify version, etc */ 525dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(t->connection_state != CS_OFFLINE) { 526dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project t->connection_state = CS_OFFLINE; 527dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project handle_offline(t); 528dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 529d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby 530dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project parse_banner((char*) p->data, t); 531d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby 532d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby if (HOST || !auth_enabled) { 533d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby handle_online(t); 534d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby if(!HOST) send_connect(t); 535d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby } else { 536d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby send_auth_request(t); 537d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby } 538d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby break; 539d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby 540d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby case A_AUTH: 541d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby if (p->msg.arg0 == ADB_AUTH_TOKEN) { 54277e8e5851d3b951b5382663bd50f1f83cb531eb2Benoit Goby t->connection_state = CS_UNAUTHORIZED; 543d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby t->key = adb_auth_nextkey(t->key); 544d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby if (t->key) { 545d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby send_auth_response(p->data, p->msg.data_length, t); 546d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby } else { 547d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby /* No more private keys to try, send the public key */ 548d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby send_auth_publickey(t); 549d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby } 550d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby } else if (p->msg.arg0 == ADB_AUTH_SIGNATURE) { 551d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby if (adb_auth_verify(t->token, p->data, p->msg.data_length)) { 552d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby adb_auth_verified(t); 553d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby t->failed_auth_attempts = 0; 554d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby } else { 555d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby if (t->failed_auth_attempts++ > 10) 556d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby adb_sleep_ms(1000); 557d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby send_auth_request(t); 558d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby } 559d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby } else if (p->msg.arg0 == ADB_AUTH_RSAPUBLICKEY) { 560d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby adb_auth_confirm_key(p->data, p->msg.data_length, t); 561d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby } 562dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 563dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 564dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case A_OPEN: /* OPEN(local-id, 0, "destination") */ 565d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby if (t->online) { 566dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *name = (char*) p->data; 567dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project name[p->msg.data_length > 0 ? p->msg.data_length - 1 : 0] = 0; 568dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project s = create_local_service_socket(name); 569dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(s == 0) { 570dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project send_close(0, p->msg.arg0, t); 571dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 572dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project s->peer = create_remote_socket(p->msg.arg0, t); 573dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project s->peer->peer = s; 574dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project send_ready(s->id, s->peer->id, t); 575dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project s->ready(s); 576dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 577dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 578dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 579dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 580dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case A_OKAY: /* READY(local-id, remote-id, "") */ 581d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby if (t->online) { 582dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if((s = find_local_socket(p->msg.arg1))) { 583dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(s->peer == 0) { 584dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project s->peer = create_remote_socket(p->msg.arg0, t); 585dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project s->peer->peer = s; 586dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 587dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project s->ready(s); 588dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 589dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 590dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 591dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 592dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case A_CLSE: /* CLOSE(local-id, remote-id, "") */ 593d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby if (t->online) { 594dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if((s = find_local_socket(p->msg.arg1))) { 595dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project s->close(s); 596dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 597dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 598dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 599dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 600dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case A_WRTE: 601d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby if (t->online) { 602dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if((s = find_local_socket(p->msg.arg1))) { 603dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project unsigned rid = p->msg.arg0; 604dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project p->len = p->msg.data_length; 605dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 606dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(s->enqueue(s, p) == 0) { 607dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project D("Enqueue the socket\n"); 608dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project send_ready(s->id, rid, t); 609dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 610dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return; 611dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 612dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 613dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 614dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 615dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project default: 616dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("handle_packet: what is %08x?!\n", p->msg.command); 617dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 618dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 619dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project put_apacket(p); 620dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 621dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 622dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectalistener listener_list = { 623dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project .next = &listener_list, 624dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project .prev = &listener_list, 625dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}; 626dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 627dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void ss_listener_event_func(int _fd, unsigned ev, void *_l) 628dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 629dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project asocket *s; 630dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 631dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(ev & FDE_READ) { 632dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct sockaddr addr; 633dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project socklen_t alen; 634dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int fd; 635dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 636dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project alen = sizeof(addr); 637dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fd = adb_socket_accept(_fd, &addr, &alen); 638dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(fd < 0) return; 639dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 640dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_socket_setbufsize(fd, CHUNK_SIZE); 641dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 642dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project s = create_local_socket(fd); 643dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(s) { 644dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project connect_to_smartsocket(s); 645dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return; 646dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 647dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 648dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_close(fd); 649dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 650dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 651dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 652dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void listener_event_func(int _fd, unsigned ev, void *_l) 653dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 654dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project alistener *l = _l; 655dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project asocket *s; 656dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 657dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(ev & FDE_READ) { 658dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct sockaddr addr; 659dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project socklen_t alen; 660dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int fd; 661dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 662dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project alen = sizeof(addr); 663dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fd = adb_socket_accept(_fd, &addr, &alen); 664dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(fd < 0) return; 665dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 666dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project s = create_local_socket(fd); 667dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(s) { 668dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project s->transport = l->transport; 669dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project connect_to_remote(s, l->connect_to); 670dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return; 671dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 672dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 673dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_close(fd); 674dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 675dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 676dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 677dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void free_listener(alistener* l) 678dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 679dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (l->next) { 680dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project l->next->prev = l->prev; 681dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project l->prev->next = l->next; 682dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project l->next = l->prev = l; 683dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 684dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 685dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // closes the corresponding fd 686dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fdevent_remove(&l->fde); 687dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 688dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (l->local_name) 689dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free((char*)l->local_name); 690dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 691dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (l->connect_to) 692dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free((char*)l->connect_to); 693dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 694dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (l->transport) { 695dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project remove_transport_disconnect(l->transport, &l->disconnect); 696dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 697dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free(l); 698dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 699dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 700dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void listener_disconnect(void* _l, atransport* t) 701dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 702dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project alistener* l = _l; 703dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 704dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free_listener(l); 705dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 706dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 707dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint local_name_to_fd(const char *name) 708dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 709dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int port; 710dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 711dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strncmp("tcp:", name, 4)){ 712dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int ret; 713dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project port = atoi(name + 4); 714d7b33085117ccbb908a883f624cb1fe5495ee92aMatt Gumbel 715d7b33085117ccbb908a883f624cb1fe5495ee92aMatt Gumbel if (gListenAll > 0) { 716d7b33085117ccbb908a883f624cb1fe5495ee92aMatt Gumbel ret = socket_inaddr_any_server(port, SOCK_STREAM); 717d7b33085117ccbb908a883f624cb1fe5495ee92aMatt Gumbel } else { 718d7b33085117ccbb908a883f624cb1fe5495ee92aMatt Gumbel ret = socket_loopback_server(port, SOCK_STREAM); 719d7b33085117ccbb908a883f624cb1fe5495ee92aMatt Gumbel } 720d7b33085117ccbb908a883f624cb1fe5495ee92aMatt Gumbel 721dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return ret; 722dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 723dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifndef HAVE_WIN32_IPC /* no Unix-domain sockets on Win32 */ 724dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // It's non-sensical to support the "reserved" space on the adb host side 725dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strncmp(name, "local:", 6)) { 726dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return socket_local_server(name + 6, 727dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ANDROID_SOCKET_NAMESPACE_ABSTRACT, SOCK_STREAM); 728dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if(!strncmp(name, "localabstract:", 14)) { 729dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return socket_local_server(name + 14, 730dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ANDROID_SOCKET_NAMESPACE_ABSTRACT, SOCK_STREAM); 731dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if(!strncmp(name, "localfilesystem:", 16)) { 732dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return socket_local_server(name + 16, 733dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ANDROID_SOCKET_NAMESPACE_FILESYSTEM, SOCK_STREAM); 734dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 735dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 736dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 737dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("unknown local portname '%s'\n", name); 738dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 739dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 740dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 7410d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner// Write a single line describing a listener to a user-provided buffer. 7420d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner// Appends a trailing zero, even in case of truncation, but the function 7430d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner// returns the full line length. 7440d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner// If |buffer| is NULL, does not write but returns required size. 7450d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turnerstatic int format_listener(alistener* l, char* buffer, size_t buffer_len) { 7460d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner // Format is simply: 7470d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner // 7480d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner // <device-serial> " " <local-name> " " <remote-name> "\n" 7490d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner // 7500d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner int local_len = strlen(l->local_name); 7510d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner int connect_len = strlen(l->connect_to); 7520d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner int serial_len = strlen(l->transport->serial); 7530d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner 7540d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner if (buffer != NULL) { 7550d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner snprintf(buffer, buffer_len, "%s %s %s\n", 7560d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner l->transport->serial, l->local_name, l->connect_to); 7570d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner } 7580d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner // NOTE: snprintf() on Windows returns -1 in case of truncation, so 7590d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner // return the computed line length instead. 7600d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner return local_len + connect_len + serial_len + 3; 7610d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner} 7620d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner 7630d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner// Write the list of current listeners (network redirections) into a 7640d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner// user-provided buffer. Appends a trailing zero, even in case of 7650d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner// trunctaion, but return the full size in bytes. 7660d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner// If |buffer| is NULL, does not write but returns required size. 7670d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turnerstatic int format_listeners(char* buf, size_t buflen) 7680d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner{ 7690d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner alistener* l; 7700d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner int result = 0; 7710d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner for (l = listener_list.next; l != &listener_list; l = l->next) { 7720d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner // Ignore special listeners like those for *smartsocket* 7730d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner if (l->connect_to[0] == '*') 7740d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner continue; 7750d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner int len = format_listener(l, buf, buflen); 7760d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner // Ensure there is space for the trailing zero. 7770d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner result += len; 7780d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner if (buf != NULL) { 7790d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner buf += len; 7800d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner buflen -= len; 7810d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner if (buflen <= 0) 7820d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner break; 7830d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner } 7840d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner } 7850d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner return result; 7860d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner} 7870d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner 7880d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turnerstatic int remove_listener(const char *local_name, atransport* transport) 789dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 790dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project alistener *l; 791dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 792dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for (l = listener_list.next; l != &listener_list; l = l->next) { 7930d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner if (!strcmp(local_name, l->local_name)) { 7940d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner listener_disconnect(l, l->transport); 795dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 796dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 797dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 798dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 799dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 800dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 8010d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turnerstatic void remove_all_listeners(void) 8020d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner{ 8030d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner alistener *l, *l_next; 8040d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner for (l = listener_list.next; l != &listener_list; l = l_next) { 8050d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner l_next = l->next; 8060d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner // Never remove smart sockets. 8070d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner if (l->connect_to[0] == '*') 8080d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner continue; 8090d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner listener_disconnect(l, l->transport); 8100d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner } 8110d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner} 8120d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner 8130d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner// error/status codes for install_listener. 8140d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turnertypedef enum { 8150d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner INSTALL_STATUS_OK = 0, 8160d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner INSTALL_STATUS_INTERNAL_ERROR = -1, 8170d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner INSTALL_STATUS_CANNOT_BIND = -2, 8180d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner INSTALL_STATUS_CANNOT_REBIND = -3, 8190d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner} install_status_t; 8200d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner 8210d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turnerstatic install_status_t install_listener(const char *local_name, 8220d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner const char *connect_to, 8230d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner atransport* transport, 8240d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner int no_rebind) 825dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 826dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project alistener *l; 827dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 828dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project //printf("install_listener('%s','%s')\n", local_name, connect_to); 829dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 830dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for(l = listener_list.next; l != &listener_list; l = l->next){ 831dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(strcmp(local_name, l->local_name) == 0) { 832dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *cto; 833dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 834dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* can't repurpose a smartsocket */ 835dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(l->connect_to[0] == '*') { 8360d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner return INSTALL_STATUS_INTERNAL_ERROR; 8370d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner } 8380d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner 8390d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner /* can't repurpose a listener if 'no_rebind' is true */ 8400d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner if (no_rebind) { 8410d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner return INSTALL_STATUS_CANNOT_REBIND; 842dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 843dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 844dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project cto = strdup(connect_to); 845dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(cto == 0) { 8460d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner return INSTALL_STATUS_INTERNAL_ERROR; 847dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 848dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 849dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project //printf("rebinding '%s' to '%s'\n", local_name, connect_to); 850dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free((void*) l->connect_to); 851dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project l->connect_to = cto; 852dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (l->transport != transport) { 853dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project remove_transport_disconnect(l->transport, &l->disconnect); 854dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project l->transport = transport; 855dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project add_transport_disconnect(l->transport, &l->disconnect); 856dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 8570d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner return INSTALL_STATUS_OK; 858dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 859dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 860dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 861dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if((l = calloc(1, sizeof(alistener))) == 0) goto nomem; 862dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if((l->local_name = strdup(local_name)) == 0) goto nomem; 863dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if((l->connect_to = strdup(connect_to)) == 0) goto nomem; 864dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 865dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 866dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project l->fd = local_name_to_fd(local_name); 867dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(l->fd < 0) { 868dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free((void*) l->local_name); 869dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free((void*) l->connect_to); 870dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free(l); 871dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("cannot bind '%s'\n", local_name); 872dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -2; 873dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 874dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 875dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project close_on_exec(l->fd); 876dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(l->connect_to, "*smartsocket*")) { 877dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fdevent_install(&l->fde, l->fd, ss_listener_event_func, l); 878dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 879dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fdevent_install(&l->fde, l->fd, listener_event_func, l); 880dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 881dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fdevent_set(&l->fde, FDE_READ); 882dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 883dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project l->next = &listener_list; 884dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project l->prev = listener_list.prev; 885dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project l->next->prev = l; 886dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project l->prev->next = l; 887dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project l->transport = transport; 888dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 889dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (transport) { 890dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project l->disconnect.opaque = l; 891dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project l->disconnect.func = listener_disconnect; 892dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project add_transport_disconnect(transport, &l->disconnect); 893dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 8940d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner return INSTALL_STATUS_OK; 895dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 896dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectnomem: 897dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fatal("cannot allocate listener"); 8980d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner return INSTALL_STATUS_INTERNAL_ERROR; 899dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 900dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 901dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef HAVE_WIN32_PROC 902dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic BOOL WINAPI ctrlc_handler(DWORD type) 903dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 904dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project exit(STATUS_CONTROL_C_EXIT); 905dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return TRUE; 906dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 907dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 908dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 909dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void adb_cleanup(void) 910dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 911dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project usb_cleanup(); 912dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 913dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 914dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid start_logging(void) 915dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 916dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef HAVE_WIN32_PROC 917dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char temp[ MAX_PATH ]; 918dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project FILE* fnul; 919dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project FILE* flog; 920dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 921dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project GetTempPath( sizeof(temp) - 8, temp ); 922dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strcat( temp, "adb.log" ); 923dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 924dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* Win32 specific redirections */ 925dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fnul = fopen( "NUL", "rt" ); 926dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (fnul != NULL) 927dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project stdin[0] = fnul[0]; 928dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 929dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project flog = fopen( temp, "at" ); 930dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (flog == NULL) 931dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project flog = fnul; 932dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 933dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project setvbuf( flog, NULL, _IONBF, 0 ); 934dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 935dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project stdout[0] = flog[0]; 936dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project stderr[0] = flog[0]; 937dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"--- adb starting (pid %d) ---\n", getpid()); 938dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#else 939dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int fd; 940dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 941dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fd = unix_open("/dev/null", O_RDONLY); 942dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project dup2(fd, 0); 943408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall adb_close(fd); 944dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 945dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fd = unix_open("/tmp/adb.log", O_WRONLY | O_CREAT | O_APPEND, 0640); 946dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(fd < 0) { 947dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fd = unix_open("/dev/null", O_WRONLY); 948dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 949dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project dup2(fd, 1); 950dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project dup2(fd, 2); 951408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall adb_close(fd); 952dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"--- adb starting (pid %d) ---\n", getpid()); 953dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 954dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 955dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 956dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if !ADB_HOST 957dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid start_device_log(void) 958dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 959dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int fd; 9601f546e6d1f6ccd1964336ddf0d8e8b3b11b1e945Mike Lockwood char path[PATH_MAX]; 9611f546e6d1f6ccd1964336ddf0d8e8b3b11b1e945Mike Lockwood struct tm now; 9621f546e6d1f6ccd1964336ddf0d8e8b3b11b1e945Mike Lockwood time_t t; 9631f546e6d1f6ccd1964336ddf0d8e8b3b11b1e945Mike Lockwood char value[PROPERTY_VALUE_MAX]; 9641f546e6d1f6ccd1964336ddf0d8e8b3b11b1e945Mike Lockwood 9651f546e6d1f6ccd1964336ddf0d8e8b3b11b1e945Mike Lockwood // read the trace mask from persistent property persist.adb.trace_mask 9661f546e6d1f6ccd1964336ddf0d8e8b3b11b1e945Mike Lockwood // give up if the property is not set or cannot be parsed 9671f546e6d1f6ccd1964336ddf0d8e8b3b11b1e945Mike Lockwood property_get("persist.adb.trace_mask", value, ""); 9681f546e6d1f6ccd1964336ddf0d8e8b3b11b1e945Mike Lockwood if (sscanf(value, "%x", &adb_trace_mask) != 1) 9691f546e6d1f6ccd1964336ddf0d8e8b3b11b1e945Mike Lockwood return; 970dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 9711f546e6d1f6ccd1964336ddf0d8e8b3b11b1e945Mike Lockwood adb_mkdir("/data/adb", 0775); 9721f546e6d1f6ccd1964336ddf0d8e8b3b11b1e945Mike Lockwood tzset(); 9731f546e6d1f6ccd1964336ddf0d8e8b3b11b1e945Mike Lockwood time(&t); 9741f546e6d1f6ccd1964336ddf0d8e8b3b11b1e945Mike Lockwood localtime_r(&t, &now); 9751f546e6d1f6ccd1964336ddf0d8e8b3b11b1e945Mike Lockwood strftime(path, sizeof(path), 9761f546e6d1f6ccd1964336ddf0d8e8b3b11b1e945Mike Lockwood "/data/adb/adb-%Y-%m-%d-%H-%M-%S.txt", 9771f546e6d1f6ccd1964336ddf0d8e8b3b11b1e945Mike Lockwood &now); 9781f546e6d1f6ccd1964336ddf0d8e8b3b11b1e945Mike Lockwood fd = unix_open(path, O_WRONLY | O_CREAT | O_TRUNC, 0640); 979dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (fd < 0) 980dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return; 981dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 982dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // redirect stdout and stderr to the log file 983dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project dup2(fd, 1); 984dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project dup2(fd, 2); 985dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"--- adb starting (pid %d) ---\n", getpid()); 98695ef82866c7a922bf588027aa38c58a45eb84d9cBenoit Goby adb_close(fd); 987dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 988dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fd = unix_open("/dev/null", O_RDONLY); 989dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project dup2(fd, 0); 99095ef82866c7a922bf588027aa38c58a45eb84d9cBenoit Goby adb_close(fd); 991dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 992dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 993dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 994dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if ADB_HOST 995571c1367682c83cb23481cc9c1028c8588a1fed0JP Abgrall 996571c1367682c83cb23481cc9c1028c8588a1fed0JP Abgrall#ifdef WORKAROUND_BUG6558362 997571c1367682c83cb23481cc9c1028c8588a1fed0JP Abgrall#include <sched.h> 998571c1367682c83cb23481cc9c1028c8588a1fed0JP Abgrall#define AFFINITY_ENVVAR "ADB_CPU_AFFINITY_BUG6558362" 999571c1367682c83cb23481cc9c1028c8588a1fed0JP Abgrallvoid adb_set_affinity(void) 1000571c1367682c83cb23481cc9c1028c8588a1fed0JP Abgrall{ 1001571c1367682c83cb23481cc9c1028c8588a1fed0JP Abgrall cpu_set_t cpu_set; 1002571c1367682c83cb23481cc9c1028c8588a1fed0JP Abgrall const char* cpunum_str = getenv(AFFINITY_ENVVAR); 1003571c1367682c83cb23481cc9c1028c8588a1fed0JP Abgrall char* strtol_res; 1004571c1367682c83cb23481cc9c1028c8588a1fed0JP Abgrall int cpu_num; 1005571c1367682c83cb23481cc9c1028c8588a1fed0JP Abgrall 1006571c1367682c83cb23481cc9c1028c8588a1fed0JP Abgrall if (!cpunum_str || !*cpunum_str) 1007571c1367682c83cb23481cc9c1028c8588a1fed0JP Abgrall return; 1008571c1367682c83cb23481cc9c1028c8588a1fed0JP Abgrall cpu_num = strtol(cpunum_str, &strtol_res, 0); 1009571c1367682c83cb23481cc9c1028c8588a1fed0JP Abgrall if (*strtol_res != '\0') 1010571c1367682c83cb23481cc9c1028c8588a1fed0JP Abgrall fatal("bad number (%s) in env var %s. Expecting 0..n.\n", cpunum_str, AFFINITY_ENVVAR); 1011571c1367682c83cb23481cc9c1028c8588a1fed0JP Abgrall 1012571c1367682c83cb23481cc9c1028c8588a1fed0JP Abgrall sched_getaffinity(0, sizeof(cpu_set), &cpu_set); 1013571c1367682c83cb23481cc9c1028c8588a1fed0JP Abgrall D("orig cpu_set[0]=0x%08lx\n", cpu_set.__bits[0]); 1014571c1367682c83cb23481cc9c1028c8588a1fed0JP Abgrall CPU_ZERO(&cpu_set); 1015571c1367682c83cb23481cc9c1028c8588a1fed0JP Abgrall CPU_SET(cpu_num, &cpu_set); 1016571c1367682c83cb23481cc9c1028c8588a1fed0JP Abgrall sched_setaffinity(0, sizeof(cpu_set), &cpu_set); 1017571c1367682c83cb23481cc9c1028c8588a1fed0JP Abgrall sched_getaffinity(0, sizeof(cpu_set), &cpu_set); 1018571c1367682c83cb23481cc9c1028c8588a1fed0JP Abgrall D("new cpu_set[0]=0x%08lx\n", cpu_set.__bits[0]); 1019571c1367682c83cb23481cc9c1028c8588a1fed0JP Abgrall} 1020571c1367682c83cb23481cc9c1028c8588a1fed0JP Abgrall#endif 1021571c1367682c83cb23481cc9c1028c8588a1fed0JP Abgrall 1022a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzingerint launch_server(int server_port) 1023dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 1024dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef HAVE_WIN32_PROC 1025dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* we need to start the server in the background */ 1026dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* we create a PIPE that will be used to wait for the server's "OK" */ 1027dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* message since the pipe handles must be inheritable, we use a */ 1028dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* security attribute */ 1029dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project HANDLE pipe_read, pipe_write; 1030267aa8b00eadf273321e492026af74b7baad890eRay Donnelly HANDLE stdout_handle, stderr_handle; 1031dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SECURITY_ATTRIBUTES sa; 1032dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project STARTUPINFO startup; 1033dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project PROCESS_INFORMATION pinfo; 1034dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char program_path[ MAX_PATH ]; 1035dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int ret; 1036dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1037dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sa.nLength = sizeof(sa); 1038dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sa.lpSecurityDescriptor = NULL; 1039dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sa.bInheritHandle = TRUE; 1040dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1041dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* create pipe, and ensure its read handle isn't inheritable */ 1042dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ret = CreatePipe( &pipe_read, &pipe_write, &sa, 0 ); 1043dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!ret) { 1044dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "CreatePipe() failure, error %ld\n", GetLastError() ); 1045dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 1046dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1047dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1048dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SetHandleInformation( pipe_read, HANDLE_FLAG_INHERIT, 0 ); 1049dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1050267aa8b00eadf273321e492026af74b7baad890eRay Donnelly /* Some programs want to launch an adb command and collect its output by 1051267aa8b00eadf273321e492026af74b7baad890eRay Donnelly * calling CreateProcess with inheritable stdout/stderr handles, then 1052267aa8b00eadf273321e492026af74b7baad890eRay Donnelly * using read() to get its output. When this happens, the stdout/stderr 1053267aa8b00eadf273321e492026af74b7baad890eRay Donnelly * handles passed to the adb client process will also be inheritable. 1054267aa8b00eadf273321e492026af74b7baad890eRay Donnelly * When starting the adb server here, care must be taken to reset them 1055267aa8b00eadf273321e492026af74b7baad890eRay Donnelly * to non-inheritable. 1056267aa8b00eadf273321e492026af74b7baad890eRay Donnelly * Otherwise, something bad happens: even if the adb command completes, 1057267aa8b00eadf273321e492026af74b7baad890eRay Donnelly * the calling process is stuck while read()-ing from the stdout/stderr 1058267aa8b00eadf273321e492026af74b7baad890eRay Donnelly * descriptors, because they're connected to corresponding handles in the 1059267aa8b00eadf273321e492026af74b7baad890eRay Donnelly * adb server process (even if the latter never uses/writes to them). 1060267aa8b00eadf273321e492026af74b7baad890eRay Donnelly */ 1061267aa8b00eadf273321e492026af74b7baad890eRay Donnelly stdout_handle = GetStdHandle( STD_OUTPUT_HANDLE ); 1062267aa8b00eadf273321e492026af74b7baad890eRay Donnelly stderr_handle = GetStdHandle( STD_ERROR_HANDLE ); 1063267aa8b00eadf273321e492026af74b7baad890eRay Donnelly if (stdout_handle != INVALID_HANDLE_VALUE) { 1064267aa8b00eadf273321e492026af74b7baad890eRay Donnelly SetHandleInformation( stdout_handle, HANDLE_FLAG_INHERIT, 0 ); 1065267aa8b00eadf273321e492026af74b7baad890eRay Donnelly } 1066267aa8b00eadf273321e492026af74b7baad890eRay Donnelly if (stderr_handle != INVALID_HANDLE_VALUE) { 1067267aa8b00eadf273321e492026af74b7baad890eRay Donnelly SetHandleInformation( stderr_handle, HANDLE_FLAG_INHERIT, 0 ); 1068267aa8b00eadf273321e492026af74b7baad890eRay Donnelly } 1069267aa8b00eadf273321e492026af74b7baad890eRay Donnelly 1070dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ZeroMemory( &startup, sizeof(startup) ); 1071dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project startup.cb = sizeof(startup); 1072dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project startup.hStdInput = GetStdHandle( STD_INPUT_HANDLE ); 1073dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project startup.hStdOutput = pipe_write; 1074dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project startup.hStdError = GetStdHandle( STD_ERROR_HANDLE ); 1075dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project startup.dwFlags = STARTF_USESTDHANDLES; 1076dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1077dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ZeroMemory( &pinfo, sizeof(pinfo) ); 1078dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1079dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* get path of current program */ 1080dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project GetModuleFileName( NULL, program_path, sizeof(program_path) ); 1081dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1082dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ret = CreateProcess( 1083dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project program_path, /* program path */ 1084dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "adb fork-server server", 1085dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* the fork-server argument will set the 1086dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project debug = 2 in the child */ 1087dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project NULL, /* process handle is not inheritable */ 1088dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project NULL, /* thread handle is not inheritable */ 1089dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project TRUE, /* yes, inherit some handles */ 1090dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project DETACHED_PROCESS, /* the new process doesn't have a console */ 1091dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project NULL, /* use parent's environment block */ 1092dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project NULL, /* use parent's starting directory */ 1093dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project &startup, /* startup info, i.e. std handles */ 1094dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project &pinfo ); 1095dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1096dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project CloseHandle( pipe_write ); 1097dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1098dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!ret) { 1099dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "CreateProcess failure, error %ld\n", GetLastError() ); 1100dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project CloseHandle( pipe_read ); 1101dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 1102dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1103dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1104dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project CloseHandle( pinfo.hProcess ); 1105dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project CloseHandle( pinfo.hThread ); 1106dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1107dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* wait for the "OK\n" message */ 1108dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { 1109dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char temp[3]; 1110dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project DWORD count; 1111dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1112dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ret = ReadFile( pipe_read, temp, 3, &count, NULL ); 1113dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project CloseHandle( pipe_read ); 1114dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if ( !ret ) { 1115dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "could not read ok from ADB Server, error = %ld\n", GetLastError() ); 1116dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 1117dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1118dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (count != 3 || temp[0] != 'O' || temp[1] != 'K' || temp[2] != '\n') { 1119dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "ADB server didn't ACK\n" ); 1120dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 1121dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1122dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1123dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#elif defined(HAVE_FORKEXEC) 1124dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char path[PATH_MAX]; 1125dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int fd[2]; 1126dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1127dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // set up a pipe so the child can tell us when it is ready. 1128dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // fd[0] will be parent's end, and fd[1] will get mapped to stderr in the child. 1129dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (pipe(fd)) { 1130dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "pipe failed in launch_server, errno: %d\n", errno); 1131dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 1132dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 11333166410a82f43d39201be98a8d35c51baa86cb53Alexey Tarasov get_my_path(path, PATH_MAX); 1134dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pid_t pid = fork(); 1135dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(pid < 0) return -1; 1136dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1137dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (pid == 0) { 1138dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // child side of the fork 1139dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1140dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // redirect stderr to the pipe 1141dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // we use stderr instead of stdout due to stdout's buffering behavior. 1142dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_close(fd[0]); 1143dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project dup2(fd[1], STDERR_FILENO); 1144dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_close(fd[1]); 1145dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1146d7b33085117ccbb908a883f624cb1fe5495ee92aMatt Gumbel char str_port[30]; 1147d7b33085117ccbb908a883f624cb1fe5495ee92aMatt Gumbel snprintf(str_port, sizeof(str_port), "%d", server_port); 1148dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // child process 1149d7b33085117ccbb908a883f624cb1fe5495ee92aMatt Gumbel int result = execl(path, "adb", "-P", str_port, "fork-server", "server", NULL); 1150dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // this should not return 1151dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "OOPS! execl returned %d, errno: %d\n", result, errno); 1152dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 1153dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // parent side of the fork 1154dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1155dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char temp[3]; 1156dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1157dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project temp[0] = 'A'; temp[1] = 'B'; temp[2] = 'C'; 1158dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // wait for the "OK\n" message 1159dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_close(fd[1]); 1160dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int ret = adb_read(fd[0], temp, 3); 1161408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall int saved_errno = errno; 1162dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_close(fd[0]); 1163dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (ret < 0) { 1164408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall fprintf(stderr, "could not read ok from ADB Server, errno = %d\n", saved_errno); 1165dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 1166dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1167dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (ret != 3 || temp[0] != 'O' || temp[1] != 'K' || temp[2] != '\n') { 1168dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "ADB server didn't ACK\n" ); 1169dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 1170dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1171dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1172dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project setsid(); 1173dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1174dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#else 1175dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#error "cannot implement background server start on this platform" 1176dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 1177dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 1178dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 1179dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 1180dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1181a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger/* Constructs a local name of form tcp:port. 1182a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger * target_str points to the target string, it's content will be overwritten. 1183a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger * target_size is the capacity of the target string. 1184a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger * server_port is the port number to use for the local name. 1185a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger */ 1186a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzingervoid build_local_name(char* target_str, size_t target_size, int server_port) 1187a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger{ 1188a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger snprintf(target_str, target_size, "tcp:%d", server_port); 1189a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger} 1190a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger 1191bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevich#if !ADB_HOST 1192080427e4e2b1b72718b660e16b6cf38b3a3c4e3fNick Kralevich 1193080427e4e2b1b72718b660e16b6cf38b3a3c4e3fNick Kralevichstatic void drop_capabilities_bounding_set_if_needed() { 1194080427e4e2b1b72718b660e16b6cf38b3a3c4e3fNick Kralevich#ifdef ALLOW_ADBD_ROOT 1195080427e4e2b1b72718b660e16b6cf38b3a3c4e3fNick Kralevich char value[PROPERTY_VALUE_MAX]; 1196080427e4e2b1b72718b660e16b6cf38b3a3c4e3fNick Kralevich property_get("ro.debuggable", value, ""); 1197080427e4e2b1b72718b660e16b6cf38b3a3c4e3fNick Kralevich if (strcmp(value, "1") == 0) { 1198080427e4e2b1b72718b660e16b6cf38b3a3c4e3fNick Kralevich return; 1199080427e4e2b1b72718b660e16b6cf38b3a3c4e3fNick Kralevich } 1200080427e4e2b1b72718b660e16b6cf38b3a3c4e3fNick Kralevich#endif 1201080427e4e2b1b72718b660e16b6cf38b3a3c4e3fNick Kralevich int i; 1202080427e4e2b1b72718b660e16b6cf38b3a3c4e3fNick Kralevich for (i = 0; prctl(PR_CAPBSET_READ, i, 0, 0, 0) >= 0; i++) { 1203ca8e66a8b0f843812014a28d49208f9f6f64ecbcNick Kralevich if (i == CAP_SETUID || i == CAP_SETGID) { 1204080427e4e2b1b72718b660e16b6cf38b3a3c4e3fNick Kralevich // CAP_SETUID CAP_SETGID needed by /system/bin/run-as 1205080427e4e2b1b72718b660e16b6cf38b3a3c4e3fNick Kralevich continue; 1206080427e4e2b1b72718b660e16b6cf38b3a3c4e3fNick Kralevich } 1207080427e4e2b1b72718b660e16b6cf38b3a3c4e3fNick Kralevich int err = prctl(PR_CAPBSET_DROP, i, 0, 0, 0); 1208080427e4e2b1b72718b660e16b6cf38b3a3c4e3fNick Kralevich 1209080427e4e2b1b72718b660e16b6cf38b3a3c4e3fNick Kralevich // Some kernels don't have file capabilities compiled in, and 1210080427e4e2b1b72718b660e16b6cf38b3a3c4e3fNick Kralevich // prctl(PR_CAPBSET_DROP) returns EINVAL. Don't automatically 1211080427e4e2b1b72718b660e16b6cf38b3a3c4e3fNick Kralevich // die when we see such misconfigured kernels. 1212080427e4e2b1b72718b660e16b6cf38b3a3c4e3fNick Kralevich if ((err < 0) && (errno != EINVAL)) { 1213080427e4e2b1b72718b660e16b6cf38b3a3c4e3fNick Kralevich exit(1); 1214080427e4e2b1b72718b660e16b6cf38b3a3c4e3fNick Kralevich } 1215080427e4e2b1b72718b660e16b6cf38b3a3c4e3fNick Kralevich } 1216080427e4e2b1b72718b660e16b6cf38b3a3c4e3fNick Kralevich} 1217080427e4e2b1b72718b660e16b6cf38b3a3c4e3fNick Kralevich 1218bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevichstatic int should_drop_privileges() { 12195890fe33141a9efd124c86c40a8c1ff6170ecf20Nick Kralevich#ifndef ALLOW_ADBD_ROOT 12205890fe33141a9efd124c86c40a8c1ff6170ecf20Nick Kralevich return 1; 12215890fe33141a9efd124c86c40a8c1ff6170ecf20Nick Kralevich#else /* ALLOW_ADBD_ROOT */ 1222bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevich int secure = 0; 1223bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevich char value[PROPERTY_VALUE_MAX]; 1224bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevich 1225bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevich /* run adbd in secure mode if ro.secure is set and 1226bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevich ** we are not in the emulator 1227bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevich */ 1228bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevich property_get("ro.kernel.qemu", value, ""); 1229bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevich if (strcmp(value, "1") != 0) { 1230bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevich property_get("ro.secure", value, "1"); 1231bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevich if (strcmp(value, "1") == 0) { 1232bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevich // don't run as root if ro.secure is set... 1233bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevich secure = 1; 1234bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevich 1235bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevich // ... except we allow running as root in userdebug builds if the 1236bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevich // service.adb.root property has been set by the "adb root" command 1237bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevich property_get("ro.debuggable", value, ""); 1238bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevich if (strcmp(value, "1") == 0) { 1239bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevich property_get("service.adb.root", value, ""); 1240bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevich if (strcmp(value, "1") == 0) { 1241bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevich secure = 0; 1242bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevich } 1243bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevich } 1244bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevich } 1245bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevich } 1246bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevich return secure; 12475890fe33141a9efd124c86c40a8c1ff6170ecf20Nick Kralevich#endif /* ALLOW_ADBD_ROOT */ 1248bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevich} 1249bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevich#endif /* !ADB_HOST */ 1250bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevich 1251a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzingerint adb_main(int is_daemon, int server_port) 1252dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 1253dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if !ADB_HOST 12542f38b699713dc2587a771bd5d4c6a47329728f5eMike Lockwood int port; 1255dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char value[PROPERTY_VALUE_MAX]; 1256eb68fa8153d97f5f8b6d9062fcf91fe393e3bff3Nick Kralevich 1257eb68fa8153d97f5f8b6d9062fcf91fe393e3bff3Nick Kralevich umask(000); 1258dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 1259dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1260dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project atexit(adb_cleanup); 1261dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef HAVE_WIN32_PROC 1262dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SetConsoleCtrlHandler( ctrlc_handler, TRUE ); 1263dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#elif defined(HAVE_FORKEXEC) 1264408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall // No SIGCHLD. Let the service subproc handle its children. 1265dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project signal(SIGPIPE, SIG_IGN); 1266dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 1267dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1268dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project init_transport_registration(); 1269dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1270dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if ADB_HOST 1271dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project HOST = 1; 1272571c1367682c83cb23481cc9c1028c8588a1fed0JP Abgrall 1273571c1367682c83cb23481cc9c1028c8588a1fed0JP Abgrall#ifdef WORKAROUND_BUG6558362 1274571c1367682c83cb23481cc9c1028c8588a1fed0JP Abgrall if(is_daemon) adb_set_affinity(); 1275571c1367682c83cb23481cc9c1028c8588a1fed0JP Abgrall#endif 1276a09fbd164d2e088bc5433d310e25640ae048d47dXavier Ducrohet usb_vendors_init(); 1277dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project usb_init(); 1278a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger local_init(DEFAULT_ADB_LOCAL_TRANSPORT_PORT); 1279d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby adb_auth_init(); 1280dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1281a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger char local_name[30]; 1282a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger build_local_name(local_name, sizeof(local_name), server_port); 12830d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner if(install_listener(local_name, "*smartsocket*", NULL, 0)) { 1284dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project exit(1); 1285dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1286dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#else 1287d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby property_get("ro.adb.secure", value, "0"); 1288d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby auth_enabled = !strcmp(value, "1"); 1289d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby if (auth_enabled) 1290d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby adb_auth_init(); 1291dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1292d6d4286a28b4a9aef902585625ea6656ab06cf52Jeff Sharkey // Our external storage path may be different than apps, since 1293d6d4286a28b4a9aef902585625ea6656ab06cf52Jeff Sharkey // we aren't able to bind mount after dropping root. 1294d6d4286a28b4a9aef902585625ea6656ab06cf52Jeff Sharkey const char* adb_external_storage = getenv("ADB_EXTERNAL_STORAGE"); 1295d6d4286a28b4a9aef902585625ea6656ab06cf52Jeff Sharkey if (NULL != adb_external_storage) { 1296d6d4286a28b4a9aef902585625ea6656ab06cf52Jeff Sharkey setenv("EXTERNAL_STORAGE", adb_external_storage, 1); 1297d6d4286a28b4a9aef902585625ea6656ab06cf52Jeff Sharkey } else { 1298d6d4286a28b4a9aef902585625ea6656ab06cf52Jeff Sharkey D("Warning: ADB_EXTERNAL_STORAGE is not set. Leaving EXTERNAL_STORAGE" 1299d6d4286a28b4a9aef902585625ea6656ab06cf52Jeff Sharkey " unchanged.\n"); 1300d6d4286a28b4a9aef902585625ea6656ab06cf52Jeff Sharkey } 1301d6d4286a28b4a9aef902585625ea6656ab06cf52Jeff Sharkey 1302a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger /* don't listen on a port (default 5037) if running in secure mode */ 1303dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* don't run as root if we are running in secure mode */ 1304bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevich if (should_drop_privileges()) { 1305080427e4e2b1b72718b660e16b6cf38b3a3c4e3fNick Kralevich drop_capabilities_bounding_set_if_needed(); 1306080427e4e2b1b72718b660e16b6cf38b3a3c4e3fNick Kralevich 1307dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* add extra groups: 1308dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ** AID_ADB to access the USB driver 1309dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ** AID_LOG to read system logs (adb logcat) 1310dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ** AID_INPUT to diagnose input issues (getevent) 1311dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ** AID_INET to diagnose network issues (netcfg, ping) 1312dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ** AID_GRAPHICS to access the frame buffer 13132015549667fb77706a9879e974a3875ebccd8198The Android Open Source Project ** AID_NET_BT and AID_NET_BT_ADMIN to diagnose bluetooth (hcidump) 131450458cf76ea7b0b03598c785acb1481ed0ae5b1dDianne Hackborn ** AID_SDCARD_R to allow reading from the SD card 13156a3075c78287ea5a7ee7a3c85cde58e894350822Mike Lockwood ** AID_SDCARD_RW to allow writing to the SD card 1316d969faa161310d0a3792766320daa3200b84bd74Mike Lockwood ** AID_MOUNT to allow unmounting the SD card before rebooting 131761b90bd211021886049f72cb666a5b49b83b3c64JP Abgrall ** AID_NET_BW_STATS to read out qtaguid statistics 1318dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 13192015549667fb77706a9879e974a3875ebccd8198The Android Open Source Project gid_t groups[] = { AID_ADB, AID_LOG, AID_INPUT, AID_INET, AID_GRAPHICS, 132050458cf76ea7b0b03598c785acb1481ed0ae5b1dDianne Hackborn AID_NET_BT, AID_NET_BT_ADMIN, AID_SDCARD_R, AID_SDCARD_RW, 132150458cf76ea7b0b03598c785acb1481ed0ae5b1dDianne Hackborn AID_MOUNT, AID_NET_BW_STATS }; 132244db990d3a4ce0edbdd16fa7ac20693ef601b723Nick Kralevich if (setgroups(sizeof(groups)/sizeof(groups[0]), groups) != 0) { 132344db990d3a4ce0edbdd16fa7ac20693ef601b723Nick Kralevich exit(1); 132444db990d3a4ce0edbdd16fa7ac20693ef601b723Nick Kralevich } 1325dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1326dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* then switch user and group to "shell" */ 132744db990d3a4ce0edbdd16fa7ac20693ef601b723Nick Kralevich if (setgid(AID_SHELL) != 0) { 132844db990d3a4ce0edbdd16fa7ac20693ef601b723Nick Kralevich exit(1); 132944db990d3a4ce0edbdd16fa7ac20693ef601b723Nick Kralevich } 133044db990d3a4ce0edbdd16fa7ac20693ef601b723Nick Kralevich if (setuid(AID_SHELL) != 0) { 133144db990d3a4ce0edbdd16fa7ac20693ef601b723Nick Kralevich exit(1); 133244db990d3a4ce0edbdd16fa7ac20693ef601b723Nick Kralevich } 1333dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1334a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger D("Local port disabled\n"); 1335dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 1336a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger char local_name[30]; 1337a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger build_local_name(local_name, sizeof(local_name), server_port); 13380d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner if(install_listener(local_name, "*smartsocket*", NULL, 0)) { 1339dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project exit(1); 1340dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1341dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1342dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 13431dd55c53af264b24319d721281fe32c67c053120Mike J. Chen int usb = 0; 13441dd55c53af264b24319d721281fe32c67c053120Mike J. Chen if (access(USB_ADB_PATH, F_OK) == 0 || access(USB_FFS_ADB_EP0, F_OK) == 0) { 13451dd55c53af264b24319d721281fe32c67c053120Mike J. Chen // listen on USB 13461dd55c53af264b24319d721281fe32c67c053120Mike J. Chen usb_init(); 13471dd55c53af264b24319d721281fe32c67c053120Mike J. Chen usb = 1; 13481dd55c53af264b24319d721281fe32c67c053120Mike J. Chen } 13491dd55c53af264b24319d721281fe32c67c053120Mike J. Chen 13501dd55c53af264b24319d721281fe32c67c053120Mike J. Chen // If one of these properties is set, also listen on that port 13511dd55c53af264b24319d721281fe32c67c053120Mike J. Chen // If one of the properties isn't set and we couldn't listen on usb, 13521dd55c53af264b24319d721281fe32c67c053120Mike J. Chen // listen on the default port. 13538e2ceaeacf9fa1eb5ac41e4d3498836a6e2c7c97Mike Lockwood property_get("service.adb.tcp.port", value, ""); 13541dd55c53af264b24319d721281fe32c67c053120Mike J. Chen if (!value[0]) { 13558e2ceaeacf9fa1eb5ac41e4d3498836a6e2c7c97Mike Lockwood property_get("persist.adb.tcp.port", value, ""); 13561dd55c53af264b24319d721281fe32c67c053120Mike J. Chen } 1357cef31a02544d91b85481a5fa032b6126dbb32365Mike Lockwood if (sscanf(value, "%d", &port) == 1 && port > 0) { 13581dd55c53af264b24319d721281fe32c67c053120Mike J. Chen printf("using port=%d\n", port); 1359cef31a02544d91b85481a5fa032b6126dbb32365Mike Lockwood // listen on TCP port specified by service.adb.tcp.port property 1360cef31a02544d91b85481a5fa032b6126dbb32365Mike Lockwood local_init(port); 13611dd55c53af264b24319d721281fe32c67c053120Mike J. Chen } else if (!usb) { 1362cef31a02544d91b85481a5fa032b6126dbb32365Mike Lockwood // listen on default port 1363a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger local_init(DEFAULT_ADB_LOCAL_TRANSPORT_PORT); 1364dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 13651dd55c53af264b24319d721281fe32c67c053120Mike J. Chen 1366408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall D("adb_main(): pre init_jdwp()\n"); 1367dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project init_jdwp(); 1368408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall D("adb_main(): post init_jdwp()\n"); 1369dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 1370dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1371dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (is_daemon) 1372dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { 1373dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // inform our parent that we are up and running. 1374dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef HAVE_WIN32_PROC 1375dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project DWORD count; 1376dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project WriteFile( GetStdHandle( STD_OUTPUT_HANDLE ), "OK\n", 3, &count, NULL ); 1377dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#elif defined(HAVE_FORKEXEC) 1378dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "OK\n"); 1379dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 1380dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project start_logging(); 1381dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1382408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall D("Event loop starting\n"); 1383dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1384dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fdevent_loop(); 1385dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1386dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project usb_cleanup(); 1387dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1388dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 1389dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 1390dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1391dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint handle_host_request(char *service, transport_type ttype, char* serial, int reply_fd, asocket *s) 1392dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 1393dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project atransport *transport = NULL; 1394dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char buf[4096]; 1395dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1396dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(service, "kill")) { 1397dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"adb server killed by remote request\n"); 1398dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fflush(stdout); 1399dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_write(reply_fd, "OKAY", 4); 1400dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project usb_cleanup(); 1401dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project exit(0); 1402dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1403dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1404dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if ADB_HOST 1405dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // "transport:" is used for switching transport with a specified serial number 1406dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // "transport-usb:" is used for switching transport to the only USB transport 1407dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // "transport-local:" is used for switching transport to the only local transport 1408dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // "transport-any:" is used for switching transport to the only transport 1409dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!strncmp(service, "transport", strlen("transport"))) { 1410dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char* error_string = "unknown failure"; 1411dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project transport_type type = kTransportAny; 1412dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1413dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!strncmp(service, "transport-usb", strlen("transport-usb"))) { 1414dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project type = kTransportUsb; 1415dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if (!strncmp(service, "transport-local", strlen("transport-local"))) { 1416dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project type = kTransportLocal; 1417dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if (!strncmp(service, "transport-any", strlen("transport-any"))) { 1418dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project type = kTransportAny; 1419dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if (!strncmp(service, "transport:", strlen("transport:"))) { 1420dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project service += strlen("transport:"); 14213175c8e9bfcb01f181d7300755da15a999e5461cTom Marlin serial = service; 1422dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1423dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1424dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project transport = acquire_one_transport(CS_ANY, type, serial, &error_string); 1425dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1426dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (transport) { 1427dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project s->transport = transport; 1428dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_write(reply_fd, "OKAY", 4); 1429dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 1430dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sendfailmsg(reply_fd, error_string); 1431dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1432dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 1433dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1434dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1435dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // return a list of all connected devices 1436e109d266c12c5f537d429ca4b892f2719e02c2daScott Anderson if (!strncmp(service, "devices", 7)) { 1437dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char buffer[4096]; 1438e109d266c12c5f537d429ca4b892f2719e02c2daScott Anderson int use_long = !strcmp(service+7, "-l"); 1439e109d266c12c5f537d429ca4b892f2719e02c2daScott Anderson if (use_long || service[7] == 0) { 1440e109d266c12c5f537d429ca4b892f2719e02c2daScott Anderson memset(buf, 0, sizeof(buf)); 1441e109d266c12c5f537d429ca4b892f2719e02c2daScott Anderson memset(buffer, 0, sizeof(buffer)); 1442e109d266c12c5f537d429ca4b892f2719e02c2daScott Anderson D("Getting device list \n"); 1443e109d266c12c5f537d429ca4b892f2719e02c2daScott Anderson list_transports(buffer, sizeof(buffer), use_long); 1444e109d266c12c5f537d429ca4b892f2719e02c2daScott Anderson snprintf(buf, sizeof(buf), "OKAY%04x%s",(unsigned)strlen(buffer),buffer); 1445e109d266c12c5f537d429ca4b892f2719e02c2daScott Anderson D("Wrote device list \n"); 1446e109d266c12c5f537d429ca4b892f2719e02c2daScott Anderson writex(reply_fd, buf, strlen(buf)); 1447e109d266c12c5f537d429ca4b892f2719e02c2daScott Anderson return 0; 1448e109d266c12c5f537d429ca4b892f2719e02c2daScott Anderson } 1449dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1450dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 145174d7ff8cfd490852d3df1c4b9d8a21beed619caaMike Lockwood // remove TCP transport 145274d7ff8cfd490852d3df1c4b9d8a21beed619caaMike Lockwood if (!strncmp(service, "disconnect:", 11)) { 145374d7ff8cfd490852d3df1c4b9d8a21beed619caaMike Lockwood char buffer[4096]; 145474d7ff8cfd490852d3df1c4b9d8a21beed619caaMike Lockwood memset(buffer, 0, sizeof(buffer)); 145574d7ff8cfd490852d3df1c4b9d8a21beed619caaMike Lockwood char* serial = service + 11; 1456cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood if (serial[0] == 0) { 1457cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood // disconnect from all TCP devices 1458cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood unregister_all_tcp_transports(); 145974d7ff8cfd490852d3df1c4b9d8a21beed619caaMike Lockwood } else { 1460cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood char hostbuf[100]; 1461cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood // assume port 5555 if no port is specified 1462cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood if (!strchr(serial, ':')) { 1463cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood snprintf(hostbuf, sizeof(hostbuf) - 1, "%s:5555", serial); 1464cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood serial = hostbuf; 1465cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood } 1466cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood atransport *t = find_transport(serial); 1467cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood 1468cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood if (t) { 1469cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood unregister_transport(t); 1470cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood } else { 1471cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood snprintf(buffer, sizeof(buffer), "No such device %s", serial); 1472cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood } 147374d7ff8cfd490852d3df1c4b9d8a21beed619caaMike Lockwood } 147474d7ff8cfd490852d3df1c4b9d8a21beed619caaMike Lockwood 147574d7ff8cfd490852d3df1c4b9d8a21beed619caaMike Lockwood snprintf(buf, sizeof(buf), "OKAY%04x%s",(unsigned)strlen(buffer), buffer); 14762f38b699713dc2587a771bd5d4c6a47329728f5eMike Lockwood writex(reply_fd, buf, strlen(buf)); 14772f38b699713dc2587a771bd5d4c6a47329728f5eMike Lockwood return 0; 14782f38b699713dc2587a771bd5d4c6a47329728f5eMike Lockwood } 14792f38b699713dc2587a771bd5d4c6a47329728f5eMike Lockwood 1480dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // returns our value for ADB_SERVER_VERSION 1481dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!strcmp(service, "version")) { 1482dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char version[12]; 1483dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project snprintf(version, sizeof version, "%04x", ADB_SERVER_VERSION); 1484dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project snprintf(buf, sizeof buf, "OKAY%04x%s", (unsigned)strlen(version), version); 1485dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project writex(reply_fd, buf, strlen(buf)); 1486dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 1487dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1488dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1489dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strncmp(service,"get-serialno",strlen("get-serialno"))) { 1490dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *out = "unknown"; 1491dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project transport = acquire_one_transport(CS_ANY, ttype, serial, NULL); 1492dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (transport && transport->serial) { 1493dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project out = transport->serial; 1494dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1495dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project snprintf(buf, sizeof buf, "OKAY%04x%s",(unsigned)strlen(out),out); 1496dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project writex(reply_fd, buf, strlen(buf)); 1497dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 1498dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1499e109d266c12c5f537d429ca4b892f2719e02c2daScott Anderson if(!strncmp(service,"get-devpath",strlen("get-devpath"))) { 1500e109d266c12c5f537d429ca4b892f2719e02c2daScott Anderson char *out = "unknown"; 1501e109d266c12c5f537d429ca4b892f2719e02c2daScott Anderson transport = acquire_one_transport(CS_ANY, ttype, serial, NULL); 1502e109d266c12c5f537d429ca4b892f2719e02c2daScott Anderson if (transport && transport->devpath) { 1503e109d266c12c5f537d429ca4b892f2719e02c2daScott Anderson out = transport->devpath; 1504e109d266c12c5f537d429ca4b892f2719e02c2daScott Anderson } 1505e109d266c12c5f537d429ca4b892f2719e02c2daScott Anderson snprintf(buf, sizeof buf, "OKAY%04x%s",(unsigned)strlen(out),out); 1506e109d266c12c5f537d429ca4b892f2719e02c2daScott Anderson writex(reply_fd, buf, strlen(buf)); 1507e109d266c12c5f537d429ca4b892f2719e02c2daScott Anderson return 0; 1508e109d266c12c5f537d429ca4b892f2719e02c2daScott Anderson } 1509dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // indicates a new emulator instance has started 1510dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!strncmp(service,"emulator:",9)) { 1511dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int port = atoi(service+9); 1512dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project local_connect(port); 1513dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* we don't even need to send a reply */ 1514dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 1515dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1516dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif // ADB_HOST 1517dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 15180d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner if(!strcmp(service,"list-forward")) { 15190d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner // Create the list of forward redirections. 15200d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner char header[9]; 15210d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner int buffer_size = format_listeners(NULL, 0); 15220d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner // Add one byte for the trailing zero. 15230d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner char* buffer = malloc(buffer_size+1); 15240d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner (void) format_listeners(buffer, buffer_size+1); 15250d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner snprintf(header, sizeof header, "OKAY%04x", buffer_size); 15260d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner writex(reply_fd, header, 8); 15270d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner writex(reply_fd, buffer, buffer_size); 15280d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner free(buffer); 15290d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner return 0; 15300d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner } 15310d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner 15320d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner if (!strcmp(service,"killforward-all")) { 15330d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner remove_all_listeners(); 15340d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner adb_write(reply_fd, "OKAYOKAY", 8); 15350d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner return 0; 15360d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner } 15370d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner 15380d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner if(!strncmp(service,"forward:",8) || 15390d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner !strncmp(service,"killforward:",12)) { 1540dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *local, *remote, *err; 1541dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int r; 1542dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project atransport *transport; 1543dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1544dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int createForward = strncmp(service,"kill",4); 15450d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner int no_rebind = 0; 1546dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 15470d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner local = strchr(service, ':') + 1; 15480d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner 15490d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner // Handle forward:norebind:<local>... here 15500d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner if (createForward && !strncmp(local, "norebind:", 9)) { 15510d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner no_rebind = 1; 15520d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner local = strchr(local, ':') + 1; 1553dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1554dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 15550d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner remote = strchr(local,';'); 15560d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner 15570d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner if (createForward) { 15580d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner // Check forward: parameter format: '<local>;<remote>' 15590d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner if(remote == 0) { 15600d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner sendfailmsg(reply_fd, "malformed forward spec"); 15610d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner return 0; 15620d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner } 15630d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner 15640d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner *remote++ = 0; 15650d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner if((local[0] == 0) || (remote[0] == 0) || (remote[0] == '*')){ 15660d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner sendfailmsg(reply_fd, "malformed forward spec"); 15670d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner return 0; 15680d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner } 15690d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner } else { 15700d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner // Check killforward: parameter format: '<local>' 15710d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner if (local[0] == 0) { 15720d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner sendfailmsg(reply_fd, "malformed forward spec"); 15730d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner return 0; 15740d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner } 1575dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1576dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1577dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project transport = acquire_one_transport(CS_ANY, ttype, serial, &err); 1578dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!transport) { 1579dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sendfailmsg(reply_fd, err); 1580dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 1581dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1582dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1583dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (createForward) { 15840d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner r = install_listener(local, remote, transport, no_rebind); 1585dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 15860d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner r = remove_listener(local, transport); 1587dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1588dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(r == 0) { 1589dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* 1st OKAY is connect, 2nd OKAY is status */ 1590dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project writex(reply_fd, "OKAYOKAY", 8); 1591dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 1592dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1593dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1594dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (createForward) { 15950d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner const char* message; 15960d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner switch (r) { 15970d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner case INSTALL_STATUS_CANNOT_BIND: 15980d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner message = "cannot bind to socket"; 15990d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner break; 16000d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner case INSTALL_STATUS_CANNOT_REBIND: 16010d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner message = "cannot rebind existing socket"; 16020d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner break; 16030d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner default: 16040d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner message = "internal error"; 16050d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner } 16060d82fbf04d6db847cf598f370aa6986af794bd72David 'Digit' Turner sendfailmsg(reply_fd, message); 1607dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 1608dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sendfailmsg(reply_fd, "cannot remove listener"); 1609dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1610dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 1611dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1612dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1613dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strncmp(service,"get-state",strlen("get-state"))) { 1614dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project transport = acquire_one_transport(CS_ANY, ttype, serial, NULL); 1615dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *state = connection_state_name(transport); 1616dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project snprintf(buf, sizeof buf, "OKAY%04x%s",(unsigned)strlen(state),state); 1617dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project writex(reply_fd, buf, strlen(buf)); 1618dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 1619dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1620dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 1621dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 1622dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1623dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if !ADB_HOST 1624dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint recovery_mode = 0; 1625dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 1626dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1627dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint main(int argc, char **argv) 1628dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 1629dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if ADB_HOST 1630dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_sysdeps_init(); 1631408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall adb_trace_init(); 1632408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall D("Handling commandline()\n"); 1633dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return adb_commandline(argc - 1, argv + 1); 1634dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#else 163528781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine /* If adbd runs inside the emulator this will enable adb tracing via 163628781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine * adb-debug qemud service in the emulator. */ 163728781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine adb_qemu_trace_init(); 1638dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if((argc > 1) && (!strcmp(argv[1],"recovery"))) { 1639dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_device_banner = "recovery"; 1640dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project recovery_mode = 1; 1641dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 16421f546e6d1f6ccd1964336ddf0d8e8b3b11b1e945Mike Lockwood 1643dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project start_device_log(); 1644408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall D("Handling main()\n"); 1645a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger return adb_main(0, DEFAULT_ADB_PORT); 1646dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 1647dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 1648