services.c revision e037fd7e193ecccbb5c0888e49f6d58c224bc11d
1dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 2dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 3dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 4dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * you may not use this file except in compliance with the License. 6dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * You may obtain a copy of the License at 7dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 8dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 10dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * See the License for the specific language governing permissions and 14dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * limitations under the License. 15dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 16dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 17dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdlib.h> 18dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdio.h> 19dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <unistd.h> 20dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <string.h> 21dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <errno.h> 22dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 23dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "sysdeps.h" 24dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 25dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define TRACE_TAG TRACE_ADB 26dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "adb.h" 27dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "file_sync_service.h" 28dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 29dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if ADB_HOST 30dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project# ifndef HAVE_WINSOCK 31dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project# include <netinet/in.h> 32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project# include <netdb.h> 33dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project# endif 34dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 35dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 36dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttypedef struct stinfo stinfo; 37dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 38dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstruct stinfo { 39dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project void (*func)(int fd, void *cookie); 40dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int fd; 41dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project void *cookie; 42dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}; 43dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 44dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 45dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid *service_bootstrap_func(void *x) 46dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 47dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project stinfo *sti = x; 48dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sti->func(sti->fd, sti->cookie); 49dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free(sti); 50dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 51dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 52dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 53dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if ADB_HOST 54dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectADB_MUTEX_DEFINE( dns_lock ); 55dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 56dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void dns_service(int fd, void *cookie) 57dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 58dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *hostname = cookie; 59dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct hostent *hp; 60dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project unsigned zero = 0; 61dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 62dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_mutex_lock(&dns_lock); 63dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project hp = gethostbyname(hostname); 64dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(hp == 0) { 65dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project writex(fd, &zero, 4); 66dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 67dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project writex(fd, hp->h_addr, 4); 68dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 69dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_mutex_unlock(&dns_lock); 70dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_close(fd); 71dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 72dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#else 73dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectextern int recovery_mode; 74dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 75dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void recover_service(int s, void *cookie) 76dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 77dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project unsigned char buf[4096]; 78dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project unsigned count = (unsigned) cookie; 79dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int fd; 80dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 81dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fd = adb_creat("/tmp/update", 0644); 82dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(fd < 0) { 83dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_close(s); 84dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return; 85dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 86dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 87dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while(count > 0) { 88dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project unsigned xfer = (count > 4096) ? 4096 : count; 89dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(readx(s, buf, xfer)) break; 90dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(writex(fd, buf, xfer)) break; 91dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project count -= xfer; 92dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 93dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 94dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(count == 0) { 95dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project writex(s, "OKAY", 4); 96dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 97dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project writex(s, "FAIL", 4); 98dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 99dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_close(fd); 100dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_close(s); 101dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 102dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fd = adb_creat("/tmp/update.begin", 0644); 103dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_close(fd); 104dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 105dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 106e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Projectvoid restart_root_service(int fd, void *cookie) 107e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project{ 108e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project char buf[100]; 109e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project char value[PROPERTY_VALUE_MAX]; 110e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project 111e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project if (getuid() == 0) { 112e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project snprintf(buf, sizeof(buf), "adbd is already running as root\n"); 113e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project writex(fd, buf, strlen(buf)); 114e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project adb_close(fd); 115e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project } else { 116e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project property_get("ro.debuggable", value, ""); 117e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project if (strcmp(value, "1") != 0) { 118e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project snprintf(buf, sizeof(buf), "adbd cannot run as root in production builds\n"); 119e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project writex(fd, buf, strlen(buf)); 120e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project return; 121e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project } 122e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project 123e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project property_set("service.adb.root", "1"); 124e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project snprintf(buf, sizeof(buf), "restarting adbd as root\n"); 125e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project writex(fd, buf, strlen(buf)); 126e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project adb_close(fd); 127e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project 128e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project // quit, and init will restart us as root 129e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project sleep(1); 130e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project exit(1); 131e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project } 132e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project} 133e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project 134dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 135dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 136dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if 0 137dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void echo_service(int fd, void *cookie) 138dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 139dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char buf[4096]; 140dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int r; 141dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *p; 142dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int c; 143dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 144dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for(;;) { 145dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r = read(fd, buf, 4096); 146dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(r == 0) goto done; 147dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(r < 0) { 148dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(errno == EINTR) continue; 149dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project else goto done; 150dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 151dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 152dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c = r; 153dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project p = buf; 154dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while(c > 0) { 155dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r = write(fd, p, c); 156dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(r > 0) { 157dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c -= r; 158dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project p += r; 159dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project continue; 160dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 161dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if((r < 0) && (errno == EINTR)) continue; 162dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project goto done; 163dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 164dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 165dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectdone: 166dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project close(fd); 167dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 168dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 169dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 170dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int create_service_thread(void (*func)(int, void *), void *cookie) 171dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 172dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project stinfo *sti; 173dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_thread_t t; 174dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int s[2]; 175dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 176dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(adb_socketpair(s)) { 177dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("cannot create service socket pair\n"); 178dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 179dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 180dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 181dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sti = malloc(sizeof(stinfo)); 182dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(sti == 0) fatal("cannot allocate stinfo"); 183dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sti->func = func; 184dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sti->cookie = cookie; 185dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sti->fd = s[1]; 186dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 187dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(adb_thread_create( &t, service_bootstrap_func, sti)){ 188dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free(sti); 189dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_close(s[0]); 190dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_close(s[1]); 191dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("cannot create service thread\n"); 192dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 193dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 194dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 195dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project D("service thread started, %d:%d\n",s[0], s[1]); 196dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return s[0]; 197dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 198dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 199dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int create_subprocess(const char *cmd, const char *arg0, const char *arg1) 200dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 201dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef HAVE_WIN32_PROC 202dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "error: create_subprocess not implemented on Win32 (%s %s %s)\n", cmd, arg0, arg1); 203dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 204dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#else /* !HAVE_WIN32_PROC */ 205dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *devname; 206dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int ptm; 207dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pid_t pid; 208dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 209dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ptm = unix_open("/dev/ptmx", O_RDWR); // | O_NOCTTY); 210dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(ptm < 0){ 211dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("[ cannot open /dev/ptmx - %s ]\n",strerror(errno)); 212dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 213dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 214dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fcntl(ptm, F_SETFD, FD_CLOEXEC); 215dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 216dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(grantpt(ptm) || unlockpt(ptm) || 217dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ((devname = (char*) ptsname(ptm)) == 0)){ 218dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("[ trouble with /dev/ptmx - %s ]\n", strerror(errno)); 219dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 220dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 221dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 222dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pid = fork(); 223dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(pid < 0) { 224dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("- fork failed: %s -\n", strerror(errno)); 225dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 226dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 227dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 228dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(pid == 0){ 229dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int pts; 230dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 231dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project setsid(); 232dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 233dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pts = unix_open(devname, O_RDWR); 234dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(pts < 0) exit(-1); 235dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 236dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project dup2(pts, 0); 237dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project dup2(pts, 1); 238dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project dup2(pts, 2); 239dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 240dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_close(ptm); 241dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 242dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project execl(cmd, cmd, arg0, arg1, NULL); 243dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "- exec '%s' failed: %s (%d) -\n", 244dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project cmd, strerror(errno), errno); 245dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project exit(-1); 246dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 247dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return ptm; 248dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 249dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif /* !HAVE_WIN32_PROC */ 250dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 251dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 252dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if ADB_HOST 253dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define SHELL_COMMAND "/bin/sh" 254dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#else 255dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define SHELL_COMMAND "/system/bin/sh" 256dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 257dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 258dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint service_to_fd(const char *name) 259dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 260dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int ret = -1; 261dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 262dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strncmp(name, "tcp:", 4)) { 263dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int port = atoi(name + 4); 264dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project name = strchr(name + 4, ':'); 265dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(name == 0) { 266dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ret = socket_loopback_client(port, SOCK_STREAM); 267dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (ret >= 0) 268dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project disable_tcp_nagle(ret); 269dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 270dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if ADB_HOST 271dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_mutex_lock(&dns_lock); 272dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ret = socket_network_client(name + 1, port, SOCK_STREAM); 273dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_mutex_unlock(&dns_lock); 274dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#else 275dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 276dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 277dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 278dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifndef HAVE_WINSOCK /* winsock doesn't implement unix domain sockets */ 279dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if(!strncmp(name, "local:", 6)) { 280dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ret = socket_local_client(name + 6, 281dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ANDROID_SOCKET_NAMESPACE_RESERVED, SOCK_STREAM); 282dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if(!strncmp(name, "localreserved:", 14)) { 283dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ret = socket_local_client(name + 14, 284dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ANDROID_SOCKET_NAMESPACE_RESERVED, SOCK_STREAM); 285dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if(!strncmp(name, "localabstract:", 14)) { 286dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ret = socket_local_client(name + 14, 287dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ANDROID_SOCKET_NAMESPACE_ABSTRACT, SOCK_STREAM); 288dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if(!strncmp(name, "localfilesystem:", 16)) { 289dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ret = socket_local_client(name + 16, 290dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ANDROID_SOCKET_NAMESPACE_FILESYSTEM, SOCK_STREAM); 291dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 292dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if ADB_HOST 293dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if(!strncmp("dns:", name, 4)){ 294dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *n = strdup(name + 4); 295dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(n == 0) return -1; 296dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ret = create_service_thread(dns_service, n); 297dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#else /* !ADB_HOST */ 298dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if(!strncmp("dev:", name, 4)) { 299dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ret = unix_open(name + 4, O_RDWR); 300dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if(!strncmp(name, "framebuffer:", 12)) { 301dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ret = create_service_thread(framebuffer_service, 0); 302dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if(recovery_mode && !strncmp(name, "recover:", 8)) { 303dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ret = create_service_thread(recover_service, (void*) atoi(name + 8)); 304dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if (!strncmp(name, "jdwp:", 5)) { 305dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ret = create_jdwp_connection_fd(atoi(name+5)); 306dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if (!strncmp(name, "log:", 4)) { 307dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ret = create_service_thread(log_service, get_log_file_path(name + 4)); 308dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 309dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if(!HOST && !strncmp(name, "shell:", 6)) { 310dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(name[6]) { 311dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ret = create_subprocess(SHELL_COMMAND, "-c", name + 6); 312dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 313dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ret = create_subprocess(SHELL_COMMAND, "-", 0); 314dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 315dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if !ADB_HOST 316dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if(!strncmp(name, "sync:", 5)) { 317dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ret = create_service_thread(file_sync_service, NULL); 318dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if(!strncmp(name, "remount:", 8)) { 319dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ret = create_service_thread(remount_service, NULL); 320e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project } else if(!strncmp(name, "root:", 5)) { 321e037fd7e193ecccbb5c0888e49f6d58c224bc11dThe Android Open Source Project ret = create_service_thread(restart_root_service, NULL); 322dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 323dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if 0 324dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if(!strncmp(name, "echo:", 5)){ 325dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ret = create_service_thread(echo_service, 0); 326dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 327dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 328dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (ret >= 0) { 329dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project close_on_exec(ret); 330dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 331dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return ret; 332dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 333dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 334dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if ADB_HOST 335dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstruct state_info { 336dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project transport_type transport; 337dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char* serial; 338dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int state; 339dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}; 340dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 341dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void wait_for_state(int fd, void* cookie) 342dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 343dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct state_info* sinfo = cookie; 344dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char* err = "unknown error"; 345dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 346dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project D("wait_for_state %d\n", sinfo->state); 347dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 348dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project atransport *t = acquire_one_transport(sinfo->state, sinfo->transport, sinfo->serial, &err); 349dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(t != 0) { 350dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project writex(fd, "OKAY", 4); 351dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 352dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sendfailmsg(fd, err); 353dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 354dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 355dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (sinfo->serial) 356dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free(sinfo->serial); 357dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free(sinfo); 358dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_close(fd); 359dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project D("wait_for_state is done\n"); 360dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 361dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 362dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 363dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if ADB_HOST 364dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectasocket* host_service_to_socket(const char* name, const char *serial) 365dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 366dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!strcmp(name,"track-devices")) { 367dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return create_device_tracker(); 368dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if (!strncmp(name, "wait-for-", strlen("wait-for-"))) { 369dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct state_info* sinfo = malloc(sizeof(struct state_info)); 370dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 371dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (serial) 372dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sinfo->serial = strdup(serial); 373dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project else 374dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sinfo->serial = NULL; 375dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 376dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project name += strlen("wait-for-"); 377dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 378dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!strncmp(name, "local", strlen("local"))) { 379dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sinfo->transport = kTransportLocal; 380dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sinfo->state = CS_DEVICE; 381dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if (!strncmp(name, "usb", strlen("usb"))) { 382dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sinfo->transport = kTransportUsb; 383dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sinfo->state = CS_DEVICE; 384dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if (!strncmp(name, "any", strlen("any"))) { 385dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sinfo->transport = kTransportAny; 386dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sinfo->state = CS_DEVICE; 387dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 388dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free(sinfo); 389dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return NULL; 390dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 391dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 392dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int fd = create_service_thread(wait_for_state, sinfo); 393dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return create_local_socket(fd); 394dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 395dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return NULL; 396dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 397dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif /* ADB_HOST */ 398