Home | History | Annotate | Download | only in adb
      1 /*
      2  * Copyright (C) 2007 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #ifndef __ADB_H
     18 #define __ADB_H
     19 
     20 #include <limits.h>
     21 
     22 #include "transport.h"  /* readx(), writex() */
     23 
     24 #define MAX_PAYLOAD 4096
     25 
     26 #define A_SYNC 0x434e5953
     27 #define A_CNXN 0x4e584e43
     28 #define A_OPEN 0x4e45504f
     29 #define A_OKAY 0x59414b4f
     30 #define A_CLSE 0x45534c43
     31 #define A_WRTE 0x45545257
     32 #define A_AUTH 0x48545541
     33 
     34 #define A_VERSION 0x01000000        // ADB protocol version
     35 
     36 #define ADB_VERSION_MAJOR 1         // Used for help/version information
     37 #define ADB_VERSION_MINOR 0         // Used for help/version information
     38 
     39 #define ADB_SERVER_VERSION    31    // Increment this when we want to force users to start a new adb server
     40 
     41 typedef struct amessage amessage;
     42 typedef struct apacket apacket;
     43 typedef struct asocket asocket;
     44 typedef struct alistener alistener;
     45 typedef struct aservice aservice;
     46 typedef struct atransport atransport;
     47 typedef struct adisconnect  adisconnect;
     48 typedef struct usb_handle usb_handle;
     49 
     50 struct amessage {
     51     unsigned command;       /* command identifier constant      */
     52     unsigned arg0;          /* first argument                   */
     53     unsigned arg1;          /* second argument                  */
     54     unsigned data_length;   /* length of payload (0 is allowed) */
     55     unsigned data_check;    /* checksum of data payload         */
     56     unsigned magic;         /* command ^ 0xffffffff             */
     57 };
     58 
     59 struct apacket
     60 {
     61     apacket *next;
     62 
     63     unsigned len;
     64     unsigned char *ptr;
     65 
     66     amessage msg;
     67     unsigned char data[MAX_PAYLOAD];
     68 };
     69 
     70 /* An asocket represents one half of a connection between a local and
     71 ** remote entity.  A local asocket is bound to a file descriptor.  A
     72 ** remote asocket is bound to the protocol engine.
     73 */
     74 struct asocket {
     75         /* chain pointers for the local/remote list of
     76         ** asockets that this asocket lives in
     77         */
     78     asocket *next;
     79     asocket *prev;
     80 
     81         /* the unique identifier for this asocket
     82         */
     83     unsigned id;
     84 
     85         /* flag: set when the socket's peer has closed
     86         ** but packets are still queued for delivery
     87         */
     88     int    closing;
     89 
     90         /* flag: quit adbd when both ends close the
     91         ** local service socket
     92         */
     93     int    exit_on_close;
     94 
     95         /* the asocket we are connected to
     96         */
     97 
     98     asocket *peer;
     99 
    100         /* For local asockets, the fde is used to bind
    101         ** us to our fd event system.  For remote asockets
    102         ** these fields are not used.
    103         */
    104     fdevent fde;
    105     int fd;
    106 
    107         /* queue of apackets waiting to be written
    108         */
    109     apacket *pkt_first;
    110     apacket *pkt_last;
    111 
    112         /* enqueue is called by our peer when it has data
    113         ** for us.  It should return 0 if we can accept more
    114         ** data or 1 if not.  If we return 1, we must call
    115         ** peer->ready() when we once again are ready to
    116         ** receive data.
    117         */
    118     int (*enqueue)(asocket *s, apacket *pkt);
    119 
    120         /* ready is called by the peer when it is ready for
    121         ** us to send data via enqueue again
    122         */
    123     void (*ready)(asocket *s);
    124 
    125         /* close is called by the peer when it has gone away.
    126         ** we are not allowed to make any further calls on the
    127         ** peer once our close method is called.
    128         */
    129     void (*close)(asocket *s);
    130 
    131         /* socket-type-specific extradata */
    132     void *extra;
    133 
    134     	/* A socket is bound to atransport */
    135     atransport *transport;
    136 };
    137 
    138 
    139 /* the adisconnect structure is used to record a callback that
    140 ** will be called whenever a transport is disconnected (e.g. by the user)
    141 ** this should be used to cleanup objects that depend on the
    142 ** transport (e.g. remote sockets, listeners, etc...)
    143 */
    144 struct  adisconnect
    145 {
    146     void        (*func)(void*  opaque, atransport*  t);
    147     void*         opaque;
    148     adisconnect*  next;
    149     adisconnect*  prev;
    150 };
    151 
    152 
    153 /* a transport object models the connection to a remote device or emulator
    154 ** there is one transport per connected device/emulator. a "local transport"
    155 ** connects through TCP (for the emulator), while a "usb transport" through
    156 ** USB (for real devices)
    157 **
    158 ** note that kTransportHost doesn't really correspond to a real transport
    159 ** object, it's a special value used to indicate that a client wants to
    160 ** connect to a service implemented within the ADB server itself.
    161 */
    162 typedef enum transport_type {
    163         kTransportUsb,
    164         kTransportLocal,
    165         kTransportAny,
    166         kTransportHost,
    167 } transport_type;
    168 
    169 #define TOKEN_SIZE 20
    170 
    171 struct atransport
    172 {
    173     atransport *next;
    174     atransport *prev;
    175 
    176     int (*read_from_remote)(apacket *p, atransport *t);
    177     int (*write_to_remote)(apacket *p, atransport *t);
    178     void (*close)(atransport *t);
    179     void (*kick)(atransport *t);
    180 
    181     int fd;
    182     int transport_socket;
    183     fdevent transport_fde;
    184     int ref_count;
    185     unsigned sync_token;
    186     int connection_state;
    187     int online;
    188     transport_type type;
    189 
    190         /* usb handle or socket fd as needed */
    191     usb_handle *usb;
    192     int sfd;
    193 
    194         /* used to identify transports for clients */
    195     char *serial;
    196     char *product;
    197     char *model;
    198     char *device;
    199     char *devpath;
    200     int adb_port; // Use for emulators (local transport)
    201 
    202         /* a list of adisconnect callbacks called when the transport is kicked */
    203     int          kicked;
    204     adisconnect  disconnects;
    205 
    206     void *key;
    207     unsigned char token[TOKEN_SIZE];
    208     fdevent auth_fde;
    209     unsigned failed_auth_attempts;
    210 };
    211 
    212 
    213 /* A listener is an entity which binds to a local port
    214 ** and, upon receiving a connection on that port, creates
    215 ** an asocket to connect the new local connection to a
    216 ** specific remote service.
    217 **
    218 ** TODO: some listeners read from the new connection to
    219 ** determine what exact service to connect to on the far
    220 ** side.
    221 */
    222 struct alistener
    223 {
    224     alistener *next;
    225     alistener *prev;
    226 
    227     fdevent fde;
    228     int fd;
    229 
    230     const char *local_name;
    231     const char *connect_to;
    232     atransport *transport;
    233     adisconnect  disconnect;
    234 };
    235 
    236 
    237 void print_packet(const char *label, apacket *p);
    238 
    239 asocket *find_local_socket(unsigned id);
    240 void install_local_socket(asocket *s);
    241 void remove_socket(asocket *s);
    242 void close_all_sockets(atransport *t);
    243 
    244 #define  LOCAL_CLIENT_PREFIX  "emulator-"
    245 
    246 asocket *create_local_socket(int fd);
    247 asocket *create_local_service_socket(const char *destination);
    248 
    249 asocket *create_remote_socket(unsigned id, atransport *t);
    250 void connect_to_remote(asocket *s, const char *destination);
    251 void connect_to_smartsocket(asocket *s);
    252 
    253 void fatal(const char *fmt, ...);
    254 void fatal_errno(const char *fmt, ...);
    255 
    256 void handle_packet(apacket *p, atransport *t);
    257 void send_packet(apacket *p, atransport *t);
    258 
    259 void get_my_path(char *s, size_t maxLen);
    260 int launch_server(int server_port);
    261 int adb_main(int is_daemon, int server_port);
    262 
    263 
    264 /* transports are ref-counted
    265 ** get_device_transport does an acquire on your behalf before returning
    266 */
    267 void init_transport_registration(void);
    268 int  list_transports(char *buf, size_t  bufsize, int long_listing);
    269 void update_transports(void);
    270 
    271 asocket*  create_device_tracker(void);
    272 
    273 /* Obtain a transport from the available transports.
    274 ** If state is != CS_ANY, only transports in that state are considered.
    275 ** If serial is non-NULL then only the device with that serial will be chosen.
    276 ** If no suitable transport is found, error is set.
    277 */
    278 atransport *acquire_one_transport(int state, transport_type ttype, const char* serial, char **error_out);
    279 void   add_transport_disconnect( atransport*  t, adisconnect*  dis );
    280 void   remove_transport_disconnect( atransport*  t, adisconnect*  dis );
    281 void   run_transport_disconnects( atransport*  t );
    282 void   kick_transport( atransport*  t );
    283 
    284 /* initialize a transport object's func pointers and state */
    285 #if ADB_HOST
    286 int get_available_local_transport_index();
    287 #endif
    288 int  init_socket_transport(atransport *t, int s, int port, int local);
    289 void init_usb_transport(atransport *t, usb_handle *usb, int state);
    290 
    291 /* for MacOS X cleanup */
    292 void close_usb_devices();
    293 
    294 /* cause new transports to be init'd and added to the list */
    295 void register_socket_transport(int s, const char *serial, int port, int local);
    296 
    297 /* these should only be used for the "adb disconnect" command */
    298 void unregister_transport(atransport *t);
    299 void unregister_all_tcp_transports();
    300 
    301 void register_usb_transport(usb_handle *h, const char *serial, const char *devpath, unsigned writeable);
    302 
    303 /* this should only be used for transports with connection_state == CS_NOPERM */
    304 void unregister_usb_transport(usb_handle *usb);
    305 
    306 atransport *find_transport(const char *serial);
    307 #if ADB_HOST
    308 atransport* find_emulator_transport_by_adb_port(int adb_port);
    309 #endif
    310 
    311 int service_to_fd(const char *name);
    312 #if ADB_HOST
    313 asocket *host_service_to_socket(const char*  name, const char *serial);
    314 #endif
    315 
    316 #if !ADB_HOST
    317 int       init_jdwp(void);
    318 asocket*  create_jdwp_service_socket();
    319 asocket*  create_jdwp_tracker_service_socket();
    320 int       create_jdwp_connection_fd(int  jdwp_pid);
    321 #endif
    322 
    323 #if !ADB_HOST
    324 typedef enum {
    325     BACKUP,
    326     RESTORE
    327 } BackupOperation;
    328 int backup_service(BackupOperation operation, char* args);
    329 void framebuffer_service(int fd, void *cookie);
    330 void log_service(int fd, void *cookie);
    331 void remount_service(int fd, void *cookie);
    332 char * get_log_file_path(const char * log_name);
    333 #endif
    334 
    335 /* packet allocator */
    336 apacket *get_apacket(void);
    337 void put_apacket(apacket *p);
    338 
    339 int check_header(apacket *p);
    340 int check_data(apacket *p);
    341 
    342 /* define ADB_TRACE to 1 to enable tracing support, or 0 to disable it */
    343 
    344 #define  ADB_TRACE    1
    345 
    346 /* IMPORTANT: if you change the following list, don't
    347  * forget to update the corresponding 'tags' table in
    348  * the adb_trace_init() function implemented in adb.c
    349  */
    350 typedef enum {
    351     TRACE_ADB = 0,   /* 0x001 */
    352     TRACE_SOCKETS,
    353     TRACE_PACKETS,
    354     TRACE_TRANSPORT,
    355     TRACE_RWX,       /* 0x010 */
    356     TRACE_USB,
    357     TRACE_SYNC,
    358     TRACE_SYSDEPS,
    359     TRACE_JDWP,      /* 0x100 */
    360     TRACE_SERVICES,
    361     TRACE_AUTH,
    362 } AdbTrace;
    363 
    364 #if ADB_TRACE
    365 
    366 #if !ADB_HOST
    367 /*
    368  * When running inside the emulator, guest's adbd can connect to 'adb-debug'
    369  * qemud service that can display adb trace messages (on condition that emulator
    370  * has been started with '-debug adb' option).
    371  */
    372 
    373 /* Delivers a trace message to the emulator via QEMU pipe. */
    374 void adb_qemu_trace(const char* fmt, ...);
    375 /* Macro to use to send ADB trace messages to the emulator. */
    376 #define DQ(...)    adb_qemu_trace(__VA_ARGS__)
    377 #else
    378 #define DQ(...) ((void)0)
    379 #endif  /* !ADB_HOST */
    380 
    381   extern int     adb_trace_mask;
    382   extern unsigned char    adb_trace_output_count;
    383   void    adb_trace_init(void);
    384 
    385 #  define ADB_TRACING  ((adb_trace_mask & (1 << TRACE_TAG)) != 0)
    386 
    387   /* you must define TRACE_TAG before using this macro */
    388 #  define  D(...)                                      \
    389         do {                                           \
    390             if (ADB_TRACING) {                         \
    391                 int save_errno = errno;                \
    392                 adb_mutex_lock(&D_lock);               \
    393                 fprintf(stderr, "%s::%s():",           \
    394                         __FILE__, __FUNCTION__);       \
    395                 errno = save_errno;                    \
    396                 fprintf(stderr, __VA_ARGS__ );         \
    397                 fflush(stderr);                        \
    398                 adb_mutex_unlock(&D_lock);             \
    399                 errno = save_errno;                    \
    400            }                                           \
    401         } while (0)
    402 #  define  DR(...)                                     \
    403         do {                                           \
    404             if (ADB_TRACING) {                         \
    405                 int save_errno = errno;                \
    406                 adb_mutex_lock(&D_lock);               \
    407                 errno = save_errno;                    \
    408                 fprintf(stderr, __VA_ARGS__ );         \
    409                 fflush(stderr);                        \
    410                 adb_mutex_unlock(&D_lock);             \
    411                 errno = save_errno;                    \
    412            }                                           \
    413         } while (0)
    414 #else
    415 #  define  D(...)          ((void)0)
    416 #  define  DR(...)         ((void)0)
    417 #  define  ADB_TRACING     0
    418 #endif
    419 
    420 
    421 #if !DEBUG_PACKETS
    422 #define print_packet(tag,p) do {} while (0)
    423 #endif
    424 
    425 #if ADB_HOST_ON_TARGET
    426 /* adb and adbd are coexisting on the target, so use 5038 for adb
    427  * to avoid conflicting with adbd's usage of 5037
    428  */
    429 #  define DEFAULT_ADB_PORT 5038
    430 #else
    431 #  define DEFAULT_ADB_PORT 5037
    432 #endif
    433 
    434 #define DEFAULT_ADB_LOCAL_TRANSPORT_PORT 5555
    435 
    436 #define ADB_CLASS              0xff
    437 #define ADB_SUBCLASS           0x42
    438 #define ADB_PROTOCOL           0x1
    439 
    440 
    441 void local_init(int port);
    442 int  local_connect(int  port);
    443 int  local_connect_arbitrary_ports(int console_port, int adb_port);
    444 
    445 /* usb host/client interface */
    446 void usb_init();
    447 void usb_cleanup();
    448 int usb_write(usb_handle *h, const void *data, int len);
    449 int usb_read(usb_handle *h, void *data, int len);
    450 int usb_close(usb_handle *h);
    451 void usb_kick(usb_handle *h);
    452 
    453 /* used for USB device detection */
    454 #if ADB_HOST
    455 int is_adb_interface(int vid, int pid, int usb_class, int usb_subclass, int usb_protocol);
    456 #endif
    457 
    458 unsigned host_to_le32(unsigned n);
    459 int adb_commandline(int argc, char **argv);
    460 
    461 int connection_state(atransport *t);
    462 
    463 #define CS_ANY       -1
    464 #define CS_OFFLINE    0
    465 #define CS_BOOTLOADER 1
    466 #define CS_DEVICE     2
    467 #define CS_HOST       3
    468 #define CS_RECOVERY   4
    469 #define CS_NOPERM     5 /* Insufficient permissions to communicate with the device */
    470 #define CS_SIDELOAD   6
    471 
    472 extern int HOST;
    473 extern int SHELL_EXIT_NOTIFY_FD;
    474 
    475 #define CHUNK_SIZE (64*1024)
    476 
    477 #if !ADB_HOST
    478 #define USB_ADB_PATH     "/dev/android_adb"
    479 
    480 #define USB_FFS_ADB_PATH  "/dev/usb-ffs/adb/"
    481 #define USB_FFS_ADB_EP(x) USB_FFS_ADB_PATH#x
    482 
    483 #define USB_FFS_ADB_EP0   USB_FFS_ADB_EP(ep0)
    484 #define USB_FFS_ADB_OUT   USB_FFS_ADB_EP(ep1)
    485 #define USB_FFS_ADB_IN    USB_FFS_ADB_EP(ep2)
    486 #endif
    487 
    488 int sendfailmsg(int fd, const char *reason);
    489 int handle_host_request(char *service, transport_type ttype, char* serial, int reply_fd, asocket *s);
    490 
    491 #endif
    492