Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e109d266 authored by Scott Anderson's avatar Scott Anderson
Browse files

adb: Add ability to specify device path



For manufacturing and testing, there is a need to talk to
whatever device is connected to a given port on the host.  This
change modifies adb's "-s" option to take either a serial
number or a device path.  The device paths of the connected
devices can be listed using "adb devices -l" whose output
will resemble:

    List of devices attached
    016B75D60A00600D	usb:2-5	device
    3031D0B2E71D00EC	usb:1-4.3	device

The second column lists the device paths.  If the -l option is
not given, the output from "adb devices" will be the same as
it used to be (i.e. the paths will not be printed).

The device path can also be obtained with the get-devpath
command:

    $adb -s 3031D0B2E71D00EC get-devpath
    usb:1-4.3

Note that the format of the device paths are platform dependent.
The example above is from Linux.  On OS-X, the paths will be
"usb:" followed by hex digits.  For other platforms, the device
paths will be printed as "????????????" and the -s option will
not be able to select a device until someone implements the
underlying functionality.

Change-Id: I057d5d9f8c5bb72eddf5b8088aae110763f809d7
Signed-off-by: default avatarScott Anderson <saa@android.com>
parent 53834767
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -17,8 +17,10 @@ host:kill
    upgrade.

host:devices
host:devices-l
    Ask to return the list of available Android devices and their
    state. After the OKAY, this is followed by a 4-byte hex len,
    state. devices-l includes the device paths in the state.
    After the OKAY, this is followed by a 4-byte hex len,
    and a string that will be dumped as-is by the client, then
    the connection is closed

@@ -88,6 +90,9 @@ host:<request>
    Returns the serial number of the corresponding device/emulator.
    Note that emulator serial numbers are of the form "emulator-5554"

<host-prefix>:get-devpath
    Returns the device path of the corresponding device/emulator.

<host-prefix>:get-state
    Returns the state of a given device as a string.

+22 −9
Original line number Diff line number Diff line
@@ -1132,17 +1132,20 @@ int handle_host_request(char *service, transport_type ttype, char* serial, int r
    }

    // return a list of all connected devices
    if (!strcmp(service, "devices")) {
    if (!strncmp(service, "devices", 7)) {
        char buffer[4096];
        int use_long = !strcmp(service+7, "-l");
        if (use_long || service[7] == 0) {
            memset(buf, 0, sizeof(buf));
            memset(buffer, 0, sizeof(buffer));
            D("Getting device list \n");
        list_transports(buffer, sizeof(buffer));
            list_transports(buffer, sizeof(buffer), use_long);
            snprintf(buf, sizeof(buf), "OKAY%04x%s",(unsigned)strlen(buffer),buffer);
            D("Wrote device list \n");
            writex(reply_fd, buf, strlen(buf));
            return 0;
        }
    }

    // add a new TCP transport, device or emulator
    if (!strncmp(service, "connect:", 8)) {
@@ -1207,6 +1210,16 @@ int handle_host_request(char *service, transport_type ttype, char* serial, int r
        writex(reply_fd, buf, strlen(buf));
        return 0;
    }
    if(!strncmp(service,"get-devpath",strlen("get-devpath"))) {
        char *out = "unknown";
         transport = acquire_one_transport(CS_ANY, ttype, serial, NULL);
       if (transport && transport->devpath) {
            out = transport->devpath;
        }
        snprintf(buf, sizeof buf, "OKAY%04x%s",(unsigned)strlen(out),out);
        writex(reply_fd, buf, strlen(buf));
        return 0;
    }
    // indicates a new emulator instance has started
    if (!strncmp(service,"emulator:",9)) {
        int  port = atoi(service+9);
+3 −2
Original line number Diff line number Diff line
@@ -185,6 +185,7 @@ struct atransport
        /* used to identify transports for clients */
    char *serial;
    char *product;
    char *devpath;
    int adb_port; // Use for emulators (local transport)

        /* a list of adisconnect callbacks called when the transport is kicked */
@@ -248,7 +249,7 @@ int adb_main(int is_daemon, int server_port);
** get_device_transport does an acquire on your behalf before returning
*/
void init_transport_registration(void);
int  list_transports(char *buf, size_t  bufsize);
int  list_transports(char *buf, size_t  bufsize, int show_devpath);
void update_transports(void);

asocket*  create_device_tracker(void);
@@ -281,7 +282,7 @@ void register_socket_transport(int s, const char *serial, int port, int local);
void unregister_transport(atransport *t);
void unregister_all_tcp_transports();

void register_usb_transport(usb_handle *h, const char *serial, unsigned writeable);
void register_usb_transport(usb_handle *h, const char *serial, const char *devpath, unsigned writeable);

/* this should only be used for transports with connection_state == CS_NOPERM */
void unregister_usb_transport(usb_handle *usb);
+17 −5
Original line number Diff line number Diff line
@@ -84,8 +84,8 @@ void help()
        "                                 returns an error if more than one USB device is present.\n"
        " -e                            - directs command to the only running emulator.\n"
        "                                 returns an error if more than one emulator is running.\n"
        " -s <serial number>            - directs command to the USB device or emulator with\n"
        "                                 the given serial number. Overrides ANDROID_SERIAL\n"
        " -s <specific device>          - directs command to the device or emulator with the given\n"
        "                                 serial number or device path. Overrides ANDROID_SERIAL\n"
        "                                 environment variable.\n"
        " -p <product name or path>     - simple product name like 'sooner', or\n"
        "                                 a relative/absolute path to a product\n"
@@ -93,7 +93,8 @@ void help()
        "                                 If -p is not specified, the ANDROID_PRODUCT_OUT\n"
        "                                 environment variable is used, which must\n"
        "                                 be an absolute path.\n"
        " devices                       - list all connected devices\n"
        " devices [-l]                  - list all connected devices\n"
        "                                 ('-l' means list device paths)\n"
        " connect <host>[:<port>]       - connect to a device via TCP/IP\n"
        "                                 Port 5555 is used by default if no port number is specified.\n"
        " disconnect [<host>[:<port>]]  - disconnect from a TCP/IP device.\n"
@@ -157,6 +158,7 @@ void help()
        "  adb kill-server              - kill the server if it is running\n"
        "  adb get-state                - prints: offline | bootloader | device\n"
        "  adb get-serialno             - prints: <serial-number>\n"
        "  adb get-devpath              - prints: <device-path>\n"
        "  adb status-window            - continuously print device status for a specified device\n"
        "  adb remount                  - remounts the /system partition on the device read-write\n"
        "  adb reboot [bootloader|recovery] - reboots the device, optionally into the bootloader or recovery program\n"
@@ -931,7 +933,16 @@ top:

    if(!strcmp(argv[0], "devices")) {
        char *tmp;
        snprintf(buf, sizeof buf, "host:%s", argv[0]);
        char *listopt;
        if (argc < 2)
            listopt = "";
        else if (argc == 2 && !strcmp(argv[1], "-l"))
            listopt = argv[1];
        else {
            fprintf(stderr, "Usage: adb devices [-l]\n");
            return 1;
        }
        snprintf(buf, sizeof buf, "host:%s%s", argv[0], listopt);
        tmp = adb_query(buf);
        if(tmp) {
            printf("List of devices attached \n");
@@ -1204,7 +1215,8 @@ top:
    /* passthrough commands */

    if(!strcmp(argv[0],"get-state") ||
        !strcmp(argv[0],"get-serialno"))
        !strcmp(argv[0],"get-serialno") ||
        !strcmp(argv[0],"get-devpath"))
    {
        char *tmp;

+22 −4
Original line number Diff line number Diff line
@@ -370,7 +370,7 @@ static int list_transports_msg(char* buffer, size_t bufferlen)
    char  head[5];
    int   len;

    len = list_transports(buffer+4, bufferlen-4);
    len = list_transports(buffer+4, bufferlen-4, 0);
    snprintf(head, sizeof(head), "%04x", len);
    memcpy(buffer, head, 4);
    len += 4;
@@ -601,6 +601,8 @@ static void transport_registration_func(int _fd, unsigned ev, void *data)
            free(t->product);
        if (t->serial)
            free(t->serial);
        if (t->devpath)
            free(t->devpath);

        memset(t,0xee,sizeof(atransport));
        free(t);
@@ -762,6 +764,10 @@ retry:
                result = t;
                break;
            }
            if (t->devpath && !strcmp(serial, t->devpath)) {
                result = t;
                break;
            }
        } else {
            if (ttype == kTransportUsb && t->type == kTransportUsb) {
                if (result) {
@@ -836,7 +842,7 @@ static const char *statename(atransport *t)
    }
}

int list_transports(char *buf, size_t  bufsize)
int list_transports(char *buf, size_t  bufsize, int show_devpath)
{
    char*       p   = buf;
    char*       end = buf + bufsize;
@@ -849,6 +855,12 @@ int list_transports(char *buf, size_t bufsize)
        const char* serial = t->serial;
        if (!serial || !serial[0])
            serial = "????????????";
        if (show_devpath) {
            const char* devpath = t->devpath;
            if (!devpath || !devpath[0])
                devpath = "????????????";
            len = snprintf(p, end - p, "%s\t%s\t%s\n", serial, devpath, statename(t));
        } else
            len = snprintf(p, end - p, "%s\t%s\n", serial, statename(t));

        if (p + len >= end) {
@@ -910,6 +922,9 @@ atransport *find_transport(const char *serial)
        if (t->serial && !strcmp(serial, t->serial)) {
            break;
        }
        if (t->devpath && !strcmp(serial, t->devpath)) {
            break;
        }
     }
    adb_mutex_unlock(&transport_lock);

@@ -955,7 +970,7 @@ void unregister_all_tcp_transports()

#endif

void register_usb_transport(usb_handle *usb, const char *serial, unsigned writeable)
void register_usb_transport(usb_handle *usb, const char *serial, const char *devpath, unsigned writeable)
{
    atransport *t = calloc(1, sizeof(atransport));
    D("transport: %p init'ing for usb_handle %p (sn='%s')\n", t, usb,
@@ -964,6 +979,9 @@ void register_usb_transport(usb_handle *usb, const char *serial, unsigned writea
    if(serial) {
        t->serial = strdup(serial);
    }
    if(devpath) {
        t->devpath = strdup(devpath);
    }
    register_transport(t);
}

Loading