adb.c revision 28781b0a52dfb5ad19121afcc6aef56918992b30
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> 24dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <string.h> 25dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <time.h> 261f546e6d1f6ccd1964336ddf0d8e8b3b11b1e945Mike Lockwood#include <sys/time.h> 27dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 28dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "sysdeps.h" 29dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "adb.h" 30dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 31dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if !ADB_HOST 32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <private/android_filesystem_config.h> 335f4b051235c3e9e9e5b34b4af885e42a1c711fc4Mike Lockwood#include <linux/capability.h> 345f4b051235c3e9e9e5b34b4af885e42a1c711fc4Mike Lockwood#include <linux/prctl.h> 35a09fbd164d2e088bc5433d310e25640ae048d47dXavier Ducrohet#else 36a09fbd164d2e088bc5433d310e25640ae048d47dXavier Ducrohet#include "usb_vendors.h" 37dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 38dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 39408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall#if ADB_TRACE 40408fa57864c01113deaa213e5c1848a9c594ae92JP AbgrallADB_MUTEX_DEFINE( D_lock ); 41408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall#endif 42dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 43dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint HOST = 0; 44dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 45dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic const char *adb_device_banner = "device"; 46dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 47dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid fatal(const char *fmt, ...) 48dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 49dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project va_list ap; 50dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project va_start(ap, fmt); 51dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "error: "); 52dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project vfprintf(stderr, fmt, ap); 53dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "\n"); 54dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project va_end(ap); 55dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project exit(-1); 56dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 57dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 58dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid fatal_errno(const char *fmt, ...) 59dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 60dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project va_list ap; 61dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project va_start(ap, fmt); 62dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "error: %s: ", strerror(errno)); 63dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project vfprintf(stderr, fmt, ap); 64dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "\n"); 65dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project va_end(ap); 66dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project exit(-1); 67dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 68dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 69dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint adb_trace_mask; 70dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 71dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* read a comma/space/colum/semi-column separated list of tags 72dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * from the ADB_TRACE environment variable and build the trace 73dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * mask from it. note that '1' and 'all' are special cases to 74dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * enable all tracing 75dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 76dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid adb_trace_init(void) 77dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 78dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char* p = getenv("ADB_TRACE"); 79dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char* q; 80dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 81dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project static const struct { 82dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char* tag; 83dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int flag; 84dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } tags[] = { 85dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { "1", 0 }, 86dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { "all", 0 }, 87dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { "adb", TRACE_ADB }, 88dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { "sockets", TRACE_SOCKETS }, 89dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { "packets", TRACE_PACKETS }, 90dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { "rwx", TRACE_RWX }, 91dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { "usb", TRACE_USB }, 92dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { "sync", TRACE_SYNC }, 93dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { "sysdeps", TRACE_SYSDEPS }, 94dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { "transport", TRACE_TRANSPORT }, 95dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { "jdwp", TRACE_JDWP }, 96408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall { "services", TRACE_SERVICES }, 97dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { NULL, 0 } 98dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project }; 99dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 100dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (p == NULL) 101dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return; 102dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 103dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* use a comma/column/semi-colum/space separated list */ 104dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while (*p) { 105dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int len, tagn; 106dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 107dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project q = strpbrk(p, " ,:;"); 108dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (q == NULL) { 109dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project q = p + strlen(p); 110dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 111dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project len = q - p; 112dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 113dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for (tagn = 0; tags[tagn].tag != NULL; tagn++) 114dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { 115dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int taglen = strlen(tags[tagn].tag); 116dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 117dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (len == taglen && !memcmp(tags[tagn].tag, p, len) ) 118dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { 119dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int flag = tags[tagn].flag; 120dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (flag == 0) { 121dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_trace_mask = ~0; 122dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return; 123dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 124dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_trace_mask |= (1 << flag); 125dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 126dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 127dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 128dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project p = q; 129dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (*p) 130dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project p++; 131dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 132dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 133dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 13428781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine#if !ADB_HOST 13528781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine/* 13628781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine * Implements ADB tracing inside the emulator. 13728781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine */ 13828781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine 13928781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine#include <stdarg.h> 14028781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine 14128781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine/* 14228781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine * Redefine open and write for qemu_pipe.h that contains inlined references 14328781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine * to those routines. We will redifine them back after qemu_pipe.h inclusion. 14428781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine */ 14528781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine 14628781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine#undef open 14728781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine#undef write 14828781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine#define open adb_open 14928781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine#define write adb_write 15028781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine#include <hardware/qemu_pipe.h> 15128781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine#undef open 15228781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine#undef write 15328781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine#define open ___xxx_open 15428781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine#define write ___xxx_write 15528781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine 15628781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine/* A handle to adb-debug qemud service in the emulator. */ 15728781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkineint adb_debug_qemu = -1; 15828781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine 15928781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine/* Initializes connection with the adb-debug qemud service in the emulator. */ 16028781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkinestatic int adb_qemu_trace_init(void) 16128781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine{ 16228781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine char con_name[32]; 16328781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine 16428781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine if (adb_debug_qemu >= 0) { 16528781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine return 0; 16628781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine } 16728781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine 16828781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine /* adb debugging QEMUD service connection request. */ 16928781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine snprintf(con_name, sizeof(con_name), "qemud:adb-debug"); 17028781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine adb_debug_qemu = qemu_pipe_open(con_name); 17128781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine return (adb_debug_qemu >= 0) ? 0 : -1; 17228781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine} 17328781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine 17428781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkinevoid adb_qemu_trace(const char* fmt, ...) 17528781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine{ 17628781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine va_list args; 17728781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine va_start(args, fmt); 17828781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine char msg[1024]; 17928781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine 18028781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine if (adb_debug_qemu >= 0) { 18128781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine vsnprintf(msg, sizeof(msg), fmt, args); 18228781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine adb_write(adb_debug_qemu, msg, strlen(msg)); 18328781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine } 18428781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine} 18528781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine#endif /* !ADB_HOST */ 186dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 187dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectapacket *get_apacket(void) 188dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 189dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project apacket *p = malloc(sizeof(apacket)); 190dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(p == 0) fatal("failed to allocate an apacket"); 191dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project memset(p, 0, sizeof(apacket) - MAX_PAYLOAD); 192dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return p; 193dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 194dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 195dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid put_apacket(apacket *p) 196dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 197dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free(p); 198dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 199dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 200dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid handle_online(void) 201dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 202dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project D("adb: online\n"); 203dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 204dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 205dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid handle_offline(atransport *t) 206dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 207dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project D("adb: offline\n"); 208dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project //Close the associated usb 209dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project run_transport_disconnects(t); 210dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 211dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 212dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if TRACE_PACKETS 213dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define DUMPMAX 32 214dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid print_packet(const char *label, apacket *p) 215dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 216dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *tag; 217dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *x; 218dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project unsigned count; 219dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 220dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project switch(p->msg.command){ 221dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case A_SYNC: tag = "SYNC"; break; 222dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case A_CNXN: tag = "CNXN" ; break; 223dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case A_OPEN: tag = "OPEN"; break; 224dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case A_OKAY: tag = "OKAY"; break; 225dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case A_CLSE: tag = "CLSE"; break; 226dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case A_WRTE: tag = "WRTE"; break; 227dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project default: tag = "????"; break; 228dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 229dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 230dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "%s: %s %08x %08x %04x \"", 231dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project label, tag, p->msg.arg0, p->msg.arg1, p->msg.data_length); 232dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project count = p->msg.data_length; 233dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project x = (char*) p->data; 234dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(count > DUMPMAX) { 235dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project count = DUMPMAX; 236dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tag = "\n"; 237dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 238dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tag = "\"\n"; 239dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 240dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while(count-- > 0){ 241dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if((*x >= ' ') && (*x < 127)) { 242dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fputc(*x, stderr); 243dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 244dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fputc('.', stderr); 245dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 246dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project x++; 247dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 248dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, tag); 249dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 250dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 251dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 252dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void send_ready(unsigned local, unsigned remote, atransport *t) 253dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 254dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project D("Calling send_ready \n"); 255dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project apacket *p = get_apacket(); 256dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project p->msg.command = A_OKAY; 257dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project p->msg.arg0 = local; 258dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project p->msg.arg1 = remote; 259dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project send_packet(p, t); 260dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 261dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 262dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void send_close(unsigned local, unsigned remote, atransport *t) 263dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 264dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project D("Calling send_close \n"); 265dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project apacket *p = get_apacket(); 266dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project p->msg.command = A_CLSE; 267dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project p->msg.arg0 = local; 268dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project p->msg.arg1 = remote; 269dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project send_packet(p, t); 270dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 271dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 272dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void send_connect(atransport *t) 273dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 274dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project D("Calling send_connect \n"); 275dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project apacket *cp = get_apacket(); 276dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project cp->msg.command = A_CNXN; 277dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project cp->msg.arg0 = A_VERSION; 278dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project cp->msg.arg1 = MAX_PAYLOAD; 279dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project snprintf((char*) cp->data, sizeof cp->data, "%s::", 280dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project HOST ? "host" : adb_device_banner); 281dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project cp->msg.data_length = strlen((char*) cp->data) + 1; 282dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project send_packet(cp, t); 283dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if ADB_HOST 284dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* XXX why sleep here? */ 285dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // allow the device some time to respond to the connect message 286dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_sleep_ms(1000); 287dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 288dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 289dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 290dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic char *connection_state_name(atransport *t) 291dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 292dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (t == NULL) { 293dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return "unknown"; 294dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 295dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 296dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project switch(t->connection_state) { 297dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case CS_BOOTLOADER: 298dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return "bootloader"; 299dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case CS_DEVICE: 300dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return "device"; 301dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case CS_OFFLINE: 302dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return "offline"; 303dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project default: 304dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return "unknown"; 305dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 306dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 307dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 308dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid parse_banner(char *banner, atransport *t) 309dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 310dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *type, *product, *end; 311dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 312dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project D("parse_banner: %s\n", banner); 313dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project type = banner; 314dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project product = strchr(type, ':'); 315dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(product) { 316dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *product++ = 0; 317dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 318dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project product = ""; 319dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 320dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 321dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* remove trailing ':' */ 322dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project end = strchr(product, ':'); 323dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(end) *end = 0; 324dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 325dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* save product name in device structure */ 326dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (t->product == NULL) { 327dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project t->product = strdup(product); 328dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if (strcmp(product, t->product) != 0) { 329dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free(t->product); 330dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project t->product = strdup(product); 331dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 332dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 333dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(type, "bootloader")){ 334dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project D("setting connection_state to CS_BOOTLOADER\n"); 335dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project t->connection_state = CS_BOOTLOADER; 336dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project update_transports(); 337dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return; 338dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 339dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 340dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(type, "device")) { 341dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project D("setting connection_state to CS_DEVICE\n"); 342dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project t->connection_state = CS_DEVICE; 343dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project update_transports(); 344dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return; 345dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 346dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 347dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(type, "recovery")) { 348dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project D("setting connection_state to CS_RECOVERY\n"); 349dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project t->connection_state = CS_RECOVERY; 350dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project update_transports(); 351dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return; 352dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 353dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 354447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker if(!strcmp(type, "sideload")) { 355447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker D("setting connection_state to CS_SIDELOAD\n"); 356447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker t->connection_state = CS_SIDELOAD; 357447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker update_transports(); 358447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker return; 359447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker } 360447f061da19fe46bae35f1cdd93eeb16bc225463Doug Zongker 361dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project t->connection_state = CS_HOST; 362dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 363dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 364dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid handle_packet(apacket *p, atransport *t) 365dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 366dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project asocket *s; 367dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 368899913f8168b54e00971c0e8d4ae16d06a4651feViral Mehta D("handle_packet() %c%c%c%c\n", ((char*) (&(p->msg.command)))[0], 369899913f8168b54e00971c0e8d4ae16d06a4651feViral Mehta ((char*) (&(p->msg.command)))[1], 370899913f8168b54e00971c0e8d4ae16d06a4651feViral Mehta ((char*) (&(p->msg.command)))[2], 371899913f8168b54e00971c0e8d4ae16d06a4651feViral Mehta ((char*) (&(p->msg.command)))[3]); 372dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project print_packet("recv", p); 373dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 374dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project switch(p->msg.command){ 375dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case A_SYNC: 376dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(p->msg.arg0){ 377dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project send_packet(p, t); 378dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(HOST) send_connect(t); 379dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 380dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project t->connection_state = CS_OFFLINE; 381dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project handle_offline(t); 382dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project send_packet(p, t); 383dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 384dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return; 385dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 386dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case A_CNXN: /* CONNECT(version, maxdata, "system-id-string") */ 387dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* XXX verify version, etc */ 388dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(t->connection_state != CS_OFFLINE) { 389dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project t->connection_state = CS_OFFLINE; 390dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project handle_offline(t); 391dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 392dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project parse_banner((char*) p->data, t); 393dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project handle_online(); 394dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!HOST) send_connect(t); 395dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 396dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 397dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case A_OPEN: /* OPEN(local-id, 0, "destination") */ 398dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(t->connection_state != CS_OFFLINE) { 399dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *name = (char*) p->data; 400dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project name[p->msg.data_length > 0 ? p->msg.data_length - 1 : 0] = 0; 401dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project s = create_local_service_socket(name); 402dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(s == 0) { 403dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project send_close(0, p->msg.arg0, t); 404dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 405dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project s->peer = create_remote_socket(p->msg.arg0, t); 406dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project s->peer->peer = s; 407dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project send_ready(s->id, s->peer->id, t); 408dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project s->ready(s); 409dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 410dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 411dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 412dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 413dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case A_OKAY: /* READY(local-id, remote-id, "") */ 414dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(t->connection_state != CS_OFFLINE) { 415dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if((s = find_local_socket(p->msg.arg1))) { 416dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(s->peer == 0) { 417dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project s->peer = create_remote_socket(p->msg.arg0, t); 418dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project s->peer->peer = s; 419dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 420dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project s->ready(s); 421dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 422dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 423dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 424dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 425dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case A_CLSE: /* CLOSE(local-id, remote-id, "") */ 426dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(t->connection_state != CS_OFFLINE) { 427dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if((s = find_local_socket(p->msg.arg1))) { 428dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project s->close(s); 429dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 430dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 431dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 432dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 433dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case A_WRTE: 434dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(t->connection_state != CS_OFFLINE) { 435dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if((s = find_local_socket(p->msg.arg1))) { 436dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project unsigned rid = p->msg.arg0; 437dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project p->len = p->msg.data_length; 438dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 439dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(s->enqueue(s, p) == 0) { 440dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project D("Enqueue the socket\n"); 441dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project send_ready(s->id, rid, t); 442dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 443dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return; 444dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 445dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 446dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 447dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 448dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project default: 449dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("handle_packet: what is %08x?!\n", p->msg.command); 450dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 451dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 452dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project put_apacket(p); 453dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 454dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 455dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectalistener listener_list = { 456dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project .next = &listener_list, 457dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project .prev = &listener_list, 458dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}; 459dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 460dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void ss_listener_event_func(int _fd, unsigned ev, void *_l) 461dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 462dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project asocket *s; 463dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 464dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(ev & FDE_READ) { 465dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct sockaddr addr; 466dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project socklen_t alen; 467dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int fd; 468dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 469dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project alen = sizeof(addr); 470dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fd = adb_socket_accept(_fd, &addr, &alen); 471dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(fd < 0) return; 472dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 473dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_socket_setbufsize(fd, CHUNK_SIZE); 474dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 475dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project s = create_local_socket(fd); 476dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(s) { 477dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project connect_to_smartsocket(s); 478dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return; 479dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 480dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 481dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_close(fd); 482dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 483dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 484dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 485dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void listener_event_func(int _fd, unsigned ev, void *_l) 486dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 487dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project alistener *l = _l; 488dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project asocket *s; 489dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 490dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(ev & FDE_READ) { 491dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct sockaddr addr; 492dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project socklen_t alen; 493dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int fd; 494dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 495dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project alen = sizeof(addr); 496dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fd = adb_socket_accept(_fd, &addr, &alen); 497dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(fd < 0) return; 498dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 499dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project s = create_local_socket(fd); 500dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(s) { 501dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project s->transport = l->transport; 502dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project connect_to_remote(s, l->connect_to); 503dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return; 504dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 505dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 506dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_close(fd); 507dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 508dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 509dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 510dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void free_listener(alistener* l) 511dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 512dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (l->next) { 513dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project l->next->prev = l->prev; 514dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project l->prev->next = l->next; 515dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project l->next = l->prev = l; 516dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 517dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 518dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // closes the corresponding fd 519dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fdevent_remove(&l->fde); 520dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 521dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (l->local_name) 522dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free((char*)l->local_name); 523dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 524dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (l->connect_to) 525dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free((char*)l->connect_to); 526dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 527dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (l->transport) { 528dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project remove_transport_disconnect(l->transport, &l->disconnect); 529dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 530dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free(l); 531dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 532dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 533dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void listener_disconnect(void* _l, atransport* t) 534dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 535dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project alistener* l = _l; 536dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 537dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free_listener(l); 538dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 539dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 540dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint local_name_to_fd(const char *name) 541dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 542dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int port; 543dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 544dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strncmp("tcp:", name, 4)){ 545dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int ret; 546dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project port = atoi(name + 4); 547dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ret = socket_loopback_server(port, SOCK_STREAM); 548dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return ret; 549dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 550dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifndef HAVE_WIN32_IPC /* no Unix-domain sockets on Win32 */ 551dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // It's non-sensical to support the "reserved" space on the adb host side 552dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strncmp(name, "local:", 6)) { 553dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return socket_local_server(name + 6, 554dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ANDROID_SOCKET_NAMESPACE_ABSTRACT, SOCK_STREAM); 555dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if(!strncmp(name, "localabstract:", 14)) { 556dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return socket_local_server(name + 14, 557dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ANDROID_SOCKET_NAMESPACE_ABSTRACT, SOCK_STREAM); 558dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if(!strncmp(name, "localfilesystem:", 16)) { 559dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return socket_local_server(name + 16, 560dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ANDROID_SOCKET_NAMESPACE_FILESYSTEM, SOCK_STREAM); 561dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 562dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 563dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 564dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("unknown local portname '%s'\n", name); 565dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 566dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 567dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 568dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int remove_listener(const char *local_name, const char *connect_to, atransport* transport) 569dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 570dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project alistener *l; 571dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 572dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for (l = listener_list.next; l != &listener_list; l = l->next) { 573dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!strcmp(local_name, l->local_name) && 574dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project !strcmp(connect_to, l->connect_to) && 575dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project l->transport && l->transport == transport) { 576dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 577dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project listener_disconnect(l, transport); 578dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 579dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 580dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 581dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 582dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 583dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 584dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 585dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int install_listener(const char *local_name, const char *connect_to, atransport* transport) 586dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 587dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project alistener *l; 588dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 589dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project //printf("install_listener('%s','%s')\n", local_name, connect_to); 590dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 591dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for(l = listener_list.next; l != &listener_list; l = l->next){ 592dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(strcmp(local_name, l->local_name) == 0) { 593dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *cto; 594dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 595dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* can't repurpose a smartsocket */ 596dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(l->connect_to[0] == '*') { 597dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 598dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 599dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 600dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project cto = strdup(connect_to); 601dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(cto == 0) { 602dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 603dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 604dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 605dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project //printf("rebinding '%s' to '%s'\n", local_name, connect_to); 606dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free((void*) l->connect_to); 607dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project l->connect_to = cto; 608dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (l->transport != transport) { 609dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project remove_transport_disconnect(l->transport, &l->disconnect); 610dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project l->transport = transport; 611dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project add_transport_disconnect(l->transport, &l->disconnect); 612dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 613dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 614dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 615dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 616dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 617dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if((l = calloc(1, sizeof(alistener))) == 0) goto nomem; 618dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if((l->local_name = strdup(local_name)) == 0) goto nomem; 619dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if((l->connect_to = strdup(connect_to)) == 0) goto nomem; 620dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 621dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 622dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project l->fd = local_name_to_fd(local_name); 623dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(l->fd < 0) { 624dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free((void*) l->local_name); 625dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free((void*) l->connect_to); 626dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free(l); 627dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("cannot bind '%s'\n", local_name); 628dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -2; 629dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 630dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 631dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project close_on_exec(l->fd); 632dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(l->connect_to, "*smartsocket*")) { 633dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fdevent_install(&l->fde, l->fd, ss_listener_event_func, l); 634dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 635dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fdevent_install(&l->fde, l->fd, listener_event_func, l); 636dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 637dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fdevent_set(&l->fde, FDE_READ); 638dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 639dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project l->next = &listener_list; 640dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project l->prev = listener_list.prev; 641dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project l->next->prev = l; 642dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project l->prev->next = l; 643dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project l->transport = transport; 644dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 645dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (transport) { 646dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project l->disconnect.opaque = l; 647dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project l->disconnect.func = listener_disconnect; 648dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project add_transport_disconnect(transport, &l->disconnect); 649dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 650dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 651dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 652dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectnomem: 653dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fatal("cannot allocate listener"); 654dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 655dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 656dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 657dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef HAVE_WIN32_PROC 658dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic BOOL WINAPI ctrlc_handler(DWORD type) 659dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 660dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project exit(STATUS_CONTROL_C_EXIT); 661dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return TRUE; 662dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 663dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 664dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 665dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void adb_cleanup(void) 666dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 667dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project usb_cleanup(); 668dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 669dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 670dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid start_logging(void) 671dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 672dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef HAVE_WIN32_PROC 673dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char temp[ MAX_PATH ]; 674dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project FILE* fnul; 675dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project FILE* flog; 676dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 677dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project GetTempPath( sizeof(temp) - 8, temp ); 678dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strcat( temp, "adb.log" ); 679dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 680dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* Win32 specific redirections */ 681dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fnul = fopen( "NUL", "rt" ); 682dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (fnul != NULL) 683dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project stdin[0] = fnul[0]; 684dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 685dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project flog = fopen( temp, "at" ); 686dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (flog == NULL) 687dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project flog = fnul; 688dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 689dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project setvbuf( flog, NULL, _IONBF, 0 ); 690dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 691dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project stdout[0] = flog[0]; 692dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project stderr[0] = flog[0]; 693dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"--- adb starting (pid %d) ---\n", getpid()); 694dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#else 695dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int fd; 696dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 697dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fd = unix_open("/dev/null", O_RDONLY); 698dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project dup2(fd, 0); 699408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall adb_close(fd); 700dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 701dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fd = unix_open("/tmp/adb.log", O_WRONLY | O_CREAT | O_APPEND, 0640); 702dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(fd < 0) { 703dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fd = unix_open("/dev/null", O_WRONLY); 704dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 705dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project dup2(fd, 1); 706dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project dup2(fd, 2); 707408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall adb_close(fd); 708dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"--- adb starting (pid %d) ---\n", getpid()); 709dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 710dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 711dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 712dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if !ADB_HOST 713dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid start_device_log(void) 714dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 715dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int fd; 7161f546e6d1f6ccd1964336ddf0d8e8b3b11b1e945Mike Lockwood char path[PATH_MAX]; 7171f546e6d1f6ccd1964336ddf0d8e8b3b11b1e945Mike Lockwood struct tm now; 7181f546e6d1f6ccd1964336ddf0d8e8b3b11b1e945Mike Lockwood time_t t; 7191f546e6d1f6ccd1964336ddf0d8e8b3b11b1e945Mike Lockwood char value[PROPERTY_VALUE_MAX]; 7201f546e6d1f6ccd1964336ddf0d8e8b3b11b1e945Mike Lockwood 7211f546e6d1f6ccd1964336ddf0d8e8b3b11b1e945Mike Lockwood // read the trace mask from persistent property persist.adb.trace_mask 7221f546e6d1f6ccd1964336ddf0d8e8b3b11b1e945Mike Lockwood // give up if the property is not set or cannot be parsed 7231f546e6d1f6ccd1964336ddf0d8e8b3b11b1e945Mike Lockwood property_get("persist.adb.trace_mask", value, ""); 7241f546e6d1f6ccd1964336ddf0d8e8b3b11b1e945Mike Lockwood if (sscanf(value, "%x", &adb_trace_mask) != 1) 7251f546e6d1f6ccd1964336ddf0d8e8b3b11b1e945Mike Lockwood return; 726dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 7271f546e6d1f6ccd1964336ddf0d8e8b3b11b1e945Mike Lockwood adb_mkdir("/data/adb", 0775); 7281f546e6d1f6ccd1964336ddf0d8e8b3b11b1e945Mike Lockwood tzset(); 7291f546e6d1f6ccd1964336ddf0d8e8b3b11b1e945Mike Lockwood time(&t); 7301f546e6d1f6ccd1964336ddf0d8e8b3b11b1e945Mike Lockwood localtime_r(&t, &now); 7311f546e6d1f6ccd1964336ddf0d8e8b3b11b1e945Mike Lockwood strftime(path, sizeof(path), 7321f546e6d1f6ccd1964336ddf0d8e8b3b11b1e945Mike Lockwood "/data/adb/adb-%Y-%m-%d-%H-%M-%S.txt", 7331f546e6d1f6ccd1964336ddf0d8e8b3b11b1e945Mike Lockwood &now); 7341f546e6d1f6ccd1964336ddf0d8e8b3b11b1e945Mike Lockwood fd = unix_open(path, O_WRONLY | O_CREAT | O_TRUNC, 0640); 735dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (fd < 0) 736dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return; 737dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 738dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // redirect stdout and stderr to the log file 739dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project dup2(fd, 1); 740dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project dup2(fd, 2); 741dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"--- adb starting (pid %d) ---\n", getpid()); 74295ef82866c7a922bf588027aa38c58a45eb84d9cBenoit Goby adb_close(fd); 743dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 744dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fd = unix_open("/dev/null", O_RDONLY); 745dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project dup2(fd, 0); 74695ef82866c7a922bf588027aa38c58a45eb84d9cBenoit Goby adb_close(fd); 747dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 748dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 749dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 750dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if ADB_HOST 751a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzingerint launch_server(int server_port) 752dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 753dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef HAVE_WIN32_PROC 754dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* we need to start the server in the background */ 755dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* we create a PIPE that will be used to wait for the server's "OK" */ 756dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* message since the pipe handles must be inheritable, we use a */ 757dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* security attribute */ 758dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project HANDLE pipe_read, pipe_write; 759dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SECURITY_ATTRIBUTES sa; 760dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project STARTUPINFO startup; 761dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project PROCESS_INFORMATION pinfo; 762dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char program_path[ MAX_PATH ]; 763dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int ret; 764dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 765dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sa.nLength = sizeof(sa); 766dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sa.lpSecurityDescriptor = NULL; 767dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sa.bInheritHandle = TRUE; 768dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 769dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* create pipe, and ensure its read handle isn't inheritable */ 770dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ret = CreatePipe( &pipe_read, &pipe_write, &sa, 0 ); 771dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!ret) { 772dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "CreatePipe() failure, error %ld\n", GetLastError() ); 773dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 774dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 775dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 776dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SetHandleInformation( pipe_read, HANDLE_FLAG_INHERIT, 0 ); 777dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 778dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ZeroMemory( &startup, sizeof(startup) ); 779dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project startup.cb = sizeof(startup); 780dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project startup.hStdInput = GetStdHandle( STD_INPUT_HANDLE ); 781dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project startup.hStdOutput = pipe_write; 782dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project startup.hStdError = GetStdHandle( STD_ERROR_HANDLE ); 783dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project startup.dwFlags = STARTF_USESTDHANDLES; 784dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 785dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ZeroMemory( &pinfo, sizeof(pinfo) ); 786dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 787dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* get path of current program */ 788dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project GetModuleFileName( NULL, program_path, sizeof(program_path) ); 789dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 790dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ret = CreateProcess( 791dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project program_path, /* program path */ 792dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "adb fork-server server", 793dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* the fork-server argument will set the 794dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project debug = 2 in the child */ 795dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project NULL, /* process handle is not inheritable */ 796dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project NULL, /* thread handle is not inheritable */ 797dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project TRUE, /* yes, inherit some handles */ 798dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project DETACHED_PROCESS, /* the new process doesn't have a console */ 799dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project NULL, /* use parent's environment block */ 800dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project NULL, /* use parent's starting directory */ 801dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project &startup, /* startup info, i.e. std handles */ 802dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project &pinfo ); 803dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 804dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project CloseHandle( pipe_write ); 805dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 806dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!ret) { 807dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "CreateProcess failure, error %ld\n", GetLastError() ); 808dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project CloseHandle( pipe_read ); 809dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 810dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 811dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 812dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project CloseHandle( pinfo.hProcess ); 813dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project CloseHandle( pinfo.hThread ); 814dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 815dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* wait for the "OK\n" message */ 816dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { 817dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char temp[3]; 818dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project DWORD count; 819dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 820dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ret = ReadFile( pipe_read, temp, 3, &count, NULL ); 821dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project CloseHandle( pipe_read ); 822dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if ( !ret ) { 823dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "could not read ok from ADB Server, error = %ld\n", GetLastError() ); 824dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 825dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 826dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (count != 3 || temp[0] != 'O' || temp[1] != 'K' || temp[2] != '\n') { 827dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "ADB server didn't ACK\n" ); 828dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 829dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 830dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 831dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#elif defined(HAVE_FORKEXEC) 832dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char path[PATH_MAX]; 833dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int fd[2]; 834dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 835dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // set up a pipe so the child can tell us when it is ready. 836dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // fd[0] will be parent's end, and fd[1] will get mapped to stderr in the child. 837dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (pipe(fd)) { 838dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "pipe failed in launch_server, errno: %d\n", errno); 839dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 840dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 8413166410a82f43d39201be98a8d35c51baa86cb53Alexey Tarasov get_my_path(path, PATH_MAX); 842dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pid_t pid = fork(); 843dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(pid < 0) return -1; 844dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 845dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (pid == 0) { 846dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // child side of the fork 847dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 848dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // redirect stderr to the pipe 849dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // we use stderr instead of stdout due to stdout's buffering behavior. 850dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_close(fd[0]); 851dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project dup2(fd[1], STDERR_FILENO); 852dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_close(fd[1]); 853dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 854dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // child process 855dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int result = execl(path, "adb", "fork-server", "server", NULL); 856dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // this should not return 857dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "OOPS! execl returned %d, errno: %d\n", result, errno); 858dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 859dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // parent side of the fork 860dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 861dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char temp[3]; 862dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 863dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project temp[0] = 'A'; temp[1] = 'B'; temp[2] = 'C'; 864dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // wait for the "OK\n" message 865dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_close(fd[1]); 866dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int ret = adb_read(fd[0], temp, 3); 867408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall int saved_errno = errno; 868dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_close(fd[0]); 869dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (ret < 0) { 870408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall fprintf(stderr, "could not read ok from ADB Server, errno = %d\n", saved_errno); 871dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 872dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 873dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (ret != 3 || temp[0] != 'O' || temp[1] != 'K' || temp[2] != '\n') { 874dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "ADB server didn't ACK\n" ); 875dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 876dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 877dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 878dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project setsid(); 879dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 880dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#else 881dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#error "cannot implement background server start on this platform" 882dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 883dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 884dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 885dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 886dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 887a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger/* Constructs a local name of form tcp:port. 888a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger * target_str points to the target string, it's content will be overwritten. 889a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger * target_size is the capacity of the target string. 890a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger * server_port is the port number to use for the local name. 891a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger */ 892a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzingervoid build_local_name(char* target_str, size_t target_size, int server_port) 893a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger{ 894a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger snprintf(target_str, target_size, "tcp:%d", server_port); 895a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger} 896a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger 897bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevich#if !ADB_HOST 898bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevichstatic int should_drop_privileges() { 8995890fe33141a9efd124c86c40a8c1ff6170ecf20Nick Kralevich#ifndef ALLOW_ADBD_ROOT 9005890fe33141a9efd124c86c40a8c1ff6170ecf20Nick Kralevich return 1; 9015890fe33141a9efd124c86c40a8c1ff6170ecf20Nick Kralevich#else /* ALLOW_ADBD_ROOT */ 902bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevich int secure = 0; 903bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevich char value[PROPERTY_VALUE_MAX]; 904bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevich 905bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevich /* run adbd in secure mode if ro.secure is set and 906bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevich ** we are not in the emulator 907bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevich */ 908bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevich property_get("ro.kernel.qemu", value, ""); 909bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevich if (strcmp(value, "1") != 0) { 910bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevich property_get("ro.secure", value, "1"); 911bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevich if (strcmp(value, "1") == 0) { 912bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevich // don't run as root if ro.secure is set... 913bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevich secure = 1; 914bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevich 915bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevich // ... except we allow running as root in userdebug builds if the 916bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevich // service.adb.root property has been set by the "adb root" command 917bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevich property_get("ro.debuggable", value, ""); 918bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevich if (strcmp(value, "1") == 0) { 919bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevich property_get("service.adb.root", value, ""); 920bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevich if (strcmp(value, "1") == 0) { 921bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevich secure = 0; 922bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevich } 923bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevich } 924bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevich } 925bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevich } 926bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevich return secure; 9275890fe33141a9efd124c86c40a8c1ff6170ecf20Nick Kralevich#endif /* ALLOW_ADBD_ROOT */ 928bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevich} 929bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevich#endif /* !ADB_HOST */ 930bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevich 931a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzingerint adb_main(int is_daemon, int server_port) 932dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 933dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if !ADB_HOST 9342f38b699713dc2587a771bd5d4c6a47329728f5eMike Lockwood int port; 935dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char value[PROPERTY_VALUE_MAX]; 936dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 937dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 938dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project atexit(adb_cleanup); 939dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef HAVE_WIN32_PROC 940dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SetConsoleCtrlHandler( ctrlc_handler, TRUE ); 941dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#elif defined(HAVE_FORKEXEC) 942408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall // No SIGCHLD. Let the service subproc handle its children. 943dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project signal(SIGPIPE, SIG_IGN); 944dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 945dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 946dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project init_transport_registration(); 947dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 948dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 949dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if ADB_HOST 950dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project HOST = 1; 951a09fbd164d2e088bc5433d310e25640ae048d47dXavier Ducrohet usb_vendors_init(); 952dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project usb_init(); 953a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger local_init(DEFAULT_ADB_LOCAL_TRANSPORT_PORT); 954dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 955a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger char local_name[30]; 956a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger build_local_name(local_name, sizeof(local_name), server_port); 957a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger if(install_listener(local_name, "*smartsocket*", NULL)) { 958dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project exit(1); 959dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 960dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#else 961dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 962a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger /* don't listen on a port (default 5037) if running in secure mode */ 963dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* don't run as root if we are running in secure mode */ 964bd9206bc7399b22d3917c737bb75f8534fa77e35Nick Kralevich if (should_drop_privileges()) { 9655f4b051235c3e9e9e5b34b4af885e42a1c711fc4Mike Lockwood struct __user_cap_header_struct header; 9665f4b051235c3e9e9e5b34b4af885e42a1c711fc4Mike Lockwood struct __user_cap_data_struct cap; 9675f4b051235c3e9e9e5b34b4af885e42a1c711fc4Mike Lockwood 96844db990d3a4ce0edbdd16fa7ac20693ef601b723Nick Kralevich if (prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0) != 0) { 96944db990d3a4ce0edbdd16fa7ac20693ef601b723Nick Kralevich exit(1); 97044db990d3a4ce0edbdd16fa7ac20693ef601b723Nick Kralevich } 9715f4b051235c3e9e9e5b34b4af885e42a1c711fc4Mike Lockwood 972dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* add extra groups: 973dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ** AID_ADB to access the USB driver 974dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ** AID_LOG to read system logs (adb logcat) 975dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ** AID_INPUT to diagnose input issues (getevent) 976dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ** AID_INET to diagnose network issues (netcfg, ping) 977dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ** AID_GRAPHICS to access the frame buffer 9782015549667fb77706a9879e974a3875ebccd8198The Android Open Source Project ** AID_NET_BT and AID_NET_BT_ADMIN to diagnose bluetooth (hcidump) 9796a3075c78287ea5a7ee7a3c85cde58e894350822Mike Lockwood ** AID_SDCARD_RW to allow writing to the SD card 980d969faa161310d0a3792766320daa3200b84bd74Mike Lockwood ** AID_MOUNT to allow unmounting the SD card before rebooting 98161b90bd211021886049f72cb666a5b49b83b3c64JP Abgrall ** AID_NET_BW_STATS to read out qtaguid statistics 982dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 9832015549667fb77706a9879e974a3875ebccd8198The Android Open Source Project gid_t groups[] = { AID_ADB, AID_LOG, AID_INPUT, AID_INET, AID_GRAPHICS, 98461b90bd211021886049f72cb666a5b49b83b3c64JP Abgrall AID_NET_BT, AID_NET_BT_ADMIN, AID_SDCARD_RW, AID_MOUNT, 98561b90bd211021886049f72cb666a5b49b83b3c64JP Abgrall AID_NET_BW_STATS }; 98644db990d3a4ce0edbdd16fa7ac20693ef601b723Nick Kralevich if (setgroups(sizeof(groups)/sizeof(groups[0]), groups) != 0) { 98744db990d3a4ce0edbdd16fa7ac20693ef601b723Nick Kralevich exit(1); 98844db990d3a4ce0edbdd16fa7ac20693ef601b723Nick Kralevich } 989dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 990dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* then switch user and group to "shell" */ 99144db990d3a4ce0edbdd16fa7ac20693ef601b723Nick Kralevich if (setgid(AID_SHELL) != 0) { 99244db990d3a4ce0edbdd16fa7ac20693ef601b723Nick Kralevich exit(1); 99344db990d3a4ce0edbdd16fa7ac20693ef601b723Nick Kralevich } 99444db990d3a4ce0edbdd16fa7ac20693ef601b723Nick Kralevich if (setuid(AID_SHELL) != 0) { 99544db990d3a4ce0edbdd16fa7ac20693ef601b723Nick Kralevich exit(1); 99644db990d3a4ce0edbdd16fa7ac20693ef601b723Nick Kralevich } 997dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 9985f4b051235c3e9e9e5b34b4af885e42a1c711fc4Mike Lockwood /* set CAP_SYS_BOOT capability, so "adb reboot" will succeed */ 9995f4b051235c3e9e9e5b34b4af885e42a1c711fc4Mike Lockwood header.version = _LINUX_CAPABILITY_VERSION; 10005f4b051235c3e9e9e5b34b4af885e42a1c711fc4Mike Lockwood header.pid = 0; 10015f4b051235c3e9e9e5b34b4af885e42a1c711fc4Mike Lockwood cap.effective = cap.permitted = (1 << CAP_SYS_BOOT); 10025f4b051235c3e9e9e5b34b4af885e42a1c711fc4Mike Lockwood cap.inheritable = 0; 10035f4b051235c3e9e9e5b34b4af885e42a1c711fc4Mike Lockwood capset(&header, &cap); 10045f4b051235c3e9e9e5b34b4af885e42a1c711fc4Mike Lockwood 1005a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger D("Local port disabled\n"); 1006dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 1007a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger char local_name[30]; 1008a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger build_local_name(local_name, sizeof(local_name), server_port); 1009a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger if(install_listener(local_name, "*smartsocket*", NULL)) { 1010dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project exit(1); 1011dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1012dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1013dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1014dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* for the device, start the usb transport if the 10158e2ceaeacf9fa1eb5ac41e4d3498836a6e2c7c97Mike Lockwood ** android usb device exists and the "service.adb.tcp.port" and 10168e2ceaeacf9fa1eb5ac41e4d3498836a6e2c7c97Mike Lockwood ** "persist.adb.tcp.port" properties are not set. 10178e2ceaeacf9fa1eb5ac41e4d3498836a6e2c7c97Mike Lockwood ** Otherwise start the network transport. 1018dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 10198e2ceaeacf9fa1eb5ac41e4d3498836a6e2c7c97Mike Lockwood property_get("service.adb.tcp.port", value, ""); 10208e2ceaeacf9fa1eb5ac41e4d3498836a6e2c7c97Mike Lockwood if (!value[0]) 10218e2ceaeacf9fa1eb5ac41e4d3498836a6e2c7c97Mike Lockwood property_get("persist.adb.tcp.port", value, ""); 1022cef31a02544d91b85481a5fa032b6126dbb32365Mike Lockwood if (sscanf(value, "%d", &port) == 1 && port > 0) { 1023cef31a02544d91b85481a5fa032b6126dbb32365Mike Lockwood // listen on TCP port specified by service.adb.tcp.port property 1024cef31a02544d91b85481a5fa032b6126dbb32365Mike Lockwood local_init(port); 1025cef31a02544d91b85481a5fa032b6126dbb32365Mike Lockwood } else if (access("/dev/android_adb", F_OK) == 0) { 1026cef31a02544d91b85481a5fa032b6126dbb32365Mike Lockwood // listen on USB 1027dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project usb_init(); 1028dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 1029cef31a02544d91b85481a5fa032b6126dbb32365Mike Lockwood // listen on default port 1030a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger local_init(DEFAULT_ADB_LOCAL_TRANSPORT_PORT); 1031dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1032408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall D("adb_main(): pre init_jdwp()\n"); 1033dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project init_jdwp(); 1034408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall D("adb_main(): post init_jdwp()\n"); 1035dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 1036dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1037dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (is_daemon) 1038dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { 1039dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // inform our parent that we are up and running. 1040dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef HAVE_WIN32_PROC 1041dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project DWORD count; 1042dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project WriteFile( GetStdHandle( STD_OUTPUT_HANDLE ), "OK\n", 3, &count, NULL ); 1043dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#elif defined(HAVE_FORKEXEC) 1044dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "OK\n"); 1045dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 1046dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project start_logging(); 1047dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1048408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall D("Event loop starting\n"); 1049dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1050dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fdevent_loop(); 1051dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1052dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project usb_cleanup(); 1053dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1054dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 1055dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 1056dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1057d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger#if ADB_HOST 1058d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzingervoid connect_device(char* host, char* buffer, int buffer_size) 1059d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger{ 1060d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger int port, fd; 1061d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger char* portstr = strchr(host, ':'); 1062cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood char hostbuf[100]; 1063cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood char serial[100]; 1064d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger 1065cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood strncpy(hostbuf, host, sizeof(hostbuf) - 1); 1066cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood if (portstr) { 1067cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood if (portstr - host >= sizeof(hostbuf)) { 1068cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood snprintf(buffer, buffer_size, "bad host name %s", host); 1069cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood return; 1070cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood } 1071cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood // zero terminate the host at the point we found the colon 1072cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood hostbuf[portstr - host] = 0; 1073cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood if (sscanf(portstr + 1, "%d", &port) == 0) { 1074cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood snprintf(buffer, buffer_size, "bad port number %s", portstr); 1075cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood return; 1076cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood } 1077cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood } else { 1078cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood port = DEFAULT_ADB_LOCAL_TRANSPORT_PORT; 1079d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger } 1080d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger 1081cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood snprintf(serial, sizeof(serial), "%s:%d", hostbuf, port); 1082cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood if (find_transport(serial)) { 1083cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood snprintf(buffer, buffer_size, "already connected to %s", serial); 1084d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger return; 1085d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger } 1086d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger 1087cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood fd = socket_network_client(hostbuf, port, SOCK_STREAM); 1088d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger if (fd < 0) { 1089d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger snprintf(buffer, buffer_size, "unable to connect to %s:%d", host, port); 1090d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger return; 1091d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger } 1092d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger 1093d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger D("client: connected on remote on fd %d\n", fd); 1094d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger close_on_exec(fd); 1095d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger disable_tcp_nagle(fd); 1096cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood register_socket_transport(fd, serial, port, 0); 1097cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood snprintf(buffer, buffer_size, "connected to %s", serial); 1098d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger} 1099d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger 1100d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzingervoid connect_emulator(char* port_spec, char* buffer, int buffer_size) 1101d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger{ 1102d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger char* port_separator = strchr(port_spec, ','); 1103d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger if (!port_separator) { 1104d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger snprintf(buffer, buffer_size, 1105d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger "unable to parse '%s' as <console port>,<adb port>", 1106d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger port_spec); 1107d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger return; 1108d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger } 1109d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger 1110d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger // Zero-terminate console port and make port_separator point to 2nd port. 1111d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger *port_separator++ = 0; 1112d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger int console_port = strtol(port_spec, NULL, 0); 1113d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger int adb_port = strtol(port_separator, NULL, 0); 1114d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger if (!(console_port > 0 && adb_port > 0)) { 1115d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger *(port_separator - 1) = ','; 1116d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger snprintf(buffer, buffer_size, 1117d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger "Invalid port numbers: Expected positive numbers, got '%s'", 1118d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger port_spec); 1119d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger return; 1120d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger } 1121d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger 1122d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger /* Check if the emulator is already known. 1123d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger * Note: There's a small but harmless race condition here: An emulator not 1124d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger * present just yet could be registered by another invocation right 1125d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger * after doing this check here. However, local_connect protects 1126d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger * against double-registration too. From here, a better error message 1127d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger * can be produced. In the case of the race condition, the very specific 1128d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger * error message won't be shown, but the data doesn't get corrupted. */ 1129d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger atransport* known_emulator = find_emulator_transport_by_adb_port(adb_port); 1130d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger if (known_emulator != NULL) { 1131d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger snprintf(buffer, buffer_size, 1132d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger "Emulator on port %d already registered.", adb_port); 1133d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger return; 1134d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger } 1135d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger 1136d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger /* Check if more emulators can be registered. Similar unproblematic 1137d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger * race condition as above. */ 1138d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger int candidate_slot = get_available_local_transport_index(); 1139d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger if (candidate_slot < 0) { 1140d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger snprintf(buffer, buffer_size, "Cannot accept more emulators."); 1141d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger return; 1142d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger } 1143d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger 1144d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger /* Preconditions met, try to connect to the emulator. */ 1145d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger if (!local_connect_arbitrary_ports(console_port, adb_port)) { 1146d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger snprintf(buffer, buffer_size, 1147d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger "Connected to emulator on ports %d,%d", console_port, adb_port); 1148d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger } else { 1149d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger snprintf(buffer, buffer_size, 1150d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger "Could not connect to emulator on ports %d,%d", 1151d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger console_port, adb_port); 1152d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger } 1153d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger} 1154d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger#endif 1155d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger 1156dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint handle_host_request(char *service, transport_type ttype, char* serial, int reply_fd, asocket *s) 1157dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 1158dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project atransport *transport = NULL; 1159dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char buf[4096]; 1160dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1161dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(service, "kill")) { 1162dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"adb server killed by remote request\n"); 1163dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fflush(stdout); 1164dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_write(reply_fd, "OKAY", 4); 1165dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project usb_cleanup(); 1166dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project exit(0); 1167dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1168dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1169dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if ADB_HOST 1170dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // "transport:" is used for switching transport with a specified serial number 1171dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // "transport-usb:" is used for switching transport to the only USB transport 1172dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // "transport-local:" is used for switching transport to the only local transport 1173dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // "transport-any:" is used for switching transport to the only transport 1174dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!strncmp(service, "transport", strlen("transport"))) { 1175dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char* error_string = "unknown failure"; 1176dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project transport_type type = kTransportAny; 1177dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1178dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!strncmp(service, "transport-usb", strlen("transport-usb"))) { 1179dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project type = kTransportUsb; 1180dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if (!strncmp(service, "transport-local", strlen("transport-local"))) { 1181dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project type = kTransportLocal; 1182dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if (!strncmp(service, "transport-any", strlen("transport-any"))) { 1183dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project type = kTransportAny; 1184dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if (!strncmp(service, "transport:", strlen("transport:"))) { 1185dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project service += strlen("transport:"); 11863175c8e9bfcb01f181d7300755da15a999e5461cTom Marlin serial = service; 1187dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1188dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1189dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project transport = acquire_one_transport(CS_ANY, type, serial, &error_string); 1190dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1191dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (transport) { 1192dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project s->transport = transport; 1193dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_write(reply_fd, "OKAY", 4); 1194dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 1195dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sendfailmsg(reply_fd, error_string); 1196dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1197dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 1198dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1199dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1200dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // return a list of all connected devices 1201dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!strcmp(service, "devices")) { 1202dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char buffer[4096]; 1203dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project memset(buf, 0, sizeof(buf)); 1204dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project memset(buffer, 0, sizeof(buffer)); 1205dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project D("Getting device list \n"); 1206dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project list_transports(buffer, sizeof(buffer)); 1207dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project snprintf(buf, sizeof(buf), "OKAY%04x%s",(unsigned)strlen(buffer),buffer); 1208dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project D("Wrote device list \n"); 1209dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project writex(reply_fd, buf, strlen(buf)); 1210dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 1211dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1212dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1213d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger // add a new TCP transport, device or emulator 12142f38b699713dc2587a771bd5d4c6a47329728f5eMike Lockwood if (!strncmp(service, "connect:", 8)) { 12152f38b699713dc2587a771bd5d4c6a47329728f5eMike Lockwood char buffer[4096]; 12162f38b699713dc2587a771bd5d4c6a47329728f5eMike Lockwood char* host = service + 8; 1217d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger if (!strncmp(host, "emu:", 4)) { 1218d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger connect_emulator(host + 4, buffer, sizeof(buffer)); 1219d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger } else { 1220d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger connect_device(host, buffer, sizeof(buffer)); 12212f38b699713dc2587a771bd5d4c6a47329728f5eMike Lockwood } 1222d9d1ca47802395e9e42e7deb05b2683d9d306598Stefan Hilzinger // Send response for emulator and device 122374d7ff8cfd490852d3df1c4b9d8a21beed619caaMike Lockwood snprintf(buf, sizeof(buf), "OKAY%04x%s",(unsigned)strlen(buffer), buffer); 122474d7ff8cfd490852d3df1c4b9d8a21beed619caaMike Lockwood writex(reply_fd, buf, strlen(buf)); 122574d7ff8cfd490852d3df1c4b9d8a21beed619caaMike Lockwood return 0; 122674d7ff8cfd490852d3df1c4b9d8a21beed619caaMike Lockwood } 122774d7ff8cfd490852d3df1c4b9d8a21beed619caaMike Lockwood 122874d7ff8cfd490852d3df1c4b9d8a21beed619caaMike Lockwood // remove TCP transport 122974d7ff8cfd490852d3df1c4b9d8a21beed619caaMike Lockwood if (!strncmp(service, "disconnect:", 11)) { 123074d7ff8cfd490852d3df1c4b9d8a21beed619caaMike Lockwood char buffer[4096]; 123174d7ff8cfd490852d3df1c4b9d8a21beed619caaMike Lockwood memset(buffer, 0, sizeof(buffer)); 123274d7ff8cfd490852d3df1c4b9d8a21beed619caaMike Lockwood char* serial = service + 11; 1233cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood if (serial[0] == 0) { 1234cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood // disconnect from all TCP devices 1235cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood unregister_all_tcp_transports(); 123674d7ff8cfd490852d3df1c4b9d8a21beed619caaMike Lockwood } else { 1237cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood char hostbuf[100]; 1238cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood // assume port 5555 if no port is specified 1239cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood if (!strchr(serial, ':')) { 1240cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood snprintf(hostbuf, sizeof(hostbuf) - 1, "%s:5555", serial); 1241cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood serial = hostbuf; 1242cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood } 1243cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood atransport *t = find_transport(serial); 1244cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood 1245cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood if (t) { 1246cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood unregister_transport(t); 1247cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood } else { 1248cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood snprintf(buffer, sizeof(buffer), "No such device %s", serial); 1249cbbe79add1410b53ec65936cfb1b74cac68467f0Mike Lockwood } 125074d7ff8cfd490852d3df1c4b9d8a21beed619caaMike Lockwood } 125174d7ff8cfd490852d3df1c4b9d8a21beed619caaMike Lockwood 125274d7ff8cfd490852d3df1c4b9d8a21beed619caaMike Lockwood snprintf(buf, sizeof(buf), "OKAY%04x%s",(unsigned)strlen(buffer), buffer); 12532f38b699713dc2587a771bd5d4c6a47329728f5eMike Lockwood writex(reply_fd, buf, strlen(buf)); 12542f38b699713dc2587a771bd5d4c6a47329728f5eMike Lockwood return 0; 12552f38b699713dc2587a771bd5d4c6a47329728f5eMike Lockwood } 12562f38b699713dc2587a771bd5d4c6a47329728f5eMike Lockwood 1257dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // returns our value for ADB_SERVER_VERSION 1258dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!strcmp(service, "version")) { 1259dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char version[12]; 1260dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project snprintf(version, sizeof version, "%04x", ADB_SERVER_VERSION); 1261dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project snprintf(buf, sizeof buf, "OKAY%04x%s", (unsigned)strlen(version), version); 1262dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project writex(reply_fd, buf, strlen(buf)); 1263dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 1264dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1265dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1266dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strncmp(service,"get-serialno",strlen("get-serialno"))) { 1267dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *out = "unknown"; 1268dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project transport = acquire_one_transport(CS_ANY, ttype, serial, NULL); 1269dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (transport && transport->serial) { 1270dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project out = transport->serial; 1271dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1272dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project snprintf(buf, sizeof buf, "OKAY%04x%s",(unsigned)strlen(out),out); 1273dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project writex(reply_fd, buf, strlen(buf)); 1274dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 1275dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1276dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // indicates a new emulator instance has started 1277dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!strncmp(service,"emulator:",9)) { 1278dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int port = atoi(service+9); 1279dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project local_connect(port); 1280dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* we don't even need to send a reply */ 1281dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 1282dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1283dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif // ADB_HOST 1284dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1285dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strncmp(service,"forward:",8) || !strncmp(service,"killforward:",12)) { 1286dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *local, *remote, *err; 1287dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int r; 1288dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project atransport *transport; 1289dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1290dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int createForward = strncmp(service,"kill",4); 1291dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1292dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project local = service + (createForward ? 8 : 12); 1293dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project remote = strchr(local,';'); 1294dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(remote == 0) { 1295dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sendfailmsg(reply_fd, "malformed forward spec"); 1296dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 1297dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1298dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1299dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *remote++ = 0; 1300dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if((local[0] == 0) || (remote[0] == 0) || (remote[0] == '*')){ 1301dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sendfailmsg(reply_fd, "malformed forward spec"); 1302dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 1303dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1304dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1305dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project transport = acquire_one_transport(CS_ANY, ttype, serial, &err); 1306dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!transport) { 1307dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sendfailmsg(reply_fd, err); 1308dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 1309dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1310dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1311dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (createForward) { 1312dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r = install_listener(local, remote, transport); 1313dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 1314dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r = remove_listener(local, remote, transport); 1315dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1316dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(r == 0) { 1317dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* 1st OKAY is connect, 2nd OKAY is status */ 1318dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project writex(reply_fd, "OKAYOKAY", 8); 1319dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 1320dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1321dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1322dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (createForward) { 1323dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sendfailmsg(reply_fd, (r == -1) ? "cannot rebind smartsocket" : "cannot bind socket"); 1324dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 1325dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sendfailmsg(reply_fd, "cannot remove listener"); 1326dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1327dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 1328dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1329dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1330dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strncmp(service,"get-state",strlen("get-state"))) { 1331dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project transport = acquire_one_transport(CS_ANY, ttype, serial, NULL); 1332dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *state = connection_state_name(transport); 1333dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project snprintf(buf, sizeof buf, "OKAY%04x%s",(unsigned)strlen(state),state); 1334dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project writex(reply_fd, buf, strlen(buf)); 1335dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 1336dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1337dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 1338dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 1339dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1340dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if !ADB_HOST 1341dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint recovery_mode = 0; 1342dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 1343dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1344dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint main(int argc, char **argv) 1345dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 1346dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if ADB_HOST 1347dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_sysdeps_init(); 1348408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall adb_trace_init(); 1349408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall D("Handling commandline()\n"); 1350dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return adb_commandline(argc - 1, argv + 1); 1351dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#else 135228781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine /* If adbd runs inside the emulator this will enable adb tracing via 135328781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine * adb-debug qemud service in the emulator. */ 135428781b0a52dfb5ad19121afcc6aef56918992b30Vladimir Chtchetkine adb_qemu_trace_init(); 1355dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if((argc > 1) && (!strcmp(argv[1],"recovery"))) { 1356dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_device_banner = "recovery"; 1357dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project recovery_mode = 1; 1358dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 13591f546e6d1f6ccd1964336ddf0d8e8b3b11b1e945Mike Lockwood 1360dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project start_device_log(); 1361408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall D("Handling main()\n"); 1362a84a42eb20d43ffa2695a69d583a6e09532b49d9Stefan Hilzinger return adb_main(0, DEFAULT_ADB_PORT); 1363dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 1364dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 1365