adb.h revision 3fef581bc7a513defe48329973d14bec722f1293
16fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang/*
26fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang * Copyright (C) 2007 The Android Open Source Project
36fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang *
46fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang * Licensed under the Apache License, Version 2.0 (the "License");
56fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang * you may not use this file except in compliance with the License.
66fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang * You may obtain a copy of the License at
76fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang *
86fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang *      http://www.apache.org/licenses/LICENSE-2.0
96fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang *
106fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang * Unless required by applicable law or agreed to in writing, software
116fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang * distributed under the License is distributed on an "AS IS" BASIS,
126fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang * See the License for the specific language governing permissions and
146fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang * limitations under the License.
156fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang */
166fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang
176fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang#ifndef __ADB_H
186fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang#define __ADB_H
196fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang
206fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang#include <limits.h>
210f42037eb7b5118015c2caca635538324ccf0ccffredc
226fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang#include "transport.h"  /* readx(), writex() */
230f42037eb7b5118015c2caca635538324ccf0ccffredc
240f42037eb7b5118015c2caca635538324ccf0ccffredc#define MAX_PAYLOAD 4096
256fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang
265a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh#define A_SYNC 0x434e5953
275a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh#define A_CNXN 0x4e584e43
286fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang#define A_OPEN 0x4e45504f
296fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang#define A_OKAY 0x59414b4f
305a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh#define A_CLSE 0x45534c43
315a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh#define A_WRTE 0x45545257
326fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang
336fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang#define A_VERSION 0x01000000        // ADB protocol version
3474ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh
3574ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh#define ADB_VERSION_MAJOR 1         // Used for help/version information
3674ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh#define ADB_VERSION_MINOR 0         // Used for help/version information
3774ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh
3874ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh#define ADB_SERVER_VERSION    29    // Increment this when we want to force users to start a new adb server
3974ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh
4074ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganeshtypedef struct amessage amessage;
4174ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganeshtypedef struct apacket apacket;
4274ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganeshtypedef struct asocket asocket;
436fdd0c6274c81b337ad35b70480f881daf7354c3Danica Changtypedef struct alistener alistener;
4474ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganeshtypedef struct aservice aservice;
456fdd0c6274c81b337ad35b70480f881daf7354c3Danica Changtypedef struct atransport atransport;
460f42037eb7b5118015c2caca635538324ccf0ccffredctypedef struct adisconnect  adisconnect;
47563e414784eb81e4ea4051667d5c8855b17f7534Matthew Xietypedef struct usb_handle usb_handle;
486fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang
4974ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganeshstruct amessage {
5074ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh    unsigned command;       /* command identifier constant      */
5174ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh    unsigned arg0;          /* first argument                   */
5274ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh    unsigned arg1;          /* second argument                  */
5374ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh    unsigned data_length;   /* length of payload (0 is allowed) */
5474ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh    unsigned data_check;    /* checksum of data payload         */
5574ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh    unsigned magic;         /* command ^ 0xffffffff             */
5674ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh};
5774ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh
5874ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganeshstruct apacket
5974ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh{
6074ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh    apacket *next;
6174ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh
6274ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh    unsigned len;
6374ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh    unsigned char *ptr;
6474ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh
6574ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh    amessage msg;
6674ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh    unsigned char data[MAX_PAYLOAD];
6774ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh};
6874ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh
6974ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh/* An asocket represents one half of a connection between a local and
7074ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh** remote entity.  A local asocket is bound to a file descriptor.  A
7174ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh** remote asocket is bound to the protocol engine.
7274ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh*/
7374ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganeshstruct asocket {
746fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang        /* chain pointers for the local/remote list of
7574ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh        ** asockets that this asocket lives in
7674ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh        */
7774ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh    asocket *next;
7874ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh    asocket *prev;
7974ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh
805200c8ab721b56025340306bdecca651e6bf2f12Jaikumar Ganesh        /* the unique identifier for this asocket
815200c8ab721b56025340306bdecca651e6bf2f12Jaikumar Ganesh        */
820f42037eb7b5118015c2caca635538324ccf0ccffredc    unsigned id;
8374ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh
8474ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh        /* flag: set when the socket's peer has closed
8574ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh        ** but packets are still queued for delivery
865200c8ab721b56025340306bdecca651e6bf2f12Jaikumar Ganesh        */
870f42037eb7b5118015c2caca635538324ccf0ccffredc    int    closing;
885200c8ab721b56025340306bdecca651e6bf2f12Jaikumar Ganesh
895200c8ab721b56025340306bdecca651e6bf2f12Jaikumar Ganesh        /* flag: quit adbd when both ends close the
9074ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh        ** local service socket
916fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang        */
9274ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh    int    exit_on_close;
930f42037eb7b5118015c2caca635538324ccf0ccffredc
946fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang        /* the asocket we are connected to
95fbe807d064ada99211b102914df514aa562256f8Jaikumar Ganesh        */
96fbe807d064ada99211b102914df514aa562256f8Jaikumar Ganesh
9774ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh    asocket *peer;
98fbe807d064ada99211b102914df514aa562256f8Jaikumar Ganesh
99fbe807d064ada99211b102914df514aa562256f8Jaikumar Ganesh        /* For local asockets, the fde is used to bind
100fbe807d064ada99211b102914df514aa562256f8Jaikumar Ganesh        ** us to our fd event system.  For remote asockets
10174ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh        ** these fields are not used.
10274ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh        */
10374ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh    fdevent fde;
104fbe807d064ada99211b102914df514aa562256f8Jaikumar Ganesh    int fd;
105fbe807d064ada99211b102914df514aa562256f8Jaikumar Ganesh
10674ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh        /* queue of apackets waiting to be written
10774ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh        */
10874ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh    apacket *pkt_first;
109fbe807d064ada99211b102914df514aa562256f8Jaikumar Ganesh    apacket *pkt_last;
110fbe807d064ada99211b102914df514aa562256f8Jaikumar Ganesh
11174ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh        /* enqueue is called by our peer when it has data
11274ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh        ** for us.  It should return 0 if we can accept more
11374ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh        ** data or 1 if not.  If we return 1, we must call
114fbe807d064ada99211b102914df514aa562256f8Jaikumar Ganesh        ** peer->ready() when we once again are ready to
115fbe807d064ada99211b102914df514aa562256f8Jaikumar Ganesh        ** receive data.
11674ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh        */
11774ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh    int (*enqueue)(asocket *s, apacket *pkt);
11874ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh
119fbe807d064ada99211b102914df514aa562256f8Jaikumar Ganesh        /* ready is called by the peer when it is ready for
120fbe807d064ada99211b102914df514aa562256f8Jaikumar Ganesh        ** us to send data via enqueue again
1210f42037eb7b5118015c2caca635538324ccf0ccffredc        */
12274ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh    void (*ready)(asocket *s);
12374ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh
1240f42037eb7b5118015c2caca635538324ccf0ccffredc        /* close is called by the peer when it has gone away.
1256fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang        ** we are not allowed to make any further calls on the
1266fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang        ** peer once our close method is called.
1276fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang        */
12874ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh    void (*close)(asocket *s);
12974ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh
1306fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang        /* socket-type-specific extradata */
1310f42037eb7b5118015c2caca635538324ccf0ccffredc    void *extra;
1320f42037eb7b5118015c2caca635538324ccf0ccffredc
13374ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh    	/* A socket is bound to atransport */
13474ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh    atransport *transport;
135903ac6f399dcd4f574bf388daa7b5f5907d448d3fredc};
136903ac6f399dcd4f574bf388daa7b5f5907d448d3fredc
137903ac6f399dcd4f574bf388daa7b5f5907d448d3fredc
138903ac6f399dcd4f574bf388daa7b5f5907d448d3fredc/* the adisconnect structure is used to record a callback that
139903ac6f399dcd4f574bf388daa7b5f5907d448d3fredc** will be called whenever a transport is disconnected (e.g. by the user)
1400f42037eb7b5118015c2caca635538324ccf0ccffredc** this should be used to cleanup objects that depend on the
1410f42037eb7b5118015c2caca635538324ccf0ccffredc** transport (e.g. remote sockets, listeners, etc...)
1420f42037eb7b5118015c2caca635538324ccf0ccffredc*/
1430f42037eb7b5118015c2caca635538324ccf0ccffredcstruct  adisconnect
1446fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang{
1450f42037eb7b5118015c2caca635538324ccf0ccffredc    void        (*func)(void*  opaque, atransport*  t);
1466fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang    void*         opaque;
1476fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang    adisconnect*  next;
1489bb275197df8eb999eab4cdd0a2aff83c2bb2ef6Jaikumar Ganesh    adisconnect*  prev;
149563e414784eb81e4ea4051667d5c8855b17f7534Matthew Xie};
1500f42037eb7b5118015c2caca635538324ccf0ccffredc
1510f42037eb7b5118015c2caca635538324ccf0ccffredc
1520f42037eb7b5118015c2caca635538324ccf0ccffredc/* a transport object models the connection to a remote device or emulator
1530f42037eb7b5118015c2caca635538324ccf0ccffredc** there is one transport per connected device/emulator. a "local transport"
1549bb275197df8eb999eab4cdd0a2aff83c2bb2ef6Jaikumar Ganesh** connects through TCP (for the emulator), while a "usb transport" through
155903ac6f399dcd4f574bf388daa7b5f5907d448d3fredc** USB (for real devices)
156903ac6f399dcd4f574bf388daa7b5f5907d448d3fredc**
157903ac6f399dcd4f574bf388daa7b5f5907d448d3fredc** note that kTransportHost doesn't really correspond to a real transport
158903ac6f399dcd4f574bf388daa7b5f5907d448d3fredc** object, it's a special value used to indicate that a client wants to
159903ac6f399dcd4f574bf388daa7b5f5907d448d3fredc** connect to a service implemented within the ADB server itself.
160903ac6f399dcd4f574bf388daa7b5f5907d448d3fredc*/
161903ac6f399dcd4f574bf388daa7b5f5907d448d3fredctypedef enum transport_type {
162903ac6f399dcd4f574bf388daa7b5f5907d448d3fredc        kTransportUsb,
163903ac6f399dcd4f574bf388daa7b5f5907d448d3fredc        kTransportLocal,
1649bb275197df8eb999eab4cdd0a2aff83c2bb2ef6Jaikumar Ganesh        kTransportAny,
1659bb275197df8eb999eab4cdd0a2aff83c2bb2ef6Jaikumar Ganesh        kTransportHost,
166903ac6f399dcd4f574bf388daa7b5f5907d448d3fredc} transport_type;
167903ac6f399dcd4f574bf388daa7b5f5907d448d3fredc
168903ac6f399dcd4f574bf388daa7b5f5907d448d3fredcstruct atransport
169903ac6f399dcd4f574bf388daa7b5f5907d448d3fredc{
170903ac6f399dcd4f574bf388daa7b5f5907d448d3fredc    atransport *next;
171903ac6f399dcd4f574bf388daa7b5f5907d448d3fredc    atransport *prev;
172903ac6f399dcd4f574bf388daa7b5f5907d448d3fredc
173903ac6f399dcd4f574bf388daa7b5f5907d448d3fredc    int (*read_from_remote)(apacket *p, atransport *t);
174903ac6f399dcd4f574bf388daa7b5f5907d448d3fredc    int (*write_to_remote)(apacket *p, atransport *t);
175903ac6f399dcd4f574bf388daa7b5f5907d448d3fredc    void (*close)(atransport *t);
176903ac6f399dcd4f574bf388daa7b5f5907d448d3fredc    void (*kick)(atransport *t);
177903ac6f399dcd4f574bf388daa7b5f5907d448d3fredc
178903ac6f399dcd4f574bf388daa7b5f5907d448d3fredc    int fd;
179563e414784eb81e4ea4051667d5c8855b17f7534Matthew Xie    int transport_socket;
180903ac6f399dcd4f574bf388daa7b5f5907d448d3fredc    fdevent transport_fde;
181903ac6f399dcd4f574bf388daa7b5f5907d448d3fredc    int ref_count;
182903ac6f399dcd4f574bf388daa7b5f5907d448d3fredc    unsigned sync_token;
183903ac6f399dcd4f574bf388daa7b5f5907d448d3fredc    int connection_state;
184903ac6f399dcd4f574bf388daa7b5f5907d448d3fredc    transport_type type;
185903ac6f399dcd4f574bf388daa7b5f5907d448d3fredc
186903ac6f399dcd4f574bf388daa7b5f5907d448d3fredc        /* usb handle or socket fd as needed */
187903ac6f399dcd4f574bf388daa7b5f5907d448d3fredc    usb_handle *usb;
188903ac6f399dcd4f574bf388daa7b5f5907d448d3fredc    int sfd;
189903ac6f399dcd4f574bf388daa7b5f5907d448d3fredc
190903ac6f399dcd4f574bf388daa7b5f5907d448d3fredc        /* used to identify transports for clients */
191903ac6f399dcd4f574bf388daa7b5f5907d448d3fredc    char *serial;
1926fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang    char *product;
193f8789167e903b637b1dbe8f710e7c66c4cfd74fdJaikumar Ganesh    char *model;
194f8789167e903b637b1dbe8f710e7c66c4cfd74fdJaikumar Ganesh    char *device;
195f8789167e903b637b1dbe8f710e7c66c4cfd74fdJaikumar Ganesh    char *devpath;
196f8789167e903b637b1dbe8f710e7c66c4cfd74fdJaikumar Ganesh    int adb_port; // Use for emulators (local transport)
197f8789167e903b637b1dbe8f710e7c66c4cfd74fdJaikumar Ganesh
198f8789167e903b637b1dbe8f710e7c66c4cfd74fdJaikumar Ganesh        /* a list of adisconnect callbacks called when the transport is kicked */
199f8789167e903b637b1dbe8f710e7c66c4cfd74fdJaikumar Ganesh    int          kicked;
200f8789167e903b637b1dbe8f710e7c66c4cfd74fdJaikumar Ganesh    adisconnect  disconnects;
201f8789167e903b637b1dbe8f710e7c66c4cfd74fdJaikumar Ganesh};
202f8789167e903b637b1dbe8f710e7c66c4cfd74fdJaikumar Ganesh
203f8789167e903b637b1dbe8f710e7c66c4cfd74fdJaikumar Ganesh
204f8789167e903b637b1dbe8f710e7c66c4cfd74fdJaikumar Ganesh/* A listener is an entity which binds to a local port
205f8789167e903b637b1dbe8f710e7c66c4cfd74fdJaikumar Ganesh** and, upon receiving a connection on that port, creates
206f8789167e903b637b1dbe8f710e7c66c4cfd74fdJaikumar Ganesh** an asocket to connect the new local connection to a
207f8789167e903b637b1dbe8f710e7c66c4cfd74fdJaikumar Ganesh** specific remote service.
2086fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang**
2096fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang** TODO: some listeners read from the new connection to
2106fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang** determine what exact service to connect to on the far
2116fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang** side.
2120f42037eb7b5118015c2caca635538324ccf0ccffredc*/
21374ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganeshstruct alistener
21474ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh{
2150f42037eb7b5118015c2caca635538324ccf0ccffredc    alistener *next;
21674ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh    alistener *prev;
21774ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh
21874ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh    fdevent fde;
2190f42037eb7b5118015c2caca635538324ccf0ccffredc    int fd;
2206fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang
2210f42037eb7b5118015c2caca635538324ccf0ccffredc    const char *local_name;
22274ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh    const char *connect_to;
2236fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang    atransport *transport;
2246fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang    adisconnect  disconnect;
2256fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang};
226f8789167e903b637b1dbe8f710e7c66c4cfd74fdJaikumar Ganesh
227f8789167e903b637b1dbe8f710e7c66c4cfd74fdJaikumar Ganesh
228f8789167e903b637b1dbe8f710e7c66c4cfd74fdJaikumar Ganeshvoid print_packet(const char *label, apacket *p);
229f8789167e903b637b1dbe8f710e7c66c4cfd74fdJaikumar Ganesh
230f8789167e903b637b1dbe8f710e7c66c4cfd74fdJaikumar Ganeshasocket *find_local_socket(unsigned id);
231f8789167e903b637b1dbe8f710e7c66c4cfd74fdJaikumar Ganeshvoid install_local_socket(asocket *s);
232f8789167e903b637b1dbe8f710e7c66c4cfd74fdJaikumar Ganeshvoid remove_socket(asocket *s);
233f8789167e903b637b1dbe8f710e7c66c4cfd74fdJaikumar Ganeshvoid close_all_sockets(atransport *t);
234f8789167e903b637b1dbe8f710e7c66c4cfd74fdJaikumar Ganesh
235f8789167e903b637b1dbe8f710e7c66c4cfd74fdJaikumar Ganesh#define  LOCAL_CLIENT_PREFIX  "emulator-"
236f8789167e903b637b1dbe8f710e7c66c4cfd74fdJaikumar Ganesh
237f8789167e903b637b1dbe8f710e7c66c4cfd74fdJaikumar Ganeshasocket *create_local_socket(int fd);
238f8789167e903b637b1dbe8f710e7c66c4cfd74fdJaikumar Ganeshasocket *create_local_service_socket(const char *destination);
239f8789167e903b637b1dbe8f710e7c66c4cfd74fdJaikumar Ganesh
240f8789167e903b637b1dbe8f710e7c66c4cfd74fdJaikumar Ganeshasocket *create_remote_socket(unsigned id, atransport *t);
241f8789167e903b637b1dbe8f710e7c66c4cfd74fdJaikumar Ganeshvoid connect_to_remote(asocket *s, const char *destination);
242f8789167e903b637b1dbe8f710e7c66c4cfd74fdJaikumar Ganeshvoid connect_to_smartsocket(asocket *s);
243f8789167e903b637b1dbe8f710e7c66c4cfd74fdJaikumar Ganesh
244f8789167e903b637b1dbe8f710e7c66c4cfd74fdJaikumar Ganeshvoid fatal(const char *fmt, ...);
245f8789167e903b637b1dbe8f710e7c66c4cfd74fdJaikumar Ganeshvoid fatal_errno(const char *fmt, ...);
246f8789167e903b637b1dbe8f710e7c66c4cfd74fdJaikumar Ganesh
247f8789167e903b637b1dbe8f710e7c66c4cfd74fdJaikumar Ganeshvoid handle_packet(apacket *p, atransport *t);
248f8789167e903b637b1dbe8f710e7c66c4cfd74fdJaikumar Ganeshvoid send_packet(apacket *p, atransport *t);
2496fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang
2506fdd0c6274c81b337ad35b70480f881daf7354c3Danica Changvoid get_my_path(char *s, size_t maxLen);
2516fdd0c6274c81b337ad35b70480f881daf7354c3Danica Changint launch_server(int server_port);
2526fdd0c6274c81b337ad35b70480f881daf7354c3Danica Changint adb_main(int is_daemon, int server_port);
2530f42037eb7b5118015c2caca635538324ccf0ccffredc
25474ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh
25574ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh/* transports are ref-counted
2560f42037eb7b5118015c2caca635538324ccf0ccffredc** get_device_transport does an acquire on your behalf before returning
25774ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh*/
25874ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganeshvoid init_transport_registration(void);
25974ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganeshint  list_transports(char *buf, size_t  bufsize, int show_devpath);
2600f42037eb7b5118015c2caca635538324ccf0ccffredcvoid update_transports(void);
2616fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang
2620f42037eb7b5118015c2caca635538324ccf0ccffredcasocket*  create_device_tracker(void);
26374ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh
2646fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang/* Obtain a transport from the available transports.
2656fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang** If state is != CS_ANY, only transports in that state are considered.
2665200c8ab721b56025340306bdecca651e6bf2f12Jaikumar Ganesh** If serial is non-NULL then only the device with that serial will be chosen.
26774ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh** If no suitable transport is found, error is set.
2685200c8ab721b56025340306bdecca651e6bf2f12Jaikumar Ganesh*/
26974ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganeshatransport *acquire_one_transport(int state, transport_type ttype, const char* serial, char **error_out);
270563e414784eb81e4ea4051667d5c8855b17f7534Matthew Xievoid   add_transport_disconnect( atransport*  t, adisconnect*  dis );
2710f42037eb7b5118015c2caca635538324ccf0ccffredcvoid   remove_transport_disconnect( atransport*  t, adisconnect*  dis );
27274ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganeshvoid   run_transport_disconnects( atransport*  t );
2730f42037eb7b5118015c2caca635538324ccf0ccffredcvoid   kick_transport( atransport*  t );
27474ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh
27574ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh/* initialize a transport object's func pointers and state */
27674ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh#if ADB_HOST
2770f42037eb7b5118015c2caca635538324ccf0ccffredcint get_available_local_transport_index();
2785200c8ab721b56025340306bdecca651e6bf2f12Jaikumar Ganesh#endif
2790f42037eb7b5118015c2caca635538324ccf0ccffredcint  init_socket_transport(atransport *t, int s, int port, int local);
28074ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganeshvoid init_usb_transport(atransport *t, usb_handle *usb, int state);
2815200c8ab721b56025340306bdecca651e6bf2f12Jaikumar Ganesh
2825200c8ab721b56025340306bdecca651e6bf2f12Jaikumar Ganesh/* for MacOS X cleanup */
2835200c8ab721b56025340306bdecca651e6bf2f12Jaikumar Ganeshvoid close_usb_devices();
28474ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh
28574ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh/* cause new transports to be init'd and added to the list */
28674ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganeshvoid register_socket_transport(int s, const char *serial, int port, int local);
287563e414784eb81e4ea4051667d5c8855b17f7534Matthew Xie
2880f42037eb7b5118015c2caca635538324ccf0ccffredc/* these should only be used for the "adb disconnect" command */
28974ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganeshvoid unregister_transport(atransport *t);
2900f42037eb7b5118015c2caca635538324ccf0ccffredcvoid unregister_all_tcp_transports();
29174ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh
29274ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganeshvoid register_usb_transport(usb_handle *h, const char *serial, const char *devpath, unsigned writeable);
29374ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh
2940f42037eb7b5118015c2caca635538324ccf0ccffredc/* this should only be used for transports with connection_state == CS_NOPERM */
29574ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganeshvoid unregister_usb_transport(usb_handle *usb);
2960f42037eb7b5118015c2caca635538324ccf0ccffredc
29774ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganeshatransport *find_transport(const char *serial);
29874ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh#if ADB_HOST
29974ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganeshatransport* find_emulator_transport_by_adb_port(int adb_port);
30074ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh#endif
30174ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh
30274ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganeshint service_to_fd(const char *name);
30374ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh#if ADB_HOST
304563e414784eb81e4ea4051667d5c8855b17f7534Matthew Xieasocket *host_service_to_socket(const char*  name, const char *serial);
3050f42037eb7b5118015c2caca635538324ccf0ccffredc#endif
30674ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh
30774ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh#if !ADB_HOST
3080f42037eb7b5118015c2caca635538324ccf0ccffredcint       init_jdwp(void);
30974ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganeshasocket*  create_jdwp_service_socket();
31074ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganeshasocket*  create_jdwp_tracker_service_socket();
31174ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganeshint       create_jdwp_connection_fd(int  jdwp_pid);
3120f42037eb7b5118015c2caca635538324ccf0ccffredc#endif
31374ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh
3140f42037eb7b5118015c2caca635538324ccf0ccffredc#if !ADB_HOST
31574ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganeshtypedef enum {
31674ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh    BACKUP,
31774ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh    RESTORE
318b70765cc27a174d1d4a0bab7062733ebd3eae354Jaikumar Ganesh} BackupOperation;
31974ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganeshint backup_service(BackupOperation operation, char* args);
3206fdd0c6274c81b337ad35b70480f881daf7354c3Danica Changvoid framebuffer_service(int fd, void *cookie);
3210f42037eb7b5118015c2caca635538324ccf0ccffredcvoid log_service(int fd, void *cookie);
3226fdd0c6274c81b337ad35b70480f881daf7354c3Danica Changvoid remount_service(int fd, void *cookie);
32374ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganeshchar * get_log_file_path(const char * log_name);
3240f42037eb7b5118015c2caca635538324ccf0ccffredc#endif
3256fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang
3266fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang/* packet allocator */
3276fdd0c6274c81b337ad35b70480f881daf7354c3Danica Changapacket *get_apacket(void);
328563e414784eb81e4ea4051667d5c8855b17f7534Matthew Xievoid put_apacket(apacket *p);
3296fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang
3300f42037eb7b5118015c2caca635538324ccf0ccffredcint check_header(apacket *p);
3316fdd0c6274c81b337ad35b70480f881daf7354c3Danica Changint check_data(apacket *p);
33274ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh
3330f42037eb7b5118015c2caca635538324ccf0ccffredc/* define ADB_TRACE to 1 to enable tracing support, or 0 to disable it */
334e4caddbb7a3b39fd6a1ccf107c7dbf09bc8978e8Jaikumar Ganesh
3356fdd0c6274c81b337ad35b70480f881daf7354c3Danica Chang#define  ADB_TRACE    1
33674ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh
3370f42037eb7b5118015c2caca635538324ccf0ccffredc/* IMPORTANT: if you change the following list, don't
3380f42037eb7b5118015c2caca635538324ccf0ccffredc * forget to update the corresponding 'tags' table in
3390f42037eb7b5118015c2caca635538324ccf0ccffredc * the adb_trace_init() function implemented in adb.c
3400f42037eb7b5118015c2caca635538324ccf0ccffredc */
3410f42037eb7b5118015c2caca635538324ccf0ccffredctypedef enum {
3420f42037eb7b5118015c2caca635538324ccf0ccffredc    TRACE_ADB = 0,   /* 0x001 */
3430f42037eb7b5118015c2caca635538324ccf0ccffredc    TRACE_SOCKETS,
3440f42037eb7b5118015c2caca635538324ccf0ccffredc    TRACE_PACKETS,
3450f42037eb7b5118015c2caca635538324ccf0ccffredc    TRACE_TRANSPORT,
3460f42037eb7b5118015c2caca635538324ccf0ccffredc    TRACE_RWX,       /* 0x010 */
3470f42037eb7b5118015c2caca635538324ccf0ccffredc    TRACE_USB,
3480f42037eb7b5118015c2caca635538324ccf0ccffredc    TRACE_SYNC,
3490f42037eb7b5118015c2caca635538324ccf0ccffredc    TRACE_SYSDEPS,
3500f42037eb7b5118015c2caca635538324ccf0ccffredc    TRACE_JDWP,      /* 0x100 */
3510f42037eb7b5118015c2caca635538324ccf0ccffredc    TRACE_SERVICES,
3520f42037eb7b5118015c2caca635538324ccf0ccffredc} AdbTrace;
3530f42037eb7b5118015c2caca635538324ccf0ccffredc
3540f42037eb7b5118015c2caca635538324ccf0ccffredc#if ADB_TRACE
3550f42037eb7b5118015c2caca635538324ccf0ccffredc
35674ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh#if !ADB_HOST
35774ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh/*
35874ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh * When running inside the emulator, guest's adbd can connect to 'adb-debug'
35974ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh * qemud service that can display adb trace messages (on condition that emulator
36074ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh * has been started with '-debug adb' option).
36174ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh */
36274ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh
36374ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh/* Delivers a trace message to the emulator via QEMU pipe. */
36474ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganeshvoid adb_qemu_trace(const char* fmt, ...);
36574ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh/* Macro to use to send ADB trace messages to the emulator. */
36674ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh#define DQ(...)    adb_qemu_trace(__VA_ARGS__)
36774ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh#else
36874ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh#define DQ(...) ((void)0)
36974ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh#endif  /* !ADB_HOST */
37074ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh
3719bb275197df8eb999eab4cdd0a2aff83c2bb2ef6Jaikumar Ganesh  extern int     adb_trace_mask;
372  extern unsigned char    adb_trace_output_count;
373  void    adb_trace_init(void);
374
375#  define ADB_TRACING  ((adb_trace_mask & (1 << TRACE_TAG)) != 0)
376
377  /* you must define TRACE_TAG before using this macro */
378#  define  D(...)                                      \
379        do {                                           \
380            if (ADB_TRACING) {                         \
381                int save_errno = errno;                \
382                adb_mutex_lock(&D_lock);               \
383                fprintf(stderr, "%s::%s():",           \
384                        __FILE__, __FUNCTION__);       \
385                errno = save_errno;                    \
386                fprintf(stderr, __VA_ARGS__ );         \
387                fflush(stderr);                        \
388                adb_mutex_unlock(&D_lock);             \
389                errno = save_errno;                    \
390           }                                           \
391        } while (0)
392#  define  DR(...)                                     \
393        do {                                           \
394            if (ADB_TRACING) {                         \
395                int save_errno = errno;                \
396                adb_mutex_lock(&D_lock);               \
397                errno = save_errno;                    \
398                fprintf(stderr, __VA_ARGS__ );         \
399                fflush(stderr);                        \
400                adb_mutex_unlock(&D_lock);             \
401                errno = save_errno;                    \
402           }                                           \
403        } while (0)
404#else
405#  define  D(...)          ((void)0)
406#  define  DR(...)         ((void)0)
407#  define  ADB_TRACING     0
408#endif
409
410
411#if !TRACE_PACKETS
412#define print_packet(tag,p) do {} while (0)
413#endif
414
415#if ADB_HOST_ON_TARGET
416/* adb and adbd are coexisting on the target, so use 5038 for adb
417 * to avoid conflicting with adbd's usage of 5037
418 */
419#  define DEFAULT_ADB_PORT 5038
420#else
421#  define DEFAULT_ADB_PORT 5037
422#endif
423
424#define DEFAULT_ADB_LOCAL_TRANSPORT_PORT 5555
425
426#define ADB_CLASS              0xff
427#define ADB_SUBCLASS           0x42
428#define ADB_PROTOCOL           0x1
429
430
431void local_init(int port);
432int  local_connect(int  port);
433int  local_connect_arbitrary_ports(int console_port, int adb_port);
434
435/* usb host/client interface */
436void usb_init();
437void usb_cleanup();
438int usb_write(usb_handle *h, const void *data, int len);
439int usb_read(usb_handle *h, void *data, int len);
440int usb_close(usb_handle *h);
441void usb_kick(usb_handle *h);
442
443/* used for USB device detection */
444#if ADB_HOST
445int is_adb_interface(int vid, int pid, int usb_class, int usb_subclass, int usb_protocol);
446#endif
447
448unsigned host_to_le32(unsigned n);
449int adb_commandline(int argc, char **argv);
450
451int connection_state(atransport *t);
452
453#define CS_ANY       -1
454#define CS_OFFLINE    0
455#define CS_BOOTLOADER 1
456#define CS_DEVICE     2
457#define CS_HOST       3
458#define CS_RECOVERY   4
459#define CS_NOPERM     5 /* Insufficient permissions to communicate with the device */
460#define CS_SIDELOAD   6
461
462extern int HOST;
463extern int SHELL_EXIT_NOTIFY_FD;
464
465#define CHUNK_SIZE (64*1024)
466
467int sendfailmsg(int fd, const char *reason);
468int handle_host_request(char *service, transport_type ttype, char* serial, int reply_fd, asocket *s);
469
470#endif
471