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 ADB
     18 
     19 #include "sysdeps.h"
     20 #include "adb.h"
     21 
     22 #include <ctype.h>
     23 #include <errno.h>
     24 #include <stdarg.h>
     25 #include <stddef.h>
     26 #include <stdint.h>
     27 #include <stdio.h>
     28 #include <stdlib.h>
     29 #include <string.h>
     30 #include <sys/time.h>
     31 #include <time.h>
     32 
     33 #include <string>
     34 #include <vector>
     35 
     36 #include <android-base/errors.h>
     37 #include <android-base/logging.h>
     38 #include <android-base/macros.h>
     39 #include <android-base/parsenetaddress.h>
     40 #include <android-base/stringprintf.h>
     41 #include <android-base/strings.h>
     42 
     43 #include "adb_auth.h"
     44 #include "adb_io.h"
     45 #include "adb_listeners.h"
     46 #include "adb_utils.h"
     47 #include "transport.h"
     48 
     49 #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
     50 
     51 #if !ADB_HOST
     52 #include <cutils/properties.h>
     53 #include <sys/capability.h>
     54 #include <sys/mount.h>
     55 #endif
     56 
     57 std::string adb_version() {
     58     // Don't change the format of this --- it's parsed by ddmlib.
     59     return android::base::StringPrintf("Android Debug Bridge version %d.%d.%d\n"
     60                                        "Revision %s\n",
     61                                        ADB_VERSION_MAJOR, ADB_VERSION_MINOR, ADB_SERVER_VERSION,
     62                                        ADB_REVISION);
     63 }
     64 
     65 void fatal(const char *fmt, ...) {
     66     va_list ap;
     67     va_start(ap, fmt);
     68     fprintf(stderr, "error: ");
     69     vfprintf(stderr, fmt, ap);
     70     fprintf(stderr, "\n");
     71     va_end(ap);
     72     exit(-1);
     73 }
     74 
     75 void fatal_errno(const char* fmt, ...) {
     76     va_list ap;
     77     va_start(ap, fmt);
     78     fprintf(stderr, "error: %s: ", strerror(errno));
     79     vfprintf(stderr, fmt, ap);
     80     fprintf(stderr, "\n");
     81     va_end(ap);
     82     exit(-1);
     83 }
     84 
     85 apacket* get_apacket(void)
     86 {
     87     apacket* p = reinterpret_cast<apacket*>(malloc(sizeof(apacket)));
     88     if (p == nullptr) {
     89       fatal("failed to allocate an apacket");
     90     }
     91 
     92     memset(p, 0, sizeof(apacket) - MAX_PAYLOAD);
     93     return p;
     94 }
     95 
     96 void put_apacket(apacket *p)
     97 {
     98     free(p);
     99 }
    100 
    101 void handle_online(atransport *t)
    102 {
    103     D("adb: online");
    104     t->online = 1;
    105 }
    106 
    107 void handle_offline(atransport *t)
    108 {
    109     D("adb: offline");
    110     //Close the associated usb
    111     t->online = 0;
    112 
    113     // This is necessary to avoid a race condition that occurred when a transport closes
    114     // while a client socket is still active.
    115     close_all_sockets(t);
    116 
    117     t->RunDisconnects();
    118 }
    119 
    120 #if DEBUG_PACKETS
    121 #define DUMPMAX 32
    122 void print_packet(const char *label, apacket *p)
    123 {
    124     char *tag;
    125     char *x;
    126     unsigned count;
    127 
    128     switch(p->msg.command){
    129     case A_SYNC: tag = "SYNC"; break;
    130     case A_CNXN: tag = "CNXN" ; break;
    131     case A_OPEN: tag = "OPEN"; break;
    132     case A_OKAY: tag = "OKAY"; break;
    133     case A_CLSE: tag = "CLSE"; break;
    134     case A_WRTE: tag = "WRTE"; break;
    135     case A_AUTH: tag = "AUTH"; break;
    136     default: tag = "????"; break;
    137     }
    138 
    139     fprintf(stderr, "%s: %s %08x %08x %04x \"",
    140             label, tag, p->msg.arg0, p->msg.arg1, p->msg.data_length);
    141     count = p->msg.data_length;
    142     x = (char*) p->data;
    143     if(count > DUMPMAX) {
    144         count = DUMPMAX;
    145         tag = "\n";
    146     } else {
    147         tag = "\"\n";
    148     }
    149     while(count-- > 0){
    150         if((*x >= ' ') && (*x < 127)) {
    151             fputc(*x, stderr);
    152         } else {
    153             fputc('.', stderr);
    154         }
    155         x++;
    156     }
    157     fputs(tag, stderr);
    158 }
    159 #endif
    160 
    161 static void send_ready(unsigned local, unsigned remote, atransport *t)
    162 {
    163     D("Calling send_ready");
    164     apacket *p = get_apacket();
    165     p->msg.command = A_OKAY;
    166     p->msg.arg0 = local;
    167     p->msg.arg1 = remote;
    168     send_packet(p, t);
    169 }
    170 
    171 static void send_close(unsigned local, unsigned remote, atransport *t)
    172 {
    173     D("Calling send_close");
    174     apacket *p = get_apacket();
    175     p->msg.command = A_CLSE;
    176     p->msg.arg0 = local;
    177     p->msg.arg1 = remote;
    178     send_packet(p, t);
    179 }
    180 
    181 std::string get_connection_string() {
    182     std::vector<std::string> connection_properties;
    183 
    184 #if !ADB_HOST
    185     static const char* cnxn_props[] = {
    186         "ro.product.name",
    187         "ro.product.model",
    188         "ro.product.device",
    189     };
    190 
    191     for (const auto& prop_name : cnxn_props) {
    192         char value[PROPERTY_VALUE_MAX];
    193         property_get(prop_name, value, "");
    194         connection_properties.push_back(
    195             android::base::StringPrintf("%s=%s", prop_name, value));
    196     }
    197 #endif
    198 
    199     connection_properties.push_back(android::base::StringPrintf(
    200         "features=%s", FeatureSetToString(supported_features()).c_str()));
    201 
    202     return android::base::StringPrintf(
    203         "%s::%s", adb_device_banner,
    204         android::base::Join(connection_properties, ';').c_str());
    205 }
    206 
    207 void send_connect(atransport* t) {
    208     D("Calling send_connect");
    209     apacket* cp = get_apacket();
    210     cp->msg.command = A_CNXN;
    211     cp->msg.arg0 = t->get_protocol_version();
    212     cp->msg.arg1 = t->get_max_payload();
    213 
    214     std::string connection_str = get_connection_string();
    215     // Connect and auth packets are limited to MAX_PAYLOAD_V1 because we don't
    216     // yet know how much data the other size is willing to accept.
    217     if (connection_str.length() > MAX_PAYLOAD_V1) {
    218         LOG(FATAL) << "Connection banner is too long (length = "
    219                    << connection_str.length() << ")";
    220     }
    221 
    222     memcpy(cp->data, connection_str.c_str(), connection_str.length());
    223     cp->msg.data_length = connection_str.length();
    224 
    225     send_packet(cp, t);
    226 }
    227 
    228 // qual_overwrite is used to overwrite a qualifier string.  dst is a
    229 // pointer to a char pointer.  It is assumed that if *dst is non-NULL, it
    230 // was malloc'ed and needs to freed.  *dst will be set to a dup of src.
    231 // TODO: switch to std::string for these atransport fields instead.
    232 static void qual_overwrite(char** dst, const std::string& src) {
    233     free(*dst);
    234     *dst = strdup(src.c_str());
    235 }
    236 
    237 void parse_banner(const std::string& banner, atransport* t) {
    238     D("parse_banner: %s", banner.c_str());
    239 
    240     // The format is something like:
    241     // "device::ro.product.name=x;ro.product.model=y;ro.product.device=z;".
    242     std::vector<std::string> pieces = android::base::Split(banner, ":");
    243 
    244     // Reset the features list or else if the server sends no features we may
    245     // keep the existing feature set (http://b/24405971).
    246     t->SetFeatures("");
    247 
    248     if (pieces.size() > 2) {
    249         const std::string& props = pieces[2];
    250         for (const auto& prop : android::base::Split(props, ";")) {
    251             // The list of properties was traditionally ;-terminated rather than ;-separated.
    252             if (prop.empty()) continue;
    253 
    254             std::vector<std::string> key_value = android::base::Split(prop, "=");
    255             if (key_value.size() != 2) continue;
    256 
    257             const std::string& key = key_value[0];
    258             const std::string& value = key_value[1];
    259             if (key == "ro.product.name") {
    260                 qual_overwrite(&t->product, value);
    261             } else if (key == "ro.product.model") {
    262                 qual_overwrite(&t->model, value);
    263             } else if (key == "ro.product.device") {
    264                 qual_overwrite(&t->device, value);
    265             } else if (key == "features") {
    266                 t->SetFeatures(value);
    267             }
    268         }
    269     }
    270 
    271     const std::string& type = pieces[0];
    272     if (type == "bootloader") {
    273         D("setting connection_state to kCsBootloader");
    274         t->connection_state = kCsBootloader;
    275         update_transports();
    276     } else if (type == "device") {
    277         D("setting connection_state to kCsDevice");
    278         t->connection_state = kCsDevice;
    279         update_transports();
    280     } else if (type == "recovery") {
    281         D("setting connection_state to kCsRecovery");
    282         t->connection_state = kCsRecovery;
    283         update_transports();
    284     } else if (type == "sideload") {
    285         D("setting connection_state to kCsSideload");
    286         t->connection_state = kCsSideload;
    287         update_transports();
    288     } else {
    289         D("setting connection_state to kCsHost");
    290         t->connection_state = kCsHost;
    291     }
    292 }
    293 
    294 static void handle_new_connection(atransport* t, apacket* p) {
    295     if (t->connection_state != kCsOffline) {
    296         t->connection_state = kCsOffline;
    297         handle_offline(t);
    298     }
    299 
    300     t->update_version(p->msg.arg0, p->msg.arg1);
    301     std::string banner(reinterpret_cast<const char*>(p->data),
    302                        p->msg.data_length);
    303     parse_banner(banner, t);
    304 
    305 #if ADB_HOST
    306     handle_online(t);
    307 #else
    308     if (!auth_required) {
    309         handle_online(t);
    310         send_connect(t);
    311     } else {
    312         send_auth_request(t);
    313     }
    314 #endif
    315 }
    316 
    317 void handle_packet(apacket *p, atransport *t)
    318 {
    319     asocket *s;
    320 
    321     D("handle_packet() %c%c%c%c", ((char*) (&(p->msg.command)))[0],
    322             ((char*) (&(p->msg.command)))[1],
    323             ((char*) (&(p->msg.command)))[2],
    324             ((char*) (&(p->msg.command)))[3]);
    325     print_packet("recv", p);
    326 
    327     switch(p->msg.command){
    328     case A_SYNC:
    329         if(p->msg.arg0){
    330             send_packet(p, t);
    331 #if ADB_HOST
    332             send_connect(t);
    333 #endif
    334         } else {
    335             t->connection_state = kCsOffline;
    336             handle_offline(t);
    337             send_packet(p, t);
    338         }
    339         return;
    340 
    341     case A_CNXN:  // CONNECT(version, maxdata, "system-id-string")
    342         handle_new_connection(t, p);
    343         break;
    344 
    345     case A_AUTH:
    346         if (p->msg.arg0 == ADB_AUTH_TOKEN) {
    347             t->connection_state = kCsUnauthorized;
    348             t->key = adb_auth_nextkey(t->key);
    349             if (t->key) {
    350                 send_auth_response(p->data, p->msg.data_length, t);
    351             } else {
    352                 /* No more private keys to try, send the public key */
    353                 send_auth_publickey(t);
    354             }
    355         } else if (p->msg.arg0 == ADB_AUTH_SIGNATURE) {
    356             if (adb_auth_verify(t->token, p->data, p->msg.data_length)) {
    357                 adb_auth_verified(t);
    358                 t->failed_auth_attempts = 0;
    359             } else {
    360                 if (t->failed_auth_attempts++ > 10)
    361                     adb_sleep_ms(1000);
    362                 send_auth_request(t);
    363             }
    364         } else if (p->msg.arg0 == ADB_AUTH_RSAPUBLICKEY) {
    365             adb_auth_confirm_key(p->data, p->msg.data_length, t);
    366         }
    367         break;
    368 
    369     case A_OPEN: /* OPEN(local-id, 0, "destination") */
    370         if (t->online && p->msg.arg0 != 0 && p->msg.arg1 == 0) {
    371             char *name = (char*) p->data;
    372             name[p->msg.data_length > 0 ? p->msg.data_length - 1 : 0] = 0;
    373             s = create_local_service_socket(name, t);
    374             if(s == 0) {
    375                 send_close(0, p->msg.arg0, t);
    376             } else {
    377                 s->peer = create_remote_socket(p->msg.arg0, t);
    378                 s->peer->peer = s;
    379                 send_ready(s->id, s->peer->id, t);
    380                 s->ready(s);
    381             }
    382         }
    383         break;
    384 
    385     case A_OKAY: /* READY(local-id, remote-id, "") */
    386         if (t->online && p->msg.arg0 != 0 && p->msg.arg1 != 0) {
    387             if((s = find_local_socket(p->msg.arg1, 0))) {
    388                 if(s->peer == 0) {
    389                     /* On first READY message, create the connection. */
    390                     s->peer = create_remote_socket(p->msg.arg0, t);
    391                     s->peer->peer = s;
    392                     s->ready(s);
    393                 } else if (s->peer->id == p->msg.arg0) {
    394                     /* Other READY messages must use the same local-id */
    395                     s->ready(s);
    396                 } else {
    397                     D("Invalid A_OKAY(%d,%d), expected A_OKAY(%d,%d) on transport %s",
    398                       p->msg.arg0, p->msg.arg1, s->peer->id, p->msg.arg1, t->serial);
    399                 }
    400             } else {
    401                 // When receiving A_OKAY from device for A_OPEN request, the host server may
    402                 // have closed the local socket because of client disconnection. Then we need
    403                 // to send A_CLSE back to device to close the service on device.
    404                 send_close(p->msg.arg1, p->msg.arg0, t);
    405             }
    406         }
    407         break;
    408 
    409     case A_CLSE: /* CLOSE(local-id, remote-id, "") or CLOSE(0, remote-id, "") */
    410         if (t->online && p->msg.arg1 != 0) {
    411             if((s = find_local_socket(p->msg.arg1, p->msg.arg0))) {
    412                 /* According to protocol.txt, p->msg.arg0 might be 0 to indicate
    413                  * a failed OPEN only. However, due to a bug in previous ADB
    414                  * versions, CLOSE(0, remote-id, "") was also used for normal
    415                  * CLOSE() operations.
    416                  *
    417                  * This is bad because it means a compromised adbd could
    418                  * send packets to close connections between the host and
    419                  * other devices. To avoid this, only allow this if the local
    420                  * socket has a peer on the same transport.
    421                  */
    422                 if (p->msg.arg0 == 0 && s->peer && s->peer->transport != t) {
    423                     D("Invalid A_CLSE(0, %u) from transport %s, expected transport %s",
    424                       p->msg.arg1, t->serial, s->peer->transport->serial);
    425                 } else {
    426                     s->close(s);
    427                 }
    428             }
    429         }
    430         break;
    431 
    432     case A_WRTE: /* WRITE(local-id, remote-id, <data>) */
    433         if (t->online && p->msg.arg0 != 0 && p->msg.arg1 != 0) {
    434             if((s = find_local_socket(p->msg.arg1, p->msg.arg0))) {
    435                 unsigned rid = p->msg.arg0;
    436                 p->len = p->msg.data_length;
    437 
    438                 if(s->enqueue(s, p) == 0) {
    439                     D("Enqueue the socket");
    440                     send_ready(s->id, rid, t);
    441                 }
    442                 return;
    443             }
    444         }
    445         break;
    446 
    447     default:
    448         printf("handle_packet: what is %08x?!\n", p->msg.command);
    449     }
    450 
    451     put_apacket(p);
    452 }
    453 
    454 #if ADB_HOST
    455 
    456 #ifdef _WIN32
    457 
    458 // Try to make a handle non-inheritable and if there is an error, don't output
    459 // any error info, but leave GetLastError() for the caller to read. This is
    460 // convenient if the caller is expecting that this may fail and they'd like to
    461 // ignore such a failure.
    462 static bool _try_make_handle_noninheritable(HANDLE h) {
    463     if (h != INVALID_HANDLE_VALUE && h != NULL) {
    464         return SetHandleInformation(h, HANDLE_FLAG_INHERIT, 0) ? true : false;
    465     }
    466 
    467     return true;
    468 }
    469 
    470 // Try to make a handle non-inheritable with the expectation that this should
    471 // succeed, so if this fails, output error info.
    472 static bool _make_handle_noninheritable(HANDLE h) {
    473     if (!_try_make_handle_noninheritable(h)) {
    474         // Show the handle value to give us a clue in case we have problems
    475         // with pseudo-handle values.
    476         fprintf(stderr, "Cannot make handle 0x%p non-inheritable: %s\n",
    477                 h, android::base::SystemErrorCodeToString(GetLastError()).c_str());
    478         return false;
    479     }
    480 
    481     return true;
    482 }
    483 
    484 // Create anonymous pipe, preventing inheritance of the read pipe and setting
    485 // security of the write pipe to sa.
    486 static bool _create_anonymous_pipe(unique_handle* pipe_read_out,
    487                                    unique_handle* pipe_write_out,
    488                                    SECURITY_ATTRIBUTES* sa) {
    489     HANDLE pipe_read_raw = NULL;
    490     HANDLE pipe_write_raw = NULL;
    491     if (!CreatePipe(&pipe_read_raw, &pipe_write_raw, sa, 0)) {
    492         fprintf(stderr, "Cannot create pipe: %s\n",
    493                 android::base::SystemErrorCodeToString(GetLastError()).c_str());
    494         return false;
    495     }
    496 
    497     unique_handle pipe_read(pipe_read_raw);
    498     pipe_read_raw = NULL;
    499     unique_handle pipe_write(pipe_write_raw);
    500     pipe_write_raw = NULL;
    501 
    502     if (!_make_handle_noninheritable(pipe_read.get())) {
    503         return false;
    504     }
    505 
    506     *pipe_read_out = std::move(pipe_read);
    507     *pipe_write_out = std::move(pipe_write);
    508 
    509     return true;
    510 }
    511 
    512 // Read from a pipe (that we take ownership of) and write the result to stdout/stderr. Return on
    513 // error or when the pipe is closed. Internally makes inheritable handles, so this should not be
    514 // called if subprocesses may be started concurrently.
    515 static unsigned _redirect_pipe_thread(HANDLE h, DWORD nStdHandle) {
    516     // Take ownership of the HANDLE and close when we're done.
    517     unique_handle   read_pipe(h);
    518     const char*     output_name = nStdHandle == STD_OUTPUT_HANDLE ? "stdout" : "stderr";
    519     const int       original_fd = fileno(nStdHandle == STD_OUTPUT_HANDLE ? stdout : stderr);
    520     std::unique_ptr<FILE, decltype(&fclose)> stream(nullptr, fclose);
    521 
    522     if (original_fd == -1) {
    523         fprintf(stderr, "Failed to get file descriptor for %s: %s\n", output_name, strerror(errno));
    524         return EXIT_FAILURE;
    525     }
    526 
    527     // If fileno() is -2, stdout/stderr is not associated with an output stream, so we should read,
    528     // but don't write. Otherwise, make a FILE* identical to stdout/stderr except that it is in
    529     // binary mode with no CR/LR translation since we're reading raw.
    530     if (original_fd >= 0) {
    531         // This internally makes a duplicate file handle that is inheritable, so callers should not
    532         // call this function if subprocesses may be started concurrently.
    533         const int fd = dup(original_fd);
    534         if (fd == -1) {
    535             fprintf(stderr, "Failed to duplicate file descriptor for %s: %s\n", output_name,
    536                     strerror(errno));
    537             return EXIT_FAILURE;
    538         }
    539 
    540         // Note that although we call fdopen() below with a binary flag, it may not adhere to that
    541         // flag, so we have to set the mode manually.
    542         if (_setmode(fd, _O_BINARY) == -1) {
    543             fprintf(stderr, "Failed to set binary mode for duplicate of %s: %s\n", output_name,
    544                     strerror(errno));
    545             unix_close(fd);
    546             return EXIT_FAILURE;
    547         }
    548 
    549         stream.reset(fdopen(fd, "wb"));
    550         if (stream.get() == nullptr) {
    551             fprintf(stderr, "Failed to open duplicate stream for %s: %s\n", output_name,
    552                     strerror(errno));
    553             unix_close(fd);
    554             return EXIT_FAILURE;
    555         }
    556 
    557         // Unbuffer the stream because it will be buffered by default and we want subprocess output
    558         // to be shown immediately.
    559         if (setvbuf(stream.get(), NULL, _IONBF, 0) == -1) {
    560             fprintf(stderr, "Failed to unbuffer %s: %s\n", output_name, strerror(errno));
    561             return EXIT_FAILURE;
    562         }
    563 
    564         // fd will be closed when stream is closed.
    565     }
    566 
    567     while (true) {
    568         char    buf[64 * 1024];
    569         DWORD   bytes_read = 0;
    570         if (!ReadFile(read_pipe.get(), buf, sizeof(buf), &bytes_read, NULL)) {
    571             const DWORD err = GetLastError();
    572             // ERROR_BROKEN_PIPE is expected when the subprocess closes
    573             // the other end of the pipe.
    574             if (err == ERROR_BROKEN_PIPE) {
    575                 return EXIT_SUCCESS;
    576             } else {
    577                 fprintf(stderr, "Failed to read from %s: %s\n", output_name,
    578                         android::base::SystemErrorCodeToString(err).c_str());
    579                 return EXIT_FAILURE;
    580             }
    581         }
    582 
    583         // Don't try to write if our stdout/stderr was not setup by the parent process.
    584         if (stream) {
    585             // fwrite() actually calls adb_fwrite() which can write UTF-8 to the console.
    586             const size_t bytes_written = fwrite(buf, 1, bytes_read, stream.get());
    587             if (bytes_written != bytes_read) {
    588                 fprintf(stderr, "Only wrote %zu of %lu bytes to %s\n", bytes_written, bytes_read,
    589                         output_name);
    590                 return EXIT_FAILURE;
    591             }
    592         }
    593     }
    594 }
    595 
    596 static unsigned __stdcall _redirect_stdout_thread(HANDLE h) {
    597     adb_thread_setname("stdout redirect");
    598     return _redirect_pipe_thread(h, STD_OUTPUT_HANDLE);
    599 }
    600 
    601 static unsigned __stdcall _redirect_stderr_thread(HANDLE h) {
    602     adb_thread_setname("stderr redirect");
    603     return _redirect_pipe_thread(h, STD_ERROR_HANDLE);
    604 }
    605 
    606 #endif
    607 
    608 int launch_server(int server_port)
    609 {
    610 #if defined(_WIN32)
    611     /* we need to start the server in the background                    */
    612     /* we create a PIPE that will be used to wait for the server's "OK" */
    613     /* message since the pipe handles must be inheritable, we use a     */
    614     /* security attribute                                               */
    615     SECURITY_ATTRIBUTES   sa;
    616     sa.nLength = sizeof(sa);
    617     sa.lpSecurityDescriptor = NULL;
    618     sa.bInheritHandle = TRUE;
    619 
    620     // Redirect stdin to Windows /dev/null. If we instead pass an original
    621     // stdin/stdout/stderr handle and it is a console handle, when the adb
    622     // server starts up, the C Runtime will see a console handle for a process
    623     // that isn't connected to a console and it will configure
    624     // stdin/stdout/stderr to be closed. At that point, freopen() could be used
    625     // to reopen stderr/out, but it would take more massaging to fixup the file
    626     // descriptor number that freopen() uses. It's simplest to avoid all of this
    627     // complexity by just redirecting stdin to `nul' and then the C Runtime acts
    628     // as expected.
    629     unique_handle   nul_read(CreateFileW(L"nul", GENERIC_READ,
    630             FILE_SHARE_READ | FILE_SHARE_WRITE, &sa, OPEN_EXISTING,
    631             FILE_ATTRIBUTE_NORMAL, NULL));
    632     if (nul_read.get() == INVALID_HANDLE_VALUE) {
    633         fprintf(stderr, "Cannot open 'nul': %s\n",
    634                 android::base::SystemErrorCodeToString(GetLastError()).c_str());
    635         return -1;
    636     }
    637 
    638     // Create pipes with non-inheritable read handle, inheritable write handle. We need to connect
    639     // the subprocess to pipes instead of just letting the subprocess inherit our existing
    640     // stdout/stderr handles because a DETACHED_PROCESS cannot write to a console that it is not
    641     // attached to.
    642     unique_handle   ack_read, ack_write;
    643     if (!_create_anonymous_pipe(&ack_read, &ack_write, &sa)) {
    644         return -1;
    645     }
    646     unique_handle   stdout_read, stdout_write;
    647     if (!_create_anonymous_pipe(&stdout_read, &stdout_write, &sa)) {
    648         return -1;
    649     }
    650     unique_handle   stderr_read, stderr_write;
    651     if (!_create_anonymous_pipe(&stderr_read, &stderr_write, &sa)) {
    652         return -1;
    653     }
    654 
    655     /* Some programs want to launch an adb command and collect its output by
    656      * calling CreateProcess with inheritable stdout/stderr handles, then
    657      * using read() to get its output. When this happens, the stdout/stderr
    658      * handles passed to the adb client process will also be inheritable.
    659      * When starting the adb server here, care must be taken to reset them
    660      * to non-inheritable.
    661      * Otherwise, something bad happens: even if the adb command completes,
    662      * the calling process is stuck while read()-ing from the stdout/stderr
    663      * descriptors, because they're connected to corresponding handles in the
    664      * adb server process (even if the latter never uses/writes to them).
    665      * Note that even if we don't pass these handles in the STARTUPINFO struct,
    666      * if they're marked inheritable, they're still inherited, requiring us to
    667      * deal with this.
    668      *
    669      * If we're still having problems with inheriting random handles in the
    670      * future, consider using PROC_THREAD_ATTRIBUTE_HANDLE_LIST to explicitly
    671      * specify which handles should be inherited: http://blogs.msdn.com/b/oldnewthing/archive/2011/12/16/10248328.aspx
    672      *
    673      * Older versions of Windows return console pseudo-handles that cannot be
    674      * made non-inheritable, so ignore those failures.
    675      */
    676     _try_make_handle_noninheritable(GetStdHandle(STD_INPUT_HANDLE));
    677     _try_make_handle_noninheritable(GetStdHandle(STD_OUTPUT_HANDLE));
    678     _try_make_handle_noninheritable(GetStdHandle(STD_ERROR_HANDLE));
    679 
    680     STARTUPINFOW    startup;
    681     ZeroMemory( &startup, sizeof(startup) );
    682     startup.cb = sizeof(startup);
    683     startup.hStdInput  = nul_read.get();
    684     startup.hStdOutput = stdout_write.get();
    685     startup.hStdError  = stderr_write.get();
    686     startup.dwFlags    = STARTF_USESTDHANDLES;
    687 
    688     // Verify that the pipe_write handle value can be passed on the command line
    689     // as %d and that the rest of adb code can pass it around in an int.
    690     const int ack_write_as_int = cast_handle_to_int(ack_write.get());
    691     if (cast_int_to_handle(ack_write_as_int) != ack_write.get()) {
    692         // If this fires, either handle values are larger than 32-bits or else
    693         // there is a bug in our casting.
    694         // https://msdn.microsoft.com/en-us/library/windows/desktop/aa384203%28v=vs.85%29.aspx
    695         fprintf(stderr, "Cannot fit pipe handle value into 32-bits: 0x%p\n",
    696                 ack_write.get());
    697         return -1;
    698     }
    699 
    700     // get path of current program
    701     WCHAR       program_path[MAX_PATH];
    702     const DWORD module_result = GetModuleFileNameW(NULL, program_path,
    703                                                    arraysize(program_path));
    704     if ((module_result >= arraysize(program_path)) || (module_result == 0)) {
    705         // String truncation or some other error.
    706         fprintf(stderr, "Cannot get executable path: %s\n",
    707                 android::base::SystemErrorCodeToString(GetLastError()).c_str());
    708         return -1;
    709     }
    710 
    711     WCHAR   args[64];
    712     snwprintf(args, arraysize(args),
    713               L"adb -P %d fork-server server --reply-fd %d", server_port,
    714               ack_write_as_int);
    715 
    716     PROCESS_INFORMATION   pinfo;
    717     ZeroMemory(&pinfo, sizeof(pinfo));
    718 
    719     if (!CreateProcessW(
    720             program_path,                              /* program path  */
    721             args,
    722                                     /* the fork-server argument will set the
    723                                        debug = 2 in the child           */
    724             NULL,                   /* process handle is not inheritable */
    725             NULL,                    /* thread handle is not inheritable */
    726             TRUE,                          /* yes, inherit some handles */
    727             DETACHED_PROCESS, /* the new process doesn't have a console */
    728             NULL,                     /* use parent's environment block */
    729             NULL,                    /* use parent's starting directory */
    730             &startup,                 /* startup info, i.e. std handles */
    731             &pinfo )) {
    732         fprintf(stderr, "Cannot create process: %s\n",
    733                 android::base::SystemErrorCodeToString(GetLastError()).c_str());
    734         return -1;
    735     }
    736 
    737     unique_handle   process_handle(pinfo.hProcess);
    738     pinfo.hProcess = NULL;
    739 
    740     // Close handles that we no longer need to complete the rest.
    741     CloseHandle(pinfo.hThread);
    742     pinfo.hThread = NULL;
    743 
    744     nul_read.reset();
    745     ack_write.reset();
    746     stdout_write.reset();
    747     stderr_write.reset();
    748 
    749     // Start threads to read from subprocess stdout/stderr and write to ours to make subprocess
    750     // errors easier to diagnose. Note that the threads internally create inheritable handles, but
    751     // that is ok because we've already spawned the subprocess.
    752 
    753     // In the past, reading from a pipe before the child process's C Runtime
    754     // started up and called GetFileType() caused a hang: http://blogs.msdn.com/b/oldnewthing/archive/2011/12/02/10243553.aspx#10244216
    755     // This is reportedly fixed in Windows Vista: https://support.microsoft.com/en-us/kb/2009703
    756     // I was unable to reproduce the problem on Windows XP. It sounds like a
    757     // Windows Update may have fixed this: https://www.duckware.com/tech/peeknamedpipe.html
    758     unique_handle   stdout_thread(reinterpret_cast<HANDLE>(
    759             _beginthreadex(NULL, 0, _redirect_stdout_thread, stdout_read.get(),
    760                            0, NULL)));
    761     if (stdout_thread.get() == nullptr) {
    762         fprintf(stderr, "Cannot create thread: %s\n", strerror(errno));
    763         return -1;
    764     }
    765     stdout_read.release();  // Transfer ownership to new thread
    766 
    767     unique_handle   stderr_thread(reinterpret_cast<HANDLE>(
    768             _beginthreadex(NULL, 0, _redirect_stderr_thread, stderr_read.get(),
    769                            0, NULL)));
    770     if (stderr_thread.get() == nullptr) {
    771         fprintf(stderr, "Cannot create thread: %s\n", strerror(errno));
    772         return -1;
    773     }
    774     stderr_read.release();  // Transfer ownership to new thread
    775 
    776     bool    got_ack = false;
    777 
    778     // Wait for the "OK\n" message, for the pipe to be closed, or other error.
    779     {
    780         char    temp[3];
    781         DWORD   count = 0;
    782 
    783         if (ReadFile(ack_read.get(), temp, sizeof(temp), &count, NULL)) {
    784             const CHAR  expected[] = "OK\n";
    785             const DWORD expected_length = arraysize(expected) - 1;
    786             if (count == expected_length &&
    787                 memcmp(temp, expected, expected_length) == 0) {
    788                 got_ack = true;
    789             } else {
    790                 fprintf(stderr, "ADB server didn't ACK\n");
    791             }
    792         } else {
    793             const DWORD err = GetLastError();
    794             // If the ACK was not written and the process exited, GetLastError()
    795             // is probably ERROR_BROKEN_PIPE, in which case that info is not
    796             // useful to the user.
    797             fprintf(stderr, "could not read ok from ADB Server%s\n",
    798                     err == ERROR_BROKEN_PIPE ? "" :
    799                     android::base::StringPrintf(": %s",
    800                             android::base::SystemErrorCodeToString(err).c_str()).c_str());
    801         }
    802     }
    803 
    804     // Always try to wait a bit for threads reading stdout/stderr to finish.
    805     // If the process started ok, it should close the pipes causing the threads
    806     // to finish. If the process had an error, it should exit, also causing
    807     // the pipes to be closed. In that case we want to read all of the output
    808     // and write it out so that the user can diagnose failures.
    809     const DWORD     thread_timeout_ms = 15 * 1000;
    810     const HANDLE    threads[] = { stdout_thread.get(), stderr_thread.get() };
    811     const DWORD     wait_result = WaitForMultipleObjects(arraysize(threads),
    812             threads, TRUE, thread_timeout_ms);
    813     if (wait_result == WAIT_TIMEOUT) {
    814         // Threads did not finish after waiting a little while. Perhaps the
    815         // server didn't close pipes, or it is hung.
    816         fprintf(stderr, "Timed-out waiting for threads to finish reading from "
    817                 "ADB Server\n");
    818         // Process handles are signaled when the process exits, so if we wait
    819         // on the handle for 0 seconds and it returns 'timeout', that means that
    820         // the process is still running.
    821         if (WaitForSingleObject(process_handle.get(), 0) == WAIT_TIMEOUT) {
    822             // We could TerminateProcess(), but that seems somewhat presumptive.
    823             fprintf(stderr, "ADB Server is running: process id %lu\n",
    824                     pinfo.dwProcessId);
    825         }
    826         return -1;
    827     }
    828 
    829     if (wait_result != WAIT_OBJECT_0) {
    830         fprintf(stderr, "Unexpected result waiting for threads: %lu: %s\n",
    831                 wait_result, android::base::SystemErrorCodeToString(GetLastError()).c_str());
    832         return -1;
    833     }
    834 
    835     // For now ignore the thread exit codes and assume they worked properly.
    836 
    837     if (!got_ack) {
    838         return -1;
    839     }
    840 #else /* !defined(_WIN32) */
    841     char    path[PATH_MAX];
    842     int     fd[2];
    843 
    844     // set up a pipe so the child can tell us when it is ready.
    845     // fd[0] will be parent's end, and the child will write on fd[1]
    846     if (pipe(fd)) {
    847         fprintf(stderr, "pipe failed in launch_server, errno: %d\n", errno);
    848         return -1;
    849     }
    850     get_my_path(path, PATH_MAX);
    851     pid_t pid = fork();
    852     if(pid < 0) return -1;
    853 
    854     if (pid == 0) {
    855         // child side of the fork
    856 
    857         adb_close(fd[0]);
    858 
    859         char str_port[30];
    860         snprintf(str_port, sizeof(str_port), "%d", server_port);
    861         char reply_fd[30];
    862         snprintf(reply_fd, sizeof(reply_fd), "%d", fd[1]);
    863         // child process
    864         int result = execl(path, "adb", "-P", str_port, "fork-server", "server", "--reply-fd", reply_fd, NULL);
    865         // this should not return
    866         fprintf(stderr, "OOPS! execl returned %d, errno: %d\n", result, errno);
    867     } else  {
    868         // parent side of the fork
    869 
    870         char  temp[3];
    871 
    872         temp[0] = 'A'; temp[1] = 'B'; temp[2] = 'C';
    873         // wait for the "OK\n" message
    874         adb_close(fd[1]);
    875         int ret = adb_read(fd[0], temp, 3);
    876         int saved_errno = errno;
    877         adb_close(fd[0]);
    878         if (ret < 0) {
    879             fprintf(stderr, "could not read ok from ADB Server, errno = %d\n", saved_errno);
    880             return -1;
    881         }
    882         if (ret != 3 || temp[0] != 'O' || temp[1] != 'K' || temp[2] != '\n') {
    883             fprintf(stderr, "ADB server didn't ACK\n" );
    884             return -1;
    885         }
    886     }
    887 #endif /* !defined(_WIN32) */
    888     return 0;
    889 }
    890 #endif /* ADB_HOST */
    891 
    892 // Try to handle a network forwarding request.
    893 // This returns 1 on success, 0 on failure, and -1 to indicate this is not
    894 // a forwarding-related request.
    895 int handle_forward_request(const char* service, TransportType type, const char* serial, int reply_fd)
    896 {
    897     if (!strcmp(service, "list-forward")) {
    898         // Create the list of forward redirections.
    899         std::string listeners = format_listeners();
    900 #if ADB_HOST
    901         SendOkay(reply_fd);
    902 #endif
    903         return SendProtocolString(reply_fd, listeners);
    904     }
    905 
    906     if (!strcmp(service, "killforward-all")) {
    907         remove_all_listeners();
    908 #if ADB_HOST
    909         /* On the host: 1st OKAY is connect, 2nd OKAY is status */
    910         SendOkay(reply_fd);
    911 #endif
    912         SendOkay(reply_fd);
    913         return 1;
    914     }
    915 
    916     if (!strncmp(service, "forward:", 8) || !strncmp(service, "killforward:", 12)) {
    917         // killforward:local
    918         // forward:(norebind:)?local;remote
    919         bool kill_forward = false;
    920         bool no_rebind = false;
    921         if (android::base::StartsWith(service, "killforward:")) {
    922             kill_forward = true;
    923             service += 12;
    924         } else {
    925             service += 8;   // skip past "forward:"
    926             if (android::base::StartsWith(service, "norebind:")) {
    927                 no_rebind = true;
    928                 service += 9;
    929             }
    930         }
    931 
    932         std::vector<std::string> pieces = android::base::Split(service, ";");
    933 
    934         if (kill_forward) {
    935             // Check killforward: parameter format: '<local>'
    936             if (pieces.size() != 1 || pieces[0].empty()) {
    937                 SendFail(reply_fd, android::base::StringPrintf("bad killforward: %s", service));
    938                 return 1;
    939             }
    940         } else {
    941             // Check forward: parameter format: '<local>;<remote>'
    942             if (pieces.size() != 2 || pieces[0].empty() || pieces[1].empty() || pieces[1][0] == '*') {
    943                 SendFail(reply_fd, android::base::StringPrintf("bad forward: %s", service));
    944                 return 1;
    945             }
    946         }
    947 
    948         std::string error_msg;
    949         atransport* transport = acquire_one_transport(type, serial, nullptr, &error_msg);
    950         if (!transport) {
    951             SendFail(reply_fd, error_msg);
    952             return 1;
    953         }
    954 
    955         std::string error;
    956         InstallStatus r;
    957         if (kill_forward) {
    958             r = remove_listener(pieces[0].c_str(), transport);
    959         } else {
    960             r = install_listener(pieces[0], pieces[1].c_str(), transport,
    961                                  no_rebind, &error);
    962         }
    963         if (r == INSTALL_STATUS_OK) {
    964 #if ADB_HOST
    965             /* On the host: 1st OKAY is connect, 2nd OKAY is status */
    966             SendOkay(reply_fd);
    967 #endif
    968             SendOkay(reply_fd);
    969             return 1;
    970         }
    971 
    972         std::string message;
    973         switch (r) {
    974           case INSTALL_STATUS_OK: message = "success (!)"; break;
    975           case INSTALL_STATUS_INTERNAL_ERROR: message = "internal error"; break;
    976           case INSTALL_STATUS_CANNOT_BIND:
    977             message = android::base::StringPrintf("cannot bind listener: %s",
    978                                                   error.c_str());
    979             break;
    980           case INSTALL_STATUS_CANNOT_REBIND:
    981             message = android::base::StringPrintf("cannot rebind existing socket");
    982             break;
    983           case INSTALL_STATUS_LISTENER_NOT_FOUND:
    984             message = android::base::StringPrintf("listener '%s' not found", service);
    985             break;
    986         }
    987         SendFail(reply_fd, message);
    988         return 1;
    989     }
    990     return 0;
    991 }
    992 
    993 #if ADB_HOST
    994 static int SendOkay(int fd, const std::string& s) {
    995     SendOkay(fd);
    996     SendProtocolString(fd, s);
    997     return 0;
    998 }
    999 #endif
   1000 
   1001 int handle_host_request(const char* service, TransportType type,
   1002                         const char* serial, int reply_fd, asocket* s) {
   1003     if (strcmp(service, "kill") == 0) {
   1004         fprintf(stderr, "adb server killed by remote request\n");
   1005         fflush(stdout);
   1006         SendOkay(reply_fd);
   1007 
   1008         // On Windows, if the process exits with open sockets that
   1009         // shutdown(SD_SEND) has not been called on, TCP RST segments will be
   1010         // sent to the peers which will cause their next recv() to error-out
   1011         // with WSAECONNRESET. In the case of this code, that means the client
   1012         // may not read the OKAY sent above.
   1013         adb_shutdown(reply_fd);
   1014 
   1015         exit(0);
   1016     }
   1017 
   1018 #if ADB_HOST
   1019     // "transport:" is used for switching transport with a specified serial number
   1020     // "transport-usb:" is used for switching transport to the only USB transport
   1021     // "transport-local:" is used for switching transport to the only local transport
   1022     // "transport-any:" is used for switching transport to the only transport
   1023     if (!strncmp(service, "transport", strlen("transport"))) {
   1024         TransportType type = kTransportAny;
   1025 
   1026         if (!strncmp(service, "transport-usb", strlen("transport-usb"))) {
   1027             type = kTransportUsb;
   1028         } else if (!strncmp(service, "transport-local", strlen("transport-local"))) {
   1029             type = kTransportLocal;
   1030         } else if (!strncmp(service, "transport-any", strlen("transport-any"))) {
   1031             type = kTransportAny;
   1032         } else if (!strncmp(service, "transport:", strlen("transport:"))) {
   1033             service += strlen("transport:");
   1034             serial = service;
   1035         }
   1036 
   1037         std::string error;
   1038         atransport* t = acquire_one_transport(type, serial, nullptr, &error);
   1039         if (t != nullptr) {
   1040             s->transport = t;
   1041             SendOkay(reply_fd);
   1042         } else {
   1043             SendFail(reply_fd, error);
   1044         }
   1045         return 1;
   1046     }
   1047 
   1048     // return a list of all connected devices
   1049     if (!strncmp(service, "devices", 7)) {
   1050         bool long_listing = (strcmp(service+7, "-l") == 0);
   1051         if (long_listing || service[7] == 0) {
   1052             D("Getting device list...");
   1053             std::string device_list = list_transports(long_listing);
   1054             D("Sending device list...");
   1055             return SendOkay(reply_fd, device_list);
   1056         }
   1057         return 1;
   1058     }
   1059 
   1060     if (!strcmp(service, "features")) {
   1061         std::string error;
   1062         atransport* t = acquire_one_transport(type, serial, nullptr, &error);
   1063         if (t != nullptr) {
   1064             SendOkay(reply_fd, FeatureSetToString(t->features()));
   1065         } else {
   1066             SendFail(reply_fd, error);
   1067         }
   1068         return 0;
   1069     }
   1070 
   1071     // remove TCP transport
   1072     if (!strncmp(service, "disconnect:", 11)) {
   1073         const std::string address(service + 11);
   1074         if (address.empty()) {
   1075             kick_all_tcp_devices();
   1076             return SendOkay(reply_fd, "disconnected everything");
   1077         }
   1078 
   1079         std::string serial;
   1080         std::string host;
   1081         int port = DEFAULT_ADB_LOCAL_TRANSPORT_PORT;
   1082         std::string error;
   1083         if (!android::base::ParseNetAddress(address, &host, &port, &serial, &error)) {
   1084             return SendFail(reply_fd, android::base::StringPrintf("couldn't parse '%s': %s",
   1085                                                                   address.c_str(), error.c_str()));
   1086         }
   1087         atransport* t = find_transport(serial.c_str());
   1088         if (t == nullptr) {
   1089             return SendFail(reply_fd, android::base::StringPrintf("no such device '%s'",
   1090                                                                   serial.c_str()));
   1091         }
   1092         kick_transport(t);
   1093         return SendOkay(reply_fd, android::base::StringPrintf("disconnected %s", address.c_str()));
   1094     }
   1095 
   1096     // Returns our value for ADB_SERVER_VERSION.
   1097     if (!strcmp(service, "version")) {
   1098         return SendOkay(reply_fd, android::base::StringPrintf("%04x", ADB_SERVER_VERSION));
   1099     }
   1100 
   1101     // These always report "unknown" rather than the actual error, for scripts.
   1102     if (!strcmp(service, "get-serialno")) {
   1103         std::string error;
   1104         atransport* t = acquire_one_transport(type, serial, nullptr, &error);
   1105         if (t) {
   1106             return SendOkay(reply_fd, t->serial ? t->serial : "unknown");
   1107         } else {
   1108             return SendFail(reply_fd, error);
   1109         }
   1110     }
   1111     if (!strcmp(service, "get-devpath")) {
   1112         std::string error;
   1113         atransport* t = acquire_one_transport(type, serial, nullptr, &error);
   1114         if (t) {
   1115             return SendOkay(reply_fd, t->devpath ? t->devpath : "unknown");
   1116         } else {
   1117             return SendFail(reply_fd, error);
   1118         }
   1119     }
   1120     if (!strcmp(service, "get-state")) {
   1121         std::string error;
   1122         atransport* t = acquire_one_transport(type, serial, nullptr, &error);
   1123         if (t) {
   1124             return SendOkay(reply_fd, t->connection_state_name());
   1125         } else {
   1126             return SendFail(reply_fd, error);
   1127         }
   1128     }
   1129 
   1130     // Indicates a new emulator instance has started.
   1131     if (!strncmp(service, "emulator:", 9)) {
   1132         int  port = atoi(service+9);
   1133         local_connect(port);
   1134         /* we don't even need to send a reply */
   1135         return 0;
   1136     }
   1137 
   1138     if (!strcmp(service, "reconnect")) {
   1139         if (s->transport != nullptr) {
   1140             kick_transport(s->transport);
   1141         }
   1142         return SendOkay(reply_fd, "done");
   1143     }
   1144 #endif // ADB_HOST
   1145 
   1146     int ret = handle_forward_request(service, type, serial, reply_fd);
   1147     if (ret >= 0)
   1148       return ret - 1;
   1149     return -1;
   1150 }
   1151