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 #define TRACE_TAG TRACE_SOCKETS
     18 
     19 #include "sysdeps.h"
     20 
     21 #include <ctype.h>
     22 #include <errno.h>
     23 #include <stdio.h>
     24 #include <stdlib.h>
     25 #include <string.h>
     26 #include <unistd.h>
     27 
     28 #if !ADB_HOST
     29 #include "cutils/properties.h"
     30 #endif
     31 
     32 #include "adb.h"
     33 #include "adb_io.h"
     34 #include "transport.h"
     35 
     36 ADB_MUTEX_DEFINE( socket_list_lock );
     37 
     38 static void local_socket_close_locked(asocket *s);
     39 
     40 static unsigned local_socket_next_id = 1;
     41 
     42 static asocket local_socket_list = {
     43     .next = &local_socket_list,
     44     .prev = &local_socket_list,
     45 };
     46 
     47 /* the the list of currently closing local sockets.
     48 ** these have no peer anymore, but still packets to
     49 ** write to their fd.
     50 */
     51 static asocket local_socket_closing_list = {
     52     .next = &local_socket_closing_list,
     53     .prev = &local_socket_closing_list,
     54 };
     55 
     56 // Parse the global list of sockets to find one with id |local_id|.
     57 // If |peer_id| is not 0, also check that it is connected to a peer
     58 // with id |peer_id|. Returns an asocket handle on success, NULL on failure.
     59 asocket *find_local_socket(unsigned local_id, unsigned peer_id)
     60 {
     61     asocket *s;
     62     asocket *result = NULL;
     63 
     64     adb_mutex_lock(&socket_list_lock);
     65     for (s = local_socket_list.next; s != &local_socket_list; s = s->next) {
     66         if (s->id != local_id)
     67             continue;
     68         if (peer_id == 0 || (s->peer && s->peer->id == peer_id)) {
     69             result = s;
     70         }
     71         break;
     72     }
     73     adb_mutex_unlock(&socket_list_lock);
     74 
     75     return result;
     76 }
     77 
     78 static void
     79 insert_local_socket(asocket*  s, asocket*  list)
     80 {
     81     s->next       = list;
     82     s->prev       = s->next->prev;
     83     s->prev->next = s;
     84     s->next->prev = s;
     85 }
     86 
     87 
     88 void install_local_socket(asocket *s)
     89 {
     90     adb_mutex_lock(&socket_list_lock);
     91 
     92     s->id = local_socket_next_id++;
     93 
     94     // Socket ids should never be 0.
     95     if (local_socket_next_id == 0)
     96       local_socket_next_id = 1;
     97 
     98     insert_local_socket(s, &local_socket_list);
     99 
    100     adb_mutex_unlock(&socket_list_lock);
    101 }
    102 
    103 void remove_socket(asocket *s)
    104 {
    105     // socket_list_lock should already be held
    106     if (s->prev && s->next)
    107     {
    108         s->prev->next = s->next;
    109         s->next->prev = s->prev;
    110         s->next = 0;
    111         s->prev = 0;
    112         s->id = 0;
    113     }
    114 }
    115 
    116 void close_all_sockets(atransport *t)
    117 {
    118     asocket *s;
    119 
    120         /* this is a little gross, but since s->close() *will* modify
    121         ** the list out from under you, your options are limited.
    122         */
    123     adb_mutex_lock(&socket_list_lock);
    124 restart:
    125     for(s = local_socket_list.next; s != &local_socket_list; s = s->next){
    126         if(s->transport == t || (s->peer && s->peer->transport == t)) {
    127             local_socket_close_locked(s);
    128             goto restart;
    129         }
    130     }
    131     adb_mutex_unlock(&socket_list_lock);
    132 }
    133 
    134 static int local_socket_enqueue(asocket *s, apacket *p)
    135 {
    136     D("LS(%d): enqueue %d\n", s->id, p->len);
    137 
    138     p->ptr = p->data;
    139 
    140         /* if there is already data queue'd, we will receive
    141         ** events when it's time to write.  just add this to
    142         ** the tail
    143         */
    144     if(s->pkt_first) {
    145         goto enqueue;
    146     }
    147 
    148         /* write as much as we can, until we
    149         ** would block or there is an error/eof
    150         */
    151     while(p->len > 0) {
    152         int r = adb_write(s->fd, p->ptr, p->len);
    153         if(r > 0) {
    154             p->len -= r;
    155             p->ptr += r;
    156             continue;
    157         }
    158         if((r == 0) || (errno != EAGAIN)) {
    159             D( "LS(%d): not ready, errno=%d: %s\n", s->id, errno, strerror(errno) );
    160             s->close(s);
    161             return 1; /* not ready (error) */
    162         } else {
    163             break;
    164         }
    165     }
    166 
    167     if(p->len == 0) {
    168         put_apacket(p);
    169         return 0; /* ready for more data */
    170     }
    171 
    172 enqueue:
    173     p->next = 0;
    174     if(s->pkt_first) {
    175         s->pkt_last->next = p;
    176     } else {
    177         s->pkt_first = p;
    178     }
    179     s->pkt_last = p;
    180 
    181         /* make sure we are notified when we can drain the queue */
    182     fdevent_add(&s->fde, FDE_WRITE);
    183 
    184     return 1; /* not ready (backlog) */
    185 }
    186 
    187 static void local_socket_ready(asocket *s)
    188 {
    189     /* far side is ready for data, pay attention to
    190        readable events */
    191     fdevent_add(&s->fde, FDE_READ);
    192 }
    193 
    194 static void local_socket_close(asocket *s)
    195 {
    196     adb_mutex_lock(&socket_list_lock);
    197     local_socket_close_locked(s);
    198     adb_mutex_unlock(&socket_list_lock);
    199 }
    200 
    201 // be sure to hold the socket list lock when calling this
    202 static void local_socket_destroy(asocket  *s)
    203 {
    204     apacket *p, *n;
    205     int exit_on_close = s->exit_on_close;
    206 
    207     D("LS(%d): destroying fde.fd=%d\n", s->id, s->fde.fd);
    208 
    209         /* IMPORTANT: the remove closes the fd
    210         ** that belongs to this socket
    211         */
    212     fdevent_remove(&s->fde);
    213 
    214         /* dispose of any unwritten data */
    215     for(p = s->pkt_first; p; p = n) {
    216         D("LS(%d): discarding %d bytes\n", s->id, p->len);
    217         n = p->next;
    218         put_apacket(p);
    219     }
    220     remove_socket(s);
    221     free(s);
    222 
    223     if (exit_on_close) {
    224         D("local_socket_destroy: exiting\n");
    225         exit(1);
    226     }
    227 }
    228 
    229 
    230 static void local_socket_close_locked(asocket *s)
    231 {
    232     D("entered local_socket_close_locked. LS(%d) fd=%d\n", s->id, s->fd);
    233     if(s->peer) {
    234         D("LS(%d): closing peer. peer->id=%d peer->fd=%d\n",
    235           s->id, s->peer->id, s->peer->fd);
    236         /* Note: it's important to call shutdown before disconnecting from
    237          * the peer, this ensures that remote sockets can still get the id
    238          * of the local socket they're connected to, to send a CLOSE()
    239          * protocol event. */
    240         if (s->peer->shutdown)
    241           s->peer->shutdown(s->peer);
    242         s->peer->peer = 0;
    243         // tweak to avoid deadlock
    244         if (s->peer->close == local_socket_close) {
    245             local_socket_close_locked(s->peer);
    246         } else {
    247             s->peer->close(s->peer);
    248         }
    249         s->peer = 0;
    250     }
    251 
    252         /* If we are already closing, or if there are no
    253         ** pending packets, destroy immediately
    254         */
    255     if (s->closing || s->pkt_first == NULL) {
    256         int   id = s->id;
    257         local_socket_destroy(s);
    258         D("LS(%d): closed\n", id);
    259         return;
    260     }
    261 
    262         /* otherwise, put on the closing list
    263         */
    264     D("LS(%d): closing\n", s->id);
    265     s->closing = 1;
    266     fdevent_del(&s->fde, FDE_READ);
    267     remove_socket(s);
    268     D("LS(%d): put on socket_closing_list fd=%d\n", s->id, s->fd);
    269     insert_local_socket(s, &local_socket_closing_list);
    270 }
    271 
    272 static void local_socket_event_func(int fd, unsigned ev, void* _s)
    273 {
    274     asocket* s = reinterpret_cast<asocket*>(_s);
    275     D("LS(%d): event_func(fd=%d(==%d), ev=%04x)\n", s->id, s->fd, fd, ev);
    276 
    277     /* put the FDE_WRITE processing before the FDE_READ
    278     ** in order to simplify the code.
    279     */
    280     if (ev & FDE_WRITE) {
    281         apacket* p;
    282         while ((p = s->pkt_first) != nullptr) {
    283             while (p->len > 0) {
    284                 int r = adb_write(fd, p->ptr, p->len);
    285                 if (r == -1) {
    286                     /* returning here is ok because FDE_READ will
    287                     ** be processed in the next iteration loop
    288                     */
    289                     if (errno == EAGAIN) {
    290                         return;
    291                     }
    292                 } else if (r > 0) {
    293                     p->ptr += r;
    294                     p->len -= r;
    295                     continue;
    296                 }
    297 
    298                 D(" closing after write because r=%d and errno is %d\n", r, errno);
    299                 s->close(s);
    300                 return;
    301             }
    302 
    303             if (p->len == 0) {
    304                 s->pkt_first = p->next;
    305                 if (s->pkt_first == 0) {
    306                     s->pkt_last = 0;
    307                 }
    308                 put_apacket(p);
    309             }
    310         }
    311 
    312         /* if we sent the last packet of a closing socket,
    313         ** we can now destroy it.
    314         */
    315         if (s->closing) {
    316             D(" closing because 'closing' is set after write\n");
    317             s->close(s);
    318             return;
    319         }
    320 
    321         /* no more packets queued, so we can ignore
    322         ** writable events again and tell our peer
    323         ** to resume writing
    324         */
    325         fdevent_del(&s->fde, FDE_WRITE);
    326         s->peer->ready(s->peer);
    327     }
    328 
    329 
    330     if (ev & FDE_READ) {
    331         apacket *p = get_apacket();
    332         unsigned char *x = p->data;
    333         size_t avail = MAX_PAYLOAD;
    334         int r;
    335         int is_eof = 0;
    336 
    337         while (avail > 0) {
    338             r = adb_read(fd, x, avail);
    339             D("LS(%d): post adb_read(fd=%d,...) r=%d (errno=%d) avail=%zu\n",
    340               s->id, s->fd, r, r < 0 ? errno : 0, avail);
    341             if (r == -1) {
    342                 if (errno == EAGAIN) {
    343                     break;
    344                 }
    345             } else if (r > 0) {
    346                 avail -= r;
    347                 x += r;
    348                 continue;
    349             }
    350 
    351             /* r = 0 or unhandled error */
    352             is_eof = 1;
    353             break;
    354         }
    355         D("LS(%d): fd=%d post avail loop. r=%d is_eof=%d forced_eof=%d\n",
    356           s->id, s->fd, r, is_eof, s->fde.force_eof);
    357         if ((avail == MAX_PAYLOAD) || (s->peer == 0)) {
    358             put_apacket(p);
    359         } else {
    360             p->len = MAX_PAYLOAD - avail;
    361 
    362             r = s->peer->enqueue(s->peer, p);
    363             D("LS(%d): fd=%d post peer->enqueue(). r=%d\n", s->id, s->fd,
    364               r);
    365 
    366             if (r < 0) {
    367                     /* error return means they closed us as a side-effect
    368                     ** and we must return immediately.
    369                     **
    370                     ** note that if we still have buffered packets, the
    371                     ** socket will be placed on the closing socket list.
    372                     ** this handler function will be called again
    373                     ** to process FDE_WRITE events.
    374                     */
    375                 return;
    376             }
    377 
    378             if (r > 0) {
    379                     /* if the remote cannot accept further events,
    380                     ** we disable notification of READs.  They'll
    381                     ** be enabled again when we get a call to ready()
    382                     */
    383                 fdevent_del(&s->fde, FDE_READ);
    384             }
    385         }
    386         /* Don't allow a forced eof if data is still there */
    387         if ((s->fde.force_eof && !r) || is_eof) {
    388             D(" closing because is_eof=%d r=%d s->fde.force_eof=%d\n",
    389               is_eof, r, s->fde.force_eof);
    390             s->close(s);
    391         }
    392     }
    393 
    394     if (ev & FDE_ERROR){
    395             /* this should be caught be the next read or write
    396             ** catching it here means we may skip the last few
    397             ** bytes of readable data.
    398             */
    399         D("LS(%d): FDE_ERROR (fd=%d)\n", s->id, s->fd);
    400 
    401         return;
    402     }
    403 }
    404 
    405 asocket *create_local_socket(int fd)
    406 {
    407     asocket *s = reinterpret_cast<asocket*>(calloc(1, sizeof(asocket)));
    408     if (s == NULL) fatal("cannot allocate socket");
    409     s->fd = fd;
    410     s->enqueue = local_socket_enqueue;
    411     s->ready = local_socket_ready;
    412     s->shutdown = NULL;
    413     s->close = local_socket_close;
    414     install_local_socket(s);
    415 
    416     fdevent_install(&s->fde, fd, local_socket_event_func, s);
    417     D("LS(%d): created (fd=%d)\n", s->id, s->fd);
    418     return s;
    419 }
    420 
    421 asocket *create_local_service_socket(const char *name)
    422 {
    423 #if !ADB_HOST
    424     if (!strcmp(name,"jdwp")) {
    425         return create_jdwp_service_socket();
    426     }
    427     if (!strcmp(name,"track-jdwp")) {
    428         return create_jdwp_tracker_service_socket();
    429     }
    430 #endif
    431     int fd = service_to_fd(name);
    432     if(fd < 0) return 0;
    433 
    434     asocket* s = create_local_socket(fd);
    435     D("LS(%d): bound to '%s' via %d\n", s->id, name, fd);
    436 
    437 #if !ADB_HOST
    438     char debug[PROPERTY_VALUE_MAX];
    439     if (!strncmp(name, "root:", 5))
    440         property_get("ro.debuggable", debug, "");
    441 
    442     if ((!strncmp(name, "root:", 5) && getuid() != 0 && strcmp(debug, "1") == 0)
    443         || (!strncmp(name, "unroot:", 7) && getuid() == 0)
    444         || !strncmp(name, "usb:", 4)
    445         || !strncmp(name, "tcpip:", 6)) {
    446         D("LS(%d): enabling exit_on_close\n", s->id);
    447         s->exit_on_close = 1;
    448     }
    449 #endif
    450 
    451     return s;
    452 }
    453 
    454 #if ADB_HOST
    455 static asocket *create_host_service_socket(const char *name, const char* serial)
    456 {
    457     asocket *s;
    458 
    459     s = host_service_to_socket(name, serial);
    460 
    461     if (s != NULL) {
    462         D("LS(%d) bound to '%s'\n", s->id, name);
    463         return s;
    464     }
    465 
    466     return s;
    467 }
    468 #endif /* ADB_HOST */
    469 
    470 /* a Remote socket is used to send/receive data to/from a given transport object
    471 ** it needs to be closed when the transport is forcibly destroyed by the user
    472 */
    473 struct aremotesocket {
    474     asocket      socket;
    475     adisconnect  disconnect;
    476 };
    477 
    478 static int remote_socket_enqueue(asocket *s, apacket *p)
    479 {
    480     D("entered remote_socket_enqueue RS(%d) WRITE fd=%d peer.fd=%d\n",
    481       s->id, s->fd, s->peer->fd);
    482     p->msg.command = A_WRTE;
    483     p->msg.arg0 = s->peer->id;
    484     p->msg.arg1 = s->id;
    485     p->msg.data_length = p->len;
    486     send_packet(p, s->transport);
    487     return 1;
    488 }
    489 
    490 static void remote_socket_ready(asocket *s)
    491 {
    492     D("entered remote_socket_ready RS(%d) OKAY fd=%d peer.fd=%d\n",
    493       s->id, s->fd, s->peer->fd);
    494     apacket *p = get_apacket();
    495     p->msg.command = A_OKAY;
    496     p->msg.arg0 = s->peer->id;
    497     p->msg.arg1 = s->id;
    498     send_packet(p, s->transport);
    499 }
    500 
    501 static void remote_socket_shutdown(asocket *s)
    502 {
    503     D("entered remote_socket_shutdown RS(%d) CLOSE fd=%d peer->fd=%d\n",
    504       s->id, s->fd, s->peer?s->peer->fd:-1);
    505     apacket *p = get_apacket();
    506     p->msg.command = A_CLSE;
    507     if(s->peer) {
    508         p->msg.arg0 = s->peer->id;
    509     }
    510     p->msg.arg1 = s->id;
    511     send_packet(p, s->transport);
    512 }
    513 
    514 static void remote_socket_close(asocket *s)
    515 {
    516     if (s->peer) {
    517         s->peer->peer = 0;
    518         D("RS(%d) peer->close()ing peer->id=%d peer->fd=%d\n",
    519           s->id, s->peer->id, s->peer->fd);
    520         s->peer->close(s->peer);
    521     }
    522     D("entered remote_socket_close RS(%d) CLOSE fd=%d peer->fd=%d\n",
    523       s->id, s->fd, s->peer?s->peer->fd:-1);
    524     D("RS(%d): closed\n", s->id);
    525     remove_transport_disconnect( s->transport, &((aremotesocket*)s)->disconnect );
    526     free(s);
    527 }
    528 
    529 static void remote_socket_disconnect(void*  _s, atransport*  t)
    530 {
    531     asocket* s = reinterpret_cast<asocket*>(_s);
    532     asocket* peer = s->peer;
    533 
    534     D("remote_socket_disconnect RS(%d)\n", s->id);
    535     if (peer) {
    536         peer->peer = NULL;
    537         peer->close(peer);
    538     }
    539     remove_transport_disconnect( s->transport, &((aremotesocket*)s)->disconnect );
    540     free(s);
    541 }
    542 
    543 /* Create an asocket to exchange packets with a remote service through transport
    544   |t|. Where |id| is the socket id of the corresponding service on the other
    545    side of the transport (it is allocated by the remote side and _cannot_ be 0).
    546    Returns a new non-NULL asocket handle. */
    547 asocket *create_remote_socket(unsigned id, atransport *t)
    548 {
    549     if (id == 0) fatal("invalid remote socket id (0)");
    550     asocket* s = reinterpret_cast<asocket*>(calloc(1, sizeof(aremotesocket)));
    551     adisconnect* dis = &reinterpret_cast<aremotesocket*>(s)->disconnect;
    552 
    553     if (s == NULL) fatal("cannot allocate socket");
    554     s->id = id;
    555     s->enqueue = remote_socket_enqueue;
    556     s->ready = remote_socket_ready;
    557     s->shutdown = remote_socket_shutdown;
    558     s->close = remote_socket_close;
    559     s->transport = t;
    560 
    561     dis->func   = remote_socket_disconnect;
    562     dis->opaque = s;
    563     add_transport_disconnect( t, dis );
    564     D("RS(%d): created\n", s->id);
    565     return s;
    566 }
    567 
    568 void connect_to_remote(asocket *s, const char *destination)
    569 {
    570     D("Connect_to_remote call RS(%d) fd=%d\n", s->id, s->fd);
    571     apacket *p = get_apacket();
    572     int len = strlen(destination) + 1;
    573 
    574     if(len > (MAX_PAYLOAD-1)) {
    575         fatal("destination oversized");
    576     }
    577 
    578     D("LS(%d): connect('%s')\n", s->id, destination);
    579     p->msg.command = A_OPEN;
    580     p->msg.arg0 = s->id;
    581     p->msg.data_length = len;
    582     strcpy((char*) p->data, destination);
    583     send_packet(p, s->transport);
    584 }
    585 
    586 
    587 /* this is used by magic sockets to rig local sockets to
    588    send the go-ahead message when they connect */
    589 static void local_socket_ready_notify(asocket *s)
    590 {
    591     s->ready = local_socket_ready;
    592     s->shutdown = NULL;
    593     s->close = local_socket_close;
    594     SendOkay(s->fd);
    595     s->ready(s);
    596 }
    597 
    598 /* this is used by magic sockets to rig local sockets to
    599    send the failure message if they are closed before
    600    connected (to avoid closing them without a status message) */
    601 static void local_socket_close_notify(asocket *s)
    602 {
    603     s->ready = local_socket_ready;
    604     s->shutdown = NULL;
    605     s->close = local_socket_close;
    606     SendFail(s->fd, "closed");
    607     s->close(s);
    608 }
    609 
    610 static unsigned unhex(unsigned char *s, int len)
    611 {
    612     unsigned n = 0, c;
    613 
    614     while(len-- > 0) {
    615         switch((c = *s++)) {
    616         case '0': case '1': case '2':
    617         case '3': case '4': case '5':
    618         case '6': case '7': case '8':
    619         case '9':
    620             c -= '0';
    621             break;
    622         case 'a': case 'b': case 'c':
    623         case 'd': case 'e': case 'f':
    624             c = c - 'a' + 10;
    625             break;
    626         case 'A': case 'B': case 'C':
    627         case 'D': case 'E': case 'F':
    628             c = c - 'A' + 10;
    629             break;
    630         default:
    631             return 0xffffffff;
    632         }
    633 
    634         n = (n << 4) | c;
    635     }
    636 
    637     return n;
    638 }
    639 
    640 #if ADB_HOST
    641 
    642 #define PREFIX(str) { str, sizeof(str) - 1 }
    643 static const struct prefix_struct {
    644     const char *str;
    645     const size_t len;
    646 } prefixes[] = {
    647     PREFIX("usb:"),
    648     PREFIX("product:"),
    649     PREFIX("model:"),
    650     PREFIX("device:"),
    651 };
    652 static const int num_prefixes = (sizeof(prefixes) / sizeof(prefixes[0]));
    653 
    654 /* skip_host_serial return the position in a string
    655    skipping over the 'serial' parameter in the ADB protocol,
    656    where parameter string may be a host:port string containing
    657    the protocol delimiter (colon). */
    658 static char *skip_host_serial(char *service) {
    659     char *first_colon, *serial_end;
    660     int i;
    661 
    662     for (i = 0; i < num_prefixes; i++) {
    663         if (!strncmp(service, prefixes[i].str, prefixes[i].len))
    664             return strchr(service + prefixes[i].len, ':');
    665     }
    666 
    667     first_colon = strchr(service, ':');
    668     if (!first_colon) {
    669         /* No colon in service string. */
    670         return NULL;
    671     }
    672     serial_end = first_colon;
    673     if (isdigit(serial_end[1])) {
    674         serial_end++;
    675         while ((*serial_end) && isdigit(*serial_end)) {
    676             serial_end++;
    677         }
    678         if ((*serial_end) != ':') {
    679             // Something other than numbers was found, reset the end.
    680             serial_end = first_colon;
    681         }
    682     }
    683     return serial_end;
    684 }
    685 
    686 #endif // ADB_HOST
    687 
    688 static int smart_socket_enqueue(asocket *s, apacket *p)
    689 {
    690     unsigned len;
    691 #if ADB_HOST
    692     char *service = NULL;
    693     char* serial = NULL;
    694     transport_type ttype = kTransportAny;
    695 #endif
    696 
    697     D("SS(%d): enqueue %d\n", s->id, p->len);
    698 
    699     if(s->pkt_first == 0) {
    700         s->pkt_first = p;
    701         s->pkt_last = p;
    702     } else {
    703         if((s->pkt_first->len + p->len) > MAX_PAYLOAD) {
    704             D("SS(%d): overflow\n", s->id);
    705             put_apacket(p);
    706             goto fail;
    707         }
    708 
    709         memcpy(s->pkt_first->data + s->pkt_first->len,
    710                p->data, p->len);
    711         s->pkt_first->len += p->len;
    712         put_apacket(p);
    713 
    714         p = s->pkt_first;
    715     }
    716 
    717         /* don't bother if we can't decode the length */
    718     if(p->len < 4) return 0;
    719 
    720     len = unhex(p->data, 4);
    721     if((len < 1) ||  (len > 1024)) {
    722         D("SS(%d): bad size (%d)\n", s->id, len);
    723         goto fail;
    724     }
    725 
    726     D("SS(%d): len is %d\n", s->id, len );
    727         /* can't do anything until we have the full header */
    728     if((len + 4) > p->len) {
    729         D("SS(%d): waiting for %d more bytes\n", s->id, len+4 - p->len);
    730         return 0;
    731     }
    732 
    733     p->data[len + 4] = 0;
    734 
    735     D("SS(%d): '%s'\n", s->id, (char*) (p->data + 4));
    736 
    737 #if ADB_HOST
    738     service = (char *)p->data + 4;
    739     if(!strncmp(service, "host-serial:", strlen("host-serial:"))) {
    740         char* serial_end;
    741         service += strlen("host-serial:");
    742 
    743         // serial number should follow "host:" and could be a host:port string.
    744         serial_end = skip_host_serial(service);
    745         if (serial_end) {
    746             *serial_end = 0; // terminate string
    747             serial = service;
    748             service = serial_end + 1;
    749         }
    750     } else if (!strncmp(service, "host-usb:", strlen("host-usb:"))) {
    751         ttype = kTransportUsb;
    752         service += strlen("host-usb:");
    753     } else if (!strncmp(service, "host-local:", strlen("host-local:"))) {
    754         ttype = kTransportLocal;
    755         service += strlen("host-local:");
    756     } else if (!strncmp(service, "host:", strlen("host:"))) {
    757         ttype = kTransportAny;
    758         service += strlen("host:");
    759     } else {
    760         service = NULL;
    761     }
    762 
    763     if (service) {
    764         asocket *s2;
    765 
    766             /* some requests are handled immediately -- in that
    767             ** case the handle_host_request() routine has sent
    768             ** the OKAY or FAIL message and all we have to do
    769             ** is clean up.
    770             */
    771         if(handle_host_request(service, ttype, serial, s->peer->fd, s) == 0) {
    772                 /* XXX fail message? */
    773             D( "SS(%d): handled host service '%s'\n", s->id, service );
    774             goto fail;
    775         }
    776         if (!strncmp(service, "transport", strlen("transport"))) {
    777             D( "SS(%d): okay transport\n", s->id );
    778             p->len = 0;
    779             return 0;
    780         }
    781 
    782             /* try to find a local service with this name.
    783             ** if no such service exists, we'll fail out
    784             ** and tear down here.
    785             */
    786         s2 = create_host_service_socket(service, serial);
    787         if(s2 == 0) {
    788             D( "SS(%d): couldn't create host service '%s'\n", s->id, service );
    789             SendFail(s->peer->fd, "unknown host service");
    790             goto fail;
    791         }
    792 
    793             /* we've connected to a local host service,
    794             ** so we make our peer back into a regular
    795             ** local socket and bind it to the new local
    796             ** service socket, acknowledge the successful
    797             ** connection, and close this smart socket now
    798             ** that its work is done.
    799             */
    800         SendOkay(s->peer->fd);
    801 
    802         s->peer->ready = local_socket_ready;
    803         s->peer->shutdown = NULL;
    804         s->peer->close = local_socket_close;
    805         s->peer->peer = s2;
    806         s2->peer = s->peer;
    807         s->peer = 0;
    808         D( "SS(%d): okay\n", s->id );
    809         s->close(s);
    810 
    811             /* initial state is "ready" */
    812         s2->ready(s2);
    813         return 0;
    814     }
    815 #else /* !ADB_HOST */
    816     if (s->transport == NULL) {
    817         std::string error_msg = "unknown failure";
    818         s->transport = acquire_one_transport(CS_ANY, kTransportAny, NULL, &error_msg);
    819 
    820         if (s->transport == NULL) {
    821             SendFail(s->peer->fd, error_msg);
    822             goto fail;
    823         }
    824     }
    825 #endif
    826 
    827     if(!(s->transport) || (s->transport->connection_state == CS_OFFLINE)) {
    828            /* if there's no remote we fail the connection
    829             ** right here and terminate it
    830             */
    831         SendFail(s->peer->fd, "device offline (x)");
    832         goto fail;
    833     }
    834 
    835 
    836         /* instrument our peer to pass the success or fail
    837         ** message back once it connects or closes, then
    838         ** detach from it, request the connection, and
    839         ** tear down
    840         */
    841     s->peer->ready = local_socket_ready_notify;
    842     s->peer->shutdown = NULL;
    843     s->peer->close = local_socket_close_notify;
    844     s->peer->peer = 0;
    845         /* give him our transport and upref it */
    846     s->peer->transport = s->transport;
    847 
    848     connect_to_remote(s->peer, (char*) (p->data + 4));
    849     s->peer = 0;
    850     s->close(s);
    851     return 1;
    852 
    853 fail:
    854         /* we're going to close our peer as a side-effect, so
    855         ** return -1 to signal that state to the local socket
    856         ** who is enqueueing against us
    857         */
    858     s->close(s);
    859     return -1;
    860 }
    861 
    862 static void smart_socket_ready(asocket *s)
    863 {
    864     D("SS(%d): ready\n", s->id);
    865 }
    866 
    867 static void smart_socket_close(asocket *s)
    868 {
    869     D("SS(%d): closed\n", s->id);
    870     if(s->pkt_first){
    871         put_apacket(s->pkt_first);
    872     }
    873     if(s->peer) {
    874         s->peer->peer = 0;
    875         s->peer->close(s->peer);
    876         s->peer = 0;
    877     }
    878     free(s);
    879 }
    880 
    881 static asocket *create_smart_socket(void)
    882 {
    883     D("Creating smart socket \n");
    884     asocket *s = reinterpret_cast<asocket*>(calloc(1, sizeof(asocket)));
    885     if (s == NULL) fatal("cannot allocate socket");
    886     s->enqueue = smart_socket_enqueue;
    887     s->ready = smart_socket_ready;
    888     s->shutdown = NULL;
    889     s->close = smart_socket_close;
    890 
    891     D("SS(%d)\n", s->id);
    892     return s;
    893 }
    894 
    895 void connect_to_smartsocket(asocket *s)
    896 {
    897     D("Connecting to smart socket \n");
    898     asocket *ss = create_smart_socket();
    899     s->peer = ss;
    900     ss->peer = s;
    901     s->ready(s);
    902 }
    903