Merge "adb: kick the transport after sending the "adb root" command"
diff --git a/adb/adb.h b/adb/adb.h
index 92dc62e..ac5bc8b 100644
--- a/adb/adb.h
+++ b/adb/adb.h
@@ -86,6 +86,12 @@
*/
int closing;
+ /* flag: kick the transport when the socket is closed.
+ ** This is needed to handle commands that cause the
+ ** remote daemon to terminate, like "adb root"
+ */
+ int kick_on_close;
+
/* the asocket we are connected to
*/
diff --git a/adb/sockets.c b/adb/sockets.c
index 3d62f1e..6bfc7c8 100644
--- a/adb/sockets.c
+++ b/adb/sockets.c
@@ -190,6 +190,14 @@
static void local_socket_close(asocket *s)
{
+#if ADB_HOST
+ /* to special case commands that cause the remote daemon to terminate */
+ if (s->kick_on_close && s->transport) {
+ kick_transport(s->transport);
+ /* delay to work around a race condition */
+ sleep(1);
+ }
+#endif
adb_mutex_lock(&socket_list_lock);
local_socket_close_locked(s);
adb_mutex_unlock(&socket_list_lock);
@@ -524,6 +532,14 @@
apacket *p = get_apacket();
int len = strlen(destination) + 1;
+#if ADB_HOST
+ /* special case commands that cause the remote daemon to terminate */
+ if (!strcmp(destination, "root:")) {
+ D("connect_to_remote setting kick_on_close for %s\n", destination);
+ s->kick_on_close = 1;
+ }
+#endif
+
if(len > (MAX_PAYLOAD-1)) {
fatal("destination oversized");
}