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 #define MAX_PAYLOAD 4096
     23 
     24 #define A_SYNC 0x434e5953
     25 #define A_CNXN 0x4e584e43
     26 #define A_OPEN 0x4e45504f
     27 #define A_OKAY 0x59414b4f
     28 #define A_CLSE 0x45534c43
     29 #define A_WRTE 0x45545257
     30 
     31 #define A_VERSION 0x01000000        // ADB protocol version
     32 
     33 #define ADB_VERSION_MAJOR 1         // Used for help/version information
     34 #define ADB_VERSION_MINOR 0         // Used for help/version information
     35 
     36 #define ADB_SERVER_VERSION    26    // Increment this when we want to force users to start a new adb server
     37 
     38 typedef struct amessage amessage;
     39 typedef struct apacket apacket;
     40 typedef struct asocket asocket;
     41 typedef struct alistener alistener;
     42 typedef struct aservice aservice;
     43 typedef struct atransport atransport;
     44 typedef struct adisconnect  adisconnect;
     45 typedef struct usb_handle usb_handle;
     46 
     47 struct amessage {
     48     unsigned command;       /* command identifier constant      */
     49     unsigned arg0;          /* first argument                   */
     50     unsigned arg1;          /* second argument                  */
     51     unsigned data_length;   /* length of payload (0 is allowed) */
     52     unsigned data_check;    /* checksum of data payload         */
     53     unsigned magic;         /* command ^ 0xffffffff             */
     54 };
     55 
     56 struct apacket
     57 {
     58     apacket *next;
     59 
     60     unsigned len;
     61     unsigned char *ptr;
     62 
     63     amessage msg;
     64     unsigned char data[MAX_PAYLOAD];
     65 };
     66 
     67 /* An asocket represents one half of a connection between a local and
     68 ** remote entity.  A local asocket is bound to a file descriptor.  A
     69 ** remote asocket is bound to the protocol engine.
     70 */
     71 struct asocket {
     72         /* chain pointers for the local/remote list of
     73         ** asockets that this asocket lives in
     74         */
     75     asocket *next;
     76     asocket *prev;
     77 
     78         /* the unique identifier for this asocket
     79         */
     80     unsigned id;
     81 
     82         /* flag: set when the socket's peer has closed
     83         ** but packets are still queued for delivery
     84         */
     85     int    closing;
     86 
     87         /* the asocket we are connected to
     88         */
     89 
     90     asocket *peer;
     91 
     92         /* For local asockets, the fde is used to bind
     93         ** us to our fd event system.  For remote asockets
     94         ** these fields are not used.
     95         */
     96     fdevent fde;
     97     int fd;
     98 
     99         /* queue of apackets waiting to be written
    100         */
    101     apacket *pkt_first;
    102     apacket *pkt_last;
    103 
    104         /* enqueue is called by our peer when it has data
    105         ** for us.  It should return 0 if we can accept more
    106         ** data or 1 if not.  If we return 1, we must call
    107         ** peer->ready() when we once again are ready to
    108         ** receive data.
    109         */
    110     int (*enqueue)(asocket *s, apacket *pkt);
    111 
    112         /* ready is called by the peer when it is ready for
    113         ** us to send data via enqueue again
    114         */
    115     void (*ready)(asocket *s);
    116 
    117         /* close is called by the peer when it has gone away.
    118         ** we are not allowed to make any further calls on the
    119         ** peer once our close method is called.
    120         */
    121     void (*close)(asocket *s);
    122 
    123         /* socket-type-specific extradata */
    124     void *extra;
    125 
    126     	/* A socket is bound to atransport */
    127     atransport *transport;
    128 };
    129 
    130 
    131 /* the adisconnect structure is used to record a callback that
    132 ** will be called whenever a transport is disconnected (e.g. by the user)
    133 ** this should be used to cleanup objects that depend on the
    134 ** transport (e.g. remote sockets, listeners, etc...)
    135 */
    136 struct  adisconnect
    137 {
    138     void        (*func)(void*  opaque, atransport*  t);
    139     void*         opaque;
    140     adisconnect*  next;
    141     adisconnect*  prev;
    142 };
    143 
    144 
    145 /* a transport object models the connection to a remote device or emulator
    146 ** there is one transport per connected device/emulator. a "local transport"
    147 ** connects through TCP (for the emulator), while a "usb transport" through
    148 ** USB (for real devices)
    149 **
    150 ** note that kTransportHost doesn't really correspond to a real transport
    151 ** object, it's a special value used to indicate that a client wants to
    152 ** connect to a service implemented within the ADB server itself.
    153 */
    154 typedef enum transport_type {
    155         kTransportUsb,
    156         kTransportLocal,
    157         kTransportAny,
    158         kTransportHost,
    159 } transport_type;
    160 
    161 struct atransport
    162 {
    163     atransport *next;
    164     atransport *prev;
    165 
    166     int (*read_from_remote)(apacket *p, atransport *t);
    167     int (*write_to_remote)(apacket *p, atransport *t);
    168     void (*close)(atransport *t);
    169     void (*kick)(atransport *t);
    170 
    171     int fd;
    172     int transport_socket;
    173     fdevent transport_fde;
    174     int ref_count;
    175     unsigned sync_token;
    176     int connection_state;
    177     transport_type type;
    178 
    179         /* usb handle or socket fd as needed */
    180     usb_handle *usb;
    181     int sfd;
    182 
    183         /* used to identify transports for clients */
    184     char *serial;
    185     char *product;
    186     int adb_port; // Use for emulators (local transport)
    187 
    188         /* a list of adisconnect callbacks called when the transport is kicked */
    189     int          kicked;
    190     adisconnect  disconnects;
    191 };
    192 
    193 
    194 /* A listener is an entity which binds to a local port
    195 ** and, upon receiving a connection on that port, creates
    196 ** an asocket to connect the new local connection to a
    197 ** specific remote service.
    198 **
    199 ** TODO: some listeners read from the new connection to
    200 ** determine what exact service to connect to on the far
    201 ** side.
    202 */
    203 struct alistener
    204 {
    205     alistener *next;
    206     alistener *prev;
    207 
    208     fdevent fde;
    209     int fd;
    210 
    211     const char *local_name;
    212     const char *connect_to;
    213     atransport *transport;
    214     adisconnect  disconnect;
    215 };
    216 
    217 
    218 void print_packet(const char *label, apacket *p);
    219 
    220 asocket *find_local_socket(unsigned id);
    221 void install_local_socket(asocket *s);
    222 void remove_socket(asocket *s);
    223 void close_all_sockets(atransport *t);
    224 
    225 #define  LOCAL_CLIENT_PREFIX  "emulator-"
    226 
    227 asocket *create_local_socket(int fd);
    228 asocket *create_local_service_socket(const char *destination);
    229 
    230 asocket *create_remote_socket(unsigned id, atransport *t);
    231 void connect_to_remote(asocket *s, const char *destination);
    232 void connect_to_smartsocket(asocket *s);
    233 
    234 void fatal(const char *fmt, ...);
    235 void fatal_errno(const char *fmt, ...);
    236 
    237 void handle_packet(apacket *p, atransport *t);
    238 void send_packet(apacket *p, atransport *t);
    239 
    240 void get_my_path(char *s, size_t maxLen);
    241 int launch_server(int server_port);
    242 int adb_main(int is_daemon, int server_port);
    243 
    244 
    245 /* transports are ref-counted
    246 ** get_device_transport does an acquire on your behalf before returning
    247 */
    248 void init_transport_registration(void);
    249 int  list_transports(char *buf, size_t  bufsize);
    250 void update_transports(void);
    251 
    252 asocket*  create_device_tracker(void);
    253 
    254 /* Obtain a transport from the available transports.
    255 ** If state is != CS_ANY, only transports in that state are considered.
    256 ** If serial is non-NULL then only the device with that serial will be chosen.
    257 ** If no suitable transport is found, error is set.
    258 */
    259 atransport *acquire_one_transport(int state, transport_type ttype, const char* serial, char **error_out);
    260 void   add_transport_disconnect( atransport*  t, adisconnect*  dis );
    261 void   remove_transport_disconnect( atransport*  t, adisconnect*  dis );
    262 void   run_transport_disconnects( atransport*  t );
    263 void   kick_transport( atransport*  t );
    264 
    265 /* initialize a transport object's func pointers and state */
    266 #if ADB_HOST
    267 int get_available_local_transport_index();
    268 #endif
    269 int  init_socket_transport(atransport *t, int s, int port, int local);
    270 void init_usb_transport(atransport *t, usb_handle *usb, int state);
    271 
    272 /* for MacOS X cleanup */
    273 void close_usb_devices();
    274 
    275 /* cause new transports to be init'd and added to the list */
    276 void register_socket_transport(int s, const char *serial, int port, int local);
    277 
    278 /* these should only be used for the "adb disconnect" command */
    279 void unregister_transport(atransport *t);
    280 void unregister_all_tcp_transports();
    281 
    282 void register_usb_transport(usb_handle *h, const char *serial, unsigned writeable);
    283 
    284 /* this should only be used for transports with connection_state == CS_NOPERM */
    285 void unregister_usb_transport(usb_handle *usb);
    286 
    287 atransport *find_transport(const char *serial);
    288 #if ADB_HOST
    289 atransport* find_emulator_transport_by_adb_port(int adb_port);
    290 #endif
    291 
    292 int service_to_fd(const char *name);
    293 #if ADB_HOST
    294 asocket *host_service_to_socket(const char*  name, const char *serial);
    295 #endif
    296 
    297 #if !ADB_HOST
    298 int       init_jdwp(void);
    299 asocket*  create_jdwp_service_socket();
    300 asocket*  create_jdwp_tracker_service_socket();
    301 int       create_jdwp_connection_fd(int  jdwp_pid);
    302 #endif
    303 
    304 #if !ADB_HOST
    305 void framebuffer_service(int fd, void *cookie);
    306 void log_service(int fd, void *cookie);
    307 void remount_service(int fd, void *cookie);
    308 char * get_log_file_path(const char * log_name);
    309 #endif
    310 
    311 /* packet allocator */
    312 apacket *get_apacket(void);
    313 void put_apacket(apacket *p);
    314 
    315 int check_header(apacket *p);
    316 int check_data(apacket *p);
    317 
    318 /* convenience wrappers around read/write that will retry on
    319 ** EINTR and/or short read/write.  Returns 0 on success, -1
    320 ** on error or EOF.
    321 */
    322 int readx(int fd, void *ptr, size_t len);
    323 int writex(int fd, const void *ptr, size_t len);
    324 
    325 /* define ADB_TRACE to 1 to enable tracing support, or 0 to disable it */
    326 
    327 #define  ADB_TRACE    1
    328 
    329 /* IMPORTANT: if you change the following list, don't
    330  * forget to update the corresponding 'tags' table in
    331  * the adb_trace_init() function implemented in adb.c
    332  */
    333 typedef enum {
    334     TRACE_ADB = 0,
    335     TRACE_SOCKETS,
    336     TRACE_PACKETS,
    337     TRACE_TRANSPORT,
    338     TRACE_RWX,
    339     TRACE_USB,
    340     TRACE_SYNC,
    341     TRACE_SYSDEPS,
    342     TRACE_JDWP,
    343 } AdbTrace;
    344 
    345 #if ADB_TRACE
    346 
    347   int     adb_trace_mask;
    348 
    349   void    adb_trace_init(void);
    350 
    351 #  define ADB_TRACING  ((adb_trace_mask & (1 << TRACE_TAG)) != 0)
    352 
    353   /* you must define TRACE_TAG before using this macro */
    354   #define  D(...)                                      \
    355         do {                                           \
    356             if (ADB_TRACING)                           \
    357                 fprintf(stderr, __VA_ARGS__ );         \
    358         } while (0)
    359 #else
    360 #  define  D(...)          ((void)0)
    361 #  define  ADB_TRACING     0
    362 #endif
    363 
    364 
    365 #if !TRACE_PACKETS
    366 #define print_packet(tag,p) do {} while (0)
    367 #endif
    368 
    369 #define DEFAULT_ADB_PORT 5037
    370 #define DEFAULT_ADB_LOCAL_TRANSPORT_PORT 5555
    371 
    372 #define ADB_CLASS              0xff
    373 #define ADB_SUBCLASS           0x42
    374 #define ADB_PROTOCOL           0x1
    375 
    376 
    377 void local_init(int port);
    378 int  local_connect(int  port);
    379 int  local_connect_arbitrary_ports(int console_port, int adb_port);
    380 
    381 /* usb host/client interface */
    382 void usb_init();
    383 void usb_cleanup();
    384 int usb_write(usb_handle *h, const void *data, int len);
    385 int usb_read(usb_handle *h, void *data, int len);
    386 int usb_close(usb_handle *h);
    387 void usb_kick(usb_handle *h);
    388 
    389 /* used for USB device detection */
    390 #if ADB_HOST
    391 int is_adb_interface(int vid, int pid, int usb_class, int usb_subclass, int usb_protocol);
    392 #endif
    393 
    394 unsigned host_to_le32(unsigned n);
    395 int adb_commandline(int argc, char **argv);
    396 
    397 int connection_state(atransport *t);
    398 
    399 #define CS_ANY       -1
    400 #define CS_OFFLINE    0
    401 #define CS_BOOTLOADER 1
    402 #define CS_DEVICE     2
    403 #define CS_HOST       3
    404 #define CS_RECOVERY   4
    405 #define CS_NOPERM     5 /* Insufficient permissions to communicate with the device */
    406 
    407 extern int HOST;
    408 
    409 #define CHUNK_SIZE (64*1024)
    410 
    411 int sendfailmsg(int fd, const char *reason);
    412 int handle_host_request(char *service, transport_type ttype, char* serial, int reply_fd, asocket *s);
    413 
    414 #endif
    415