void connect_emulator(char* port_spec, char* buffer, int buffer_size) { char* port_separator = strchr(port_spec, ','); if (!port_separator) { snprintf(buffer, buffer_size, "unable to parse '%s' as <console port>,<adb port>", port_spec); return; } // Zero-terminate console port and make port_separator point to 2nd port. *port_separator++ = 0; int console_port = strtol(port_spec, NULL, 0); int adb_port = strtol(port_separator, NULL, 0); if (!(console_port > 0 && adb_port > 0)) { *(port_separator - 1) = ','; snprintf(buffer, buffer_size, "Invalid port numbers: Expected positive numbers, got '%s'", port_spec); return; } /* Check if the emulator is already known. * Note: There's a small but harmless race condition here: An emulator not * present just yet could be registered by another invocation right * after doing this check here. However, local_connect protects * against double-registration too. From here, a better error message * can be produced. In the case of the race condition, the very specific * error message won't be shown, but the data doesn't get corrupted. */ atransport* known_emulator = find_emulator_transport_by_adb_port(adb_port); if (known_emulator != NULL) { snprintf(buffer, buffer_size, "Emulator on port %d already registered.", adb_port); return; } /* Check if more emulators can be registered. Similar unproblematic * race condition as above. */ int candidate_slot = get_available_local_transport_index(); if (candidate_slot < 0) { snprintf(buffer, buffer_size, "Cannot accept more emulators."); return; } /* Preconditions met, try to connect to the emulator. */ if (!local_connect_arbitrary_ports(console_port, adb_port)) { snprintf(buffer, buffer_size, "Connected to emulator on ports %d,%d", console_port, adb_port); } else { snprintf(buffer, buffer_size, "Could not connect to emulator on ports %d,%d", console_port, adb_port); } }
void connect_emulator(const std::string& port_spec, std::string* response) { std::vector<std::string> pieces = android::base::Split(port_spec, ","); if (pieces.size() != 2) { *response = android::base::StringPrintf("unable to parse '%s' as <console port>,<adb port>", port_spec.c_str()); return; } int console_port = strtol(pieces[0].c_str(), NULL, 0); int adb_port = strtol(pieces[1].c_str(), NULL, 0); if (console_port <= 0 || adb_port <= 0) { *response = android::base::StringPrintf("Invalid port numbers: %s", port_spec.c_str()); return; } // Check if the emulator is already known. // Note: There's a small but harmless race condition here: An emulator not // present just yet could be registered by another invocation right // after doing this check here. However, local_connect protects // against double-registration too. From here, a better error message // can be produced. In the case of the race condition, the very specific // error message won't be shown, but the data doesn't get corrupted. atransport* known_emulator = find_emulator_transport_by_adb_port(adb_port); if (known_emulator != nullptr) { *response = android::base::StringPrintf("Emulator already registered on port %d", adb_port); return; } // Check if more emulators can be registered. Similar unproblematic // race condition as above. int candidate_slot = get_available_local_transport_index(); if (candidate_slot < 0) { *response = "Cannot accept more emulators"; return; } // Preconditions met, try to connect to the emulator. std::string error; if (!local_connect_arbitrary_ports(console_port, adb_port, &error)) { *response = android::base::StringPrintf("Connected to emulator on ports %d,%d", console_port, adb_port); } else { *response = android::base::StringPrintf("Could not connect to emulator on ports %d,%d: %s", console_port, adb_port, error.c_str()); } }
int local_connect(int port, const char *device_name) { return local_connect_arbitrary_ports(port-1, port, device_name); }
void local_connect(int port) { std::string dummy; local_connect_arbitrary_ports(port-1, port, &dummy); }
int local_connect(int port) { return local_connect_arbitrary_ports(port-1, port); }
bool local_connect(int port) { std::string dummy; return local_connect_arbitrary_ports(port-1, port, &dummy) == 0; }