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");
     }