adb: kick the transport after sending the "adb root" command

This is needed because the USB driver on the device no longer resets the bus
when exits and restarts.
Since the host side adb no longer detects that adbd has restarted we need
to reset the connection on the host side now.

Change-Id: I1a8eabd292e8b45c34fa07a8a8b8c609cc15648d
Signed-off-by: Mike Lockwood <lockwood@android.com>
This commit is contained in:
Mike Lockwood 2011-06-12 16:06:52 -04:00
parent 21a6c1c004
commit d15e6ac95d
2 changed files with 22 additions and 0 deletions

View File

@ -86,6 +86,12 @@ struct asocket {
*/
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
*/

View File

@ -190,6 +190,14 @@ static void local_socket_ready(asocket *s)
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 @@ void connect_to_remote(asocket *s, const char *destination)
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");
}