Merge changes I4d6bda45,I72576e1f

* changes:
  adb: fix transport acquisition for forward, reverse.
  adb: don't manually construct device selection prefix in forward.
This commit is contained in:
Josh Gao 2019-08-08 20:38:15 +00:00 committed by Gerrit Code Review
commit 6c4cfd6af5
4 changed files with 20 additions and 26 deletions

View file

@ -1243,11 +1243,7 @@ HostRequestResult handle_host_request(std::string_view service, TransportType ty
// TODO: Switch handle_forward_request to string_view. // TODO: Switch handle_forward_request to string_view.
std::string service_str(service); std::string service_str(service);
if (handle_forward_request( if (handle_forward_request(
service_str.c_str(), service_str.c_str(), [=](std::string* error) { return s->transport; }, reply_fd)) {
[=](std::string* error) {
return acquire_one_transport(type, serial, transport_id, nullptr, error);
},
reply_fd)) {
return HostRequestResult::Handled; return HostRequestResult::Handled;
} }

View file

@ -149,7 +149,8 @@ bool adb_status(borrowed_fd fd, std::string* error) {
return false; return false;
} }
static int _adb_connect(std::string_view service, TransportId* transport, std::string* error) { static int _adb_connect(std::string_view service, TransportId* transport, std::string* error,
bool force_switch = false) {
LOG(DEBUG) << "_adb_connect: " << service; LOG(DEBUG) << "_adb_connect: " << service;
if (service.empty() || service.size() > MAX_PAYLOAD) { if (service.empty() || service.size() > MAX_PAYLOAD) {
*error = android::base::StringPrintf("bad service name length (%zd)", service.size()); *error = android::base::StringPrintf("bad service name length (%zd)", service.size());
@ -164,7 +165,7 @@ static int _adb_connect(std::string_view service, TransportId* transport, std::s
return -2; return -2;
} }
if (!service.starts_with("host")) { if (!service.starts_with("host") || force_switch) {
std::optional<TransportId> transport_result = switch_socket_transport(fd.get(), error); std::optional<TransportId> transport_result = switch_socket_transport(fd.get(), error);
if (!transport_result) { if (!transport_result) {
return -1; return -1;
@ -323,7 +324,8 @@ bool adb_check_server_version(std::string* error) {
return result; return result;
} }
int adb_connect(TransportId* transport, std::string_view service, std::string* error) { int adb_connect(TransportId* transport, std::string_view service, std::string* error,
bool force_switch_device) {
LOG(DEBUG) << "adb_connect: service: " << service; LOG(DEBUG) << "adb_connect: service: " << service;
// Query the adb server's version. // Query the adb server's version.
@ -336,7 +338,7 @@ int adb_connect(TransportId* transport, std::string_view service, std::string* e
return 0; return 0;
} }
unique_fd fd(_adb_connect(service, transport, error)); unique_fd fd(_adb_connect(service, transport, error, force_switch_device));
if (fd == -1) { if (fd == -1) {
D("_adb_connect error: %s", error->c_str()); D("_adb_connect error: %s", error->c_str());
} else if(fd == -2) { } else if(fd == -2) {

View file

@ -34,7 +34,11 @@ bool adb_check_server_version(std::string* _Nonnull error);
int adb_connect(std::string_view service, std::string* _Nonnull error); int adb_connect(std::string_view service, std::string* _Nonnull error);
// Same as above, except returning the TransportId for the service that we've connected to. // Same as above, except returning the TransportId for the service that we've connected to.
int adb_connect(TransportId* _Nullable id, std::string_view service, std::string* _Nonnull error); // force_switch_device forces the function to attempt to select a device, even if the service
// string appears to be a host: service (for use with host services that are device specific, like
// forward).
int adb_connect(TransportId* _Nullable id, std::string_view service, std::string* _Nonnull error,
bool force_switch_device = false);
// Kill the currently running adb server, if it exists. // Kill the currently running adb server, if it exists.
bool adb_kill_server(); bool adb_kill_server();

View file

@ -1739,41 +1739,33 @@ int adb_commandline(int argc, const char** argv) {
// Determine the <host-prefix> for this command. // Determine the <host-prefix> for this command.
std::string host_prefix; std::string host_prefix;
if (reverse) { if (reverse) {
host_prefix = "reverse"; host_prefix = "reverse:";
} else { } else {
if (serial) { host_prefix = "host:";
host_prefix = android::base::StringPrintf("host-serial:%s", serial);
} else if (transport_type == kTransportUsb) {
host_prefix = "host-usb";
} else if (transport_type == kTransportLocal) {
host_prefix = "host-local";
} else {
host_prefix = "host";
}
} }
std::string cmd, error_message; std::string cmd, error_message;
if (strcmp(argv[0], "--list") == 0) { if (strcmp(argv[0], "--list") == 0) {
if (argc != 1) error_exit("--list doesn't take any arguments"); if (argc != 1) error_exit("--list doesn't take any arguments");
return adb_query_command(host_prefix + ":list-forward"); return adb_query_command(host_prefix + "list-forward");
} else if (strcmp(argv[0], "--remove-all") == 0) { } else if (strcmp(argv[0], "--remove-all") == 0) {
if (argc != 1) error_exit("--remove-all doesn't take any arguments"); if (argc != 1) error_exit("--remove-all doesn't take any arguments");
cmd = host_prefix + ":killforward-all"; cmd = "killforward-all";
} else if (strcmp(argv[0], "--remove") == 0) { } else if (strcmp(argv[0], "--remove") == 0) {
// forward --remove <local> // forward --remove <local>
if (argc != 2) error_exit("--remove requires an argument"); if (argc != 2) error_exit("--remove requires an argument");
cmd = host_prefix + ":killforward:" + argv[1]; cmd = std::string("killforward:") + argv[1];
} else if (strcmp(argv[0], "--no-rebind") == 0) { } else if (strcmp(argv[0], "--no-rebind") == 0) {
// forward --no-rebind <local> <remote> // forward --no-rebind <local> <remote>
if (argc != 3) error_exit("--no-rebind takes two arguments"); if (argc != 3) error_exit("--no-rebind takes two arguments");
if (forward_targets_are_valid(argv[1], argv[2], &error_message)) { if (forward_targets_are_valid(argv[1], argv[2], &error_message)) {
cmd = host_prefix + ":forward:norebind:" + argv[1] + ";" + argv[2]; cmd = std::string("forward:norebind:") + argv[1] + ";" + argv[2];
} }
} else { } else {
// forward <local> <remote> // forward <local> <remote>
if (argc != 2) error_exit("forward takes two arguments"); if (argc != 2) error_exit("forward takes two arguments");
if (forward_targets_are_valid(argv[0], argv[1], &error_message)) { if (forward_targets_are_valid(argv[0], argv[1], &error_message)) {
cmd = host_prefix + ":forward:" + argv[0] + ";" + argv[1]; cmd = std::string("forward:") + argv[0] + ";" + argv[1];
} }
} }
@ -1781,7 +1773,7 @@ int adb_commandline(int argc, const char** argv) {
error_exit("error: %s", error_message.c_str()); error_exit("error: %s", error_message.c_str());
} }
unique_fd fd(adb_connect(cmd, &error_message)); unique_fd fd(adb_connect(nullptr, host_prefix + cmd, &error_message, true));
if (fd < 0 || !adb_status(fd.get(), &error_message)) { if (fd < 0 || !adb_status(fd.get(), &error_message)) {
error_exit("error: %s", error_message.c_str()); error_exit("error: %s", error_message.c_str());
} }