From 0e2c19465964d27f6da0e5d23c329b7892d41204 Mon Sep 17 00:00:00 2001 From: Yabin Cui Date: Fri, 31 Jul 2015 14:10:54 -0700 Subject: [PATCH] adb: poll for emulator connection. Bug: 19974213 Change-Id: I336f3ad6f428277c54479e5b8c45d5343c64f472 --- adb/daemon/main.cpp | 7 ------- adb/transport_local.cpp | 26 ++++++++++++++++---------- 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/adb/daemon/main.cpp b/adb/daemon/main.cpp index a63d67e76..dc89639fa 100644 --- a/adb/daemon/main.cpp +++ b/adb/daemon/main.cpp @@ -68,13 +68,6 @@ static bool should_drop_privileges() { #if defined(ALLOW_ADBD_ROOT) char value[PROPERTY_VALUE_MAX]; - // The emulator is never secure, so don't drop privileges there. - // TODO: this seems like a bug --- shouldn't the emulator behave like a device? - property_get("ro.kernel.qemu", value, ""); - if (strcmp(value, "1") == 0) { - return false; - } - // The properties that affect `adb root` and `adb unroot` are ro.secure and // ro.debuggable. In this context the names don't make the expected behavior // particularly obvious. diff --git a/adb/transport_local.cpp b/adb/transport_local.cpp index db9bedb2d..650e5eab9 100644 --- a/adb/transport_local.cpp +++ b/adb/transport_local.cpp @@ -94,6 +94,10 @@ int local_connect_arbitrary_ports(int console_port, int adb_port, std::string* e int fd = -1; #if ADB_HOST + if (find_emulator_transport_by_adb_port(adb_port) != nullptr) { + return -1; + } + const char *host = getenv("ADBHOST"); if (host) { fd = network_connect(host, adb_port, SOCK_STREAM, 0, error); @@ -108,8 +112,10 @@ int local_connect_arbitrary_ports(int console_port, int adb_port, std::string* e close_on_exec(fd); disable_tcp_nagle(fd); std::string serial = android::base::StringPrintf("emulator-%d", console_port); - register_socket_transport(fd, serial.c_str(), adb_port, 1); - return 0; + if (register_socket_transport(fd, serial.c_str(), adb_port, 1) == 0) { + return 0; + } + adb_close(fd); } return -1; } @@ -118,16 +124,16 @@ int local_connect_arbitrary_ports(int console_port, int adb_port, std::string* e static void *client_socket_thread(void *x) { #if ADB_HOST - int port = DEFAULT_ADB_LOCAL_TRANSPORT_PORT; - int count = ADB_LOCAL_TRANSPORT_MAX; - D("transport: client_socket_thread() starting\n"); + while (true) { + int port = DEFAULT_ADB_LOCAL_TRANSPORT_PORT; + int count = ADB_LOCAL_TRANSPORT_MAX; - /* try to connect to any number of running emulator instances */ - /* this is only done when ADB starts up. later, each new emulator */ - /* will send a message to ADB to indicate that is is starting up */ - for ( ; count > 0; count--, port += 2 ) { - local_connect(port); + // Try to connect to any number of running emulator instances. + for ( ; count > 0; count--, port += 2 ) { + local_connect(port); + } + sleep(1); } #endif return 0;