diff options
Diffstat (limited to 'adb/adb.cpp')
-rw-r--r-- | adb/adb.cpp | 59 |
1 files changed, 47 insertions, 12 deletions
diff --git a/adb/adb.cpp b/adb/adb.cpp index c3e9731a30..08986b77e0 100644 --- a/adb/adb.cpp +++ b/adb/adb.cpp @@ -109,7 +109,9 @@ void handle_online(atransport *t) { D("adb: online"); t->online = 1; +#if ADB_HOST t->SetConnectionEstablished(true); +#endif } void handle_offline(atransport *t) @@ -1020,8 +1022,12 @@ bool handle_forward_request(const char* service, if (kill_forward) { r = remove_listener(pieces[0].c_str(), transport); } else { - r = install_listener(pieces[0], pieces[1].c_str(), transport, no_rebind, - &resolved_tcp_port, &error); + int flags = 0; + if (no_rebind) { + flags |= INSTALL_LISTENER_NO_REBIND; + } + r = install_listener(pieces[0], pieces[1].c_str(), transport, flags, &resolved_tcp_port, + &error); } if (r == INSTALL_STATUS_OK) { #if ADB_HOST @@ -1067,19 +1073,44 @@ static int SendOkay(int fd, const std::string& s) { return 0; } +static bool g_reject_kill_server = false; +void adb_set_reject_kill_server(bool value) { + g_reject_kill_server = value; +} + +static bool handle_mdns_request(std::string_view service, int reply_fd) { + if (!android::base::ConsumePrefix(&service, "mdns:")) { + return false; + } + + if (service == "check") { + std::string check = mdns_check(); + SendOkay(reply_fd, check); + return true; + } + if (service == "services") { + std::string services_list = mdns_list_discovered_services(); + SendOkay(reply_fd, services_list); + return true; + } + + return false; +} + HostRequestResult handle_host_request(std::string_view service, TransportType type, const char* serial, TransportId transport_id, int reply_fd, asocket* s) { if (service == "kill") { - fprintf(stderr, "adb server killed by remote request\n"); - fflush(stdout); - - // Send a reply even though we don't read it anymore, so that old versions - // of adb that do read it don't spew error messages. - SendOkay(reply_fd); + if (g_reject_kill_server) { + LOG(WARNING) << "adb server ignoring kill-server"; + SendFail(reply_fd, "kill-server rejected by remote server"); + } else { + fprintf(stderr, "adb server killed by remote request\n"); + SendOkay(reply_fd); - // Rely on process exit to close the socket for us. - exit(0); + // Rely on process exit to close the socket for us. + exit(0); + } } LOG(DEBUG) << "handle_host_request(" << service << ")"; @@ -1188,9 +1219,9 @@ HostRequestResult handle_host_request(std::string_view service, TransportType ty FeatureSet features = supported_features(); // Abuse features to report libusb status. if (should_use_libusb()) { - features.insert(kFeatureLibusb); + features.emplace_back(kFeatureLibusb); } - features.insert(kFeaturePushSync); + features.emplace_back(kFeaturePushSync); SendOkay(reply_fd, FeatureSetToString(features)); return HostRequestResult::Handled; } @@ -1310,6 +1341,10 @@ HostRequestResult handle_host_request(std::string_view service, TransportType ty return HostRequestResult::Handled; } + if (handle_mdns_request(service, reply_fd)) { + return HostRequestResult::Handled; + } + return HostRequestResult::Unhandled; } |