summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--adb.cpp25
-rw-r--r--commandline.cpp15
-rw-r--r--sockets.cpp7
-rw-r--r--transport.cpp14
-rw-r--r--transport.h3
5 files changed, 53 insertions, 11 deletions
diff --git a/adb.cpp b/adb.cpp
index 29d6e65..8b6b2b5 100644
--- a/adb.cpp
+++ b/adb.cpp
@@ -1089,6 +1089,31 @@ int handle_host_request(const char* service, TransportType type,
return 1;
}
+ if (!strcmp(service, "reconnect-offline")) {
+ std::string response;
+ close_usb_devices([&response](const atransport* transport) {
+ switch (transport->connection_state) {
+ case kCsOffline:
+ case kCsUnauthorized:
+ response += "reconnecting ";
+ if (transport->serial) {
+ response += transport->serial;
+ } else {
+ response += "<unknown>";
+ }
+ response += "\n";
+ return true;
+ default:
+ return false;
+ }
+ });
+ if (!response.empty()) {
+ response.resize(response.size() - 1);
+ }
+ SendOkay(reply_fd, response);
+ return 0;
+ }
+
if (!strcmp(service, "features")) {
std::string error;
atransport* t = acquire_one_transport(type, serial, nullptr, &error);
diff --git a/commandline.cpp b/commandline.cpp
index 1f03c1a..e15bcad 100644
--- a/commandline.cpp
+++ b/commandline.cpp
@@ -1950,10 +1950,17 @@ int adb_commandline(int argc, const char** argv) {
} else if (!strcmp(argv[0], "reconnect")) {
if (argc == 1) {
return adb_query_command("host:reconnect");
- } else if (argc == 2 && !strcmp(argv[1], "device")) {
- std::string err;
- adb_connect("reconnect", &err);
- return 0;
+ } else if (argc == 2) {
+ if (!strcmp(argv[1], "device")) {
+ std::string err;
+ adb_connect("reconnect", &err);
+ return 0;
+ } else if (!strcmp(argv[1], "offline")) {
+ std::string err;
+ return adb_query_command("host:reconnect-offline");
+ } else {
+ return usage();
+ }
}
}
diff --git a/sockets.cpp b/sockets.cpp
index 3a57174..c05903f 100644
--- a/sockets.cpp
+++ b/sockets.cpp
@@ -791,11 +791,14 @@ static int smart_socket_enqueue(asocket* s, apacket* p) {
}
#endif
- if (!(s->transport) || (s->transport->connection_state == kCsOffline)) {
+ if (!s->transport) {
+ SendFail(s->peer->fd, "device offline (no transport)");
+ goto fail;
+ } else if (s->transport->connection_state == kCsOffline) {
/* if there's no remote we fail the connection
** right here and terminate it
*/
- SendFail(s->peer->fd, "device offline (x)");
+ SendFail(s->peer->fd, "device offline (transport offline)");
goto fail;
}
diff --git a/transport.cpp b/transport.cpp
index 7b4bb1c..132702d 100644
--- a/transport.cpp
+++ b/transport.cpp
@@ -908,13 +908,19 @@ std::string list_transports(bool long_listing) {
return result;
}
-/* hack for osx */
-void close_usb_devices() {
+void close_usb_devices(std::function<bool(const atransport*)> predicate) {
std::lock_guard<std::mutex> lock(transport_lock);
- for (const auto& t : transport_list) {
- t->Kick();
+ for (auto& t : transport_list) {
+ if (predicate(t)) {
+ t->Kick();
+ }
}
}
+
+/* hack for osx */
+void close_usb_devices() {
+ close_usb_devices([](const atransport*) { return true; });
+}
#endif // ADB_HOST
int register_socket_transport(int s, const char *serial, int port, int local) {
diff --git a/transport.h b/transport.h
index 621516c..b2df838 100644
--- a/transport.h
+++ b/transport.h
@@ -20,6 +20,7 @@
#include <sys/types.h>
#include <deque>
+#include <functional>
#include <list>
#include <memory>
#include <string>
@@ -199,8 +200,8 @@ void unregister_usb_transport(usb_handle* usb);
int check_header(apacket* p, atransport* t);
int check_data(apacket* p);
-/* for MacOS X cleanup */
void close_usb_devices();
+void close_usb_devices(std::function<bool(const atransport*)> predicate);
void send_packet(apacket* p, atransport* t);