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:
parent
21a6c1c004
commit
d15e6ac95d
|
@ -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
|
||||
*/
|
||||
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue