diff options
| author | Mike Lockwood <lockwood@android.com> | 2010-05-24 10:44:35 -0400 |
|---|---|---|
| committer | Mike Lockwood <lockwood@android.com> | 2010-06-02 11:31:26 -0400 |
| commit | cbbe79add1410b53ec65936cfb1b74cac68467f0 (patch) | |
| tree | 4b7c7dc05cbd7026be3a4414eedf0ae6e7924ca4 /adb/adb.c | |
| parent | 67d5358e2a870f9e9447517bfa49bf5c6b410a50 (diff) | |
| download | system_core-cbbe79add1410b53ec65936cfb1b74cac68467f0.tar.gz system_core-cbbe79add1410b53ec65936cfb1b74cac68467f0.tar.bz2 system_core-cbbe79add1410b53ec65936cfb1b74cac68467f0.zip | |
adb connect and disconnect improvements:
Port number is now optional. Will use default port 5555 if not specified.
"adb disconnect" with no additional arguments will disconnect all TCP devices.
Change-Id: I7fc26528ed85e66a73b8f6254cea7bf83d98109f
Signed-off-by: Mike Lockwood <lockwood@android.com>
Diffstat (limited to 'adb/adb.c')
| -rw-r--r-- | adb/adb.c | 59 |
1 files changed, 38 insertions, 21 deletions
@@ -971,25 +971,32 @@ void connect_device(char* host, char* buffer, int buffer_size) { int port, fd; char* portstr = strchr(host, ':'); - char buf[4096]; + char hostbuf[100]; + char serial[100]; - if (!portstr) { - snprintf(buffer, buffer_size, "unable to parse %s as <host>:<port>", host); - return; - } - if (find_transport(host)) { - snprintf(buffer, buffer_size, "already connected to %s", host); - return; + strncpy(hostbuf, host, sizeof(hostbuf) - 1); + if (portstr) { + if (portstr - host >= sizeof(hostbuf)) { + snprintf(buffer, buffer_size, "bad host name %s", host); + return; + } + // zero terminate the host at the point we found the colon + hostbuf[portstr - host] = 0; + if (sscanf(portstr + 1, "%d", &port) == 0) { + snprintf(buffer, buffer_size, "bad port number %s", portstr); + return; + } + } else { + port = DEFAULT_ADB_LOCAL_TRANSPORT_PORT; } - // zero terminate host by overwriting the ':' - *portstr++ = 0; - if (sscanf(portstr, "%d", &port) == 0) { - snprintf(buffer, buffer_size, "bad port number %s", portstr); + snprintf(serial, sizeof(serial), "%s:%d", hostbuf, port); + if (find_transport(serial)) { + snprintf(buffer, buffer_size, "already connected to %s", serial); return; } - fd = socket_network_client(host, port, SOCK_STREAM); + fd = socket_network_client(hostbuf, port, SOCK_STREAM); if (fd < 0) { snprintf(buffer, buffer_size, "unable to connect to %s:%d", host, port); return; @@ -998,9 +1005,8 @@ void connect_device(char* host, char* buffer, int buffer_size) D("client: connected on remote on fd %d\n", fd); close_on_exec(fd); disable_tcp_nagle(fd); - snprintf(buf, sizeof buf, "%s:%d", host, port); - register_socket_transport(fd, buf, port, 0); - snprintf(buffer, buffer_size, "connected to %s:%d", host, port); + register_socket_transport(fd, serial, port, 0); + snprintf(buffer, buffer_size, "connected to %s", serial); } void connect_emulator(char* port_spec, char* buffer, int buffer_size) @@ -1136,12 +1142,23 @@ int handle_host_request(char *service, transport_type ttype, char* serial, int r char buffer[4096]; memset(buffer, 0, sizeof(buffer)); char* serial = service + 11; - atransport *t = find_transport(serial); - - if (t) { - unregister_transport(t); + if (serial[0] == 0) { + // disconnect from all TCP devices + unregister_all_tcp_transports(); } else { - snprintf(buffer, sizeof(buffer), "No such device %s", serial); + char hostbuf[100]; + // assume port 5555 if no port is specified + if (!strchr(serial, ':')) { + snprintf(hostbuf, sizeof(hostbuf) - 1, "%s:5555", serial); + serial = hostbuf; + } + atransport *t = find_transport(serial); + + if (t) { + unregister_transport(t); + } else { + snprintf(buffer, sizeof(buffer), "No such device %s", serial); + } } snprintf(buf, sizeof(buf), "OKAY%04x%s",(unsigned)strlen(buffer), buffer); |
