bool atransport::MatchesTarget(const std::string& target) const { if (serial) { if (target == serial) { return true; } else if (type == kTransportLocal) { // Local transports can match [tcp:|udp:]<hostname>[:port]. const char* local_target_ptr = target.c_str(); // For fastboot compatibility, ignore protocol prefixes. if (android::base::StartsWith(target, "tcp:") || android::base::StartsWith(target, "udp:")) { local_target_ptr += 4; } // Parse our |serial| and the given |target| to check if the hostnames and ports match. std::string serial_host, error; int serial_port = -1; if (android::base::ParseNetAddress(serial, &serial_host, &serial_port, nullptr, &error)) { // |target| may omit the port to default to ours. std::string target_host; int target_port = serial_port; if (android::base::ParseNetAddress(local_target_ptr, &target_host, &target_port, nullptr, &error) && serial_host == target_host && serial_port == target_port) { return true; } } } } return (devpath && target == devpath) || qual_match(target.c_str(), "product:", product, false) || qual_match(target.c_str(), "model:", model, true) || qual_match(target.c_str(), "device:", device, false); }
atransport *acquire_one_transport(int state, transport_type ttype, const char* serial, char** error_out) { atransport *t; atransport *result = NULL; int ambiguous = 0; retry: if (error_out) *error_out = "device not found"; adb_mutex_lock(&transport_lock); for (t = transport_list.next; t != &transport_list; t = t->next) { if (t->connection_state == CS_NOPERM) { if (error_out) *error_out = "insufficient permissions for device"; continue; } /* check for matching serial number */ if (serial) { if ((t->serial && !strcmp(serial, t->serial)) || (t->devpath && !strcmp(serial, t->devpath)) || qual_match(serial, "product:", t->product, 0) || qual_match(serial, "model:", t->model, 1) || qual_match(serial, "device:", t->device, 0)) { if (result) { if (error_out) *error_out = "more than one device"; ambiguous = 1; result = NULL; break; } result = t; } } else { if (ttype == kTransportUsb && t->type == kTransportUsb) { if (result) { if (error_out) *error_out = "more than one device"; ambiguous = 1; result = NULL; break; } result = t; } else if (ttype == kTransportLocal && t->type == kTransportLocal) { if (result) { if (error_out) *error_out = "more than one emulator"; ambiguous = 1; result = NULL; break; } result = t; } else if (ttype == kTransportAny) { if (result) { if (error_out) *error_out = "more than one device and emulator"; ambiguous = 1; result = NULL; break; } result = t; } } } adb_mutex_unlock(&transport_lock); if (result) { /* offline devices are ignored -- they are either being born or dying */ if (result && result->connection_state == CS_OFFLINE) { if (error_out) *error_out = "device offline"; result = NULL; } /* check for required connection state */ if (result && state != CS_ANY && result->connection_state != state) { if (error_out) *error_out = "invalid device state"; result = NULL; } } if (result) { /* found one that we can take */ if (error_out) *error_out = NULL; } else if (state != CS_ANY && (serial || !ambiguous)) { adb_sleep_ms(1000); goto retry; } return result; }
atransport* acquire_one_transport(ConnectionState state, TransportType type, const char* serial, std::string* error_out) { atransport *t; atransport *result = NULL; int ambiguous = 0; retry: if (error_out) *error_out = android::base::StringPrintf("device '%s' not found", serial); adb_mutex_lock(&transport_lock); for (t = transport_list.next; t != &transport_list; t = t->next) { if (t->connection_state == kCsNoPerm) { if (error_out) *error_out = "insufficient permissions for device"; continue; } /* check for matching serial number */ if (serial) { if ((t->serial && !strcmp(serial, t->serial)) || (t->devpath && !strcmp(serial, t->devpath)) || qual_match(serial, "product:", t->product, false) || qual_match(serial, "model:", t->model, true) || qual_match(serial, "device:", t->device, false)) { if (result) { if (error_out) *error_out = "more than one device"; ambiguous = 1; result = NULL; break; } result = t; } } else { if (type == kTransportUsb && t->type == kTransportUsb) { if (result) { if (error_out) *error_out = "more than one device"; ambiguous = 1; result = NULL; break; } result = t; } else if (type == kTransportLocal && t->type == kTransportLocal) { if (result) { if (error_out) *error_out = "more than one emulator"; ambiguous = 1; result = NULL; break; } result = t; } else if (type == kTransportAny) { if (result) { if (error_out) *error_out = "more than one device/emulator"; ambiguous = 1; result = NULL; break; } result = t; } } } adb_mutex_unlock(&transport_lock); if (result) { if (result->connection_state == kCsUnauthorized) { if (error_out) { *error_out = "device unauthorized.\n"; char* ADB_VENDOR_KEYS = getenv("ADB_VENDOR_KEYS"); *error_out += "This adbd's $ADB_VENDOR_KEYS is "; *error_out += ADB_VENDOR_KEYS ? ADB_VENDOR_KEYS : "not set"; *error_out += "; try 'adb kill-server' if that seems wrong.\n"; *error_out += "Otherwise check for a confirmation dialog on your device."; } result = NULL; } /* offline devices are ignored -- they are either being born or dying */ if (result && result->connection_state == kCsOffline) { if (error_out) *error_out = "device offline"; result = NULL; } /* check for required connection state */ if (result && state != kCsAny && result->connection_state != state) { if (error_out) *error_out = "invalid device state"; result = NULL; } } if (result) { /* found one that we can take */ if (error_out) *error_out = "success"; } else if (state != kCsAny && (serial || !ambiguous)) { adb_sleep_ms(1000); goto retry; } return result; }
atransport* acquire_one_transport(TransportType type, const char* serial, bool* is_ambiguous, std::string* error_out) { atransport* result = nullptr; if (serial) { *error_out = android::base::StringPrintf("device '%s' not found", serial); } else if (type == kTransportLocal) { *error_out = "no emulators found"; } else if (type == kTransportAny) { *error_out = "no devices/emulators found"; } else { *error_out = "no devices found"; } adb_mutex_lock(&transport_lock); for (const auto& t : transport_list) { if (t->connection_state == kCsNoPerm) { *error_out = "insufficient permissions for device"; continue; } // Check for matching serial number. if (serial) { if ((t->serial && !strcmp(serial, t->serial)) || (t->devpath && !strcmp(serial, t->devpath)) || qual_match(serial, "product:", t->product, false) || qual_match(serial, "model:", t->model, true) || qual_match(serial, "device:", t->device, false)) { if (result) { *error_out = "more than one device"; if (is_ambiguous) *is_ambiguous = true; result = nullptr; break; } result = t; } } else { if (type == kTransportUsb && t->type == kTransportUsb) { if (result) { *error_out = "more than one device"; if (is_ambiguous) *is_ambiguous = true; result = nullptr; break; } result = t; } else if (type == kTransportLocal && t->type == kTransportLocal) { if (result) { *error_out = "more than one emulator"; if (is_ambiguous) *is_ambiguous = true; result = nullptr; break; } result = t; } else if (type == kTransportAny) { if (result) { *error_out = "more than one device/emulator"; if (is_ambiguous) *is_ambiguous = true; result = nullptr; break; } result = t; } } } adb_mutex_unlock(&transport_lock); // Don't return unauthorized devices; the caller can't do anything with them. if (result && result->connection_state == kCsUnauthorized) { *error_out = "device unauthorized.\n"; char* ADB_VENDOR_KEYS = getenv("ADB_VENDOR_KEYS"); *error_out += "This adb server's $ADB_VENDOR_KEYS is "; *error_out += ADB_VENDOR_KEYS ? ADB_VENDOR_KEYS : "not set"; *error_out += "\n"; *error_out += "Try 'adb kill-server' if that seems wrong.\n"; *error_out += "Otherwise check for a confirmation dialog on your device."; result = nullptr; } // Don't return offline devices; the caller can't do anything with them. if (result && result->connection_state == kCsOffline) { *error_out = "device offline"; result = nullptr; } if (result) { *error_out = "success"; } return result; }
bool stateClause_matchKind (stateClause s1, stateClause s2) { return (s1->state == s2->state && s1->kind == s2->kind && qual_match (s1->squal, s2->squal)); }