Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 13c639e0 authored by Joshua Duong's avatar Joshua Duong
Browse files

[adb client] Add "mdns services" command.

This command list all discovered mdns services, so we
can connect via service name later on.

Bug: 152521166

Test: 'adb mdns services'
Test: test_adb.py
Change-Id: I23d42a7933e67a65bd0c9924afd6abe5915c0a11
parent 504d3931
Loading
Loading
Loading
Loading
+5 −0
Original line number Original line Diff line number Diff line
@@ -1086,6 +1086,11 @@ static bool handle_mdns_request(std::string_view service, int reply_fd) {
        SendOkay(reply_fd, check);
        SendOkay(reply_fd, check);
        return true;
        return true;
    }
    }
    if (service == "services") {
        std::string services_list = mdns_list_discovered_services();
        SendOkay(reply_fd, services_list);
        return true;
    }


    return false;
    return false;
}
}
+1 −0
Original line number Original line Diff line number Diff line
@@ -28,6 +28,7 @@ void adb_wifi_pair_device(const std::string& host, const std::string& password,
bool adb_wifi_is_known_host(const std::string& host);
bool adb_wifi_is_known_host(const std::string& host);


std::string mdns_check();
std::string mdns_check();
std::string mdns_list_discovered_services();


#else  // !ADB_HOST
#else  // !ADB_HOST


+3 −2
Original line number Original line Diff line number Diff line
@@ -90,8 +90,9 @@ extern const char* _Nullable * _Nullable __adb_envp;


// ADB Secure DNS service interface. Used to query what ADB Secure DNS services have been
// ADB Secure DNS service interface. Used to query what ADB Secure DNS services have been
// resolved, and to run some kind of callback for each one.
// resolved, and to run some kind of callback for each one.
using adb_secure_foreach_service_callback = std::function<void(
using adb_secure_foreach_service_callback =
        const char* _Nonnull service_name, const char* _Nonnull ip_address, uint16_t port)>;
        std::function<void(const char* _Nonnull service_name, const char* _Nonnull reg_type,
                           const char* _Nonnull ip_address, uint16_t port)>;


// Queries pairing/connect services that have been discovered and resolved.
// Queries pairing/connect services that have been discovered and resolved.
// If |host_name| is not null, run |cb| only for services
// If |host_name| is not null, run |cb| only for services
+5 −0
Original line number Original line Diff line number Diff line
@@ -128,6 +128,7 @@ static void help() {
        " reverse --remove REMOTE  remove specific reverse socket connection\n"
        " reverse --remove REMOTE  remove specific reverse socket connection\n"
        " reverse --remove-all     remove all reverse socket connections from device\n"
        " reverse --remove-all     remove all reverse socket connections from device\n"
        " mdns check               check if mdns discovery is available\n"
        " mdns check               check if mdns discovery is available\n"
        " mdns services            list all discovered services\n"
        "\n"
        "\n"
        "file transfer:\n"
        "file transfer:\n"
        " push [--sync] [-z ALGORITHM] [-Z] LOCAL... REMOTE\n"
        " push [--sync] [-z ALGORITHM] [-Z] LOCAL... REMOTE\n"
@@ -1925,6 +1926,10 @@ int adb_commandline(int argc, const char** argv) {
        if (!strcmp(argv[0], "check")) {
        if (!strcmp(argv[0], "check")) {
            if (argc != 1) error_exit("mdns %s doesn't take any arguments", argv[0]);
            if (argc != 1) error_exit("mdns %s doesn't take any arguments", argv[0]);
            query += "check";
            query += "check";
        } else if (!strcmp(argv[0], "services")) {
            if (argc != 1) error_exit("mdns %s doesn't take any arguments", argv[0]);
            query += "services";
            printf("List of discovered mdns services\n");
        } else {
        } else {
            error_exit("unknown mdns command [%s]", argv[0]);
            error_exit("unknown mdns command [%s]", argv[0]);
        }
        }
+39 −7
Original line number Original line Diff line number Diff line
@@ -216,6 +216,9 @@ class ResolvedService : public AsyncServiceRef {


        int adbSecureServiceType = serviceIndex();
        int adbSecureServiceType = serviceIndex();
        switch (adbSecureServiceType) {
        switch (adbSecureServiceType) {
            case kADBTransportServiceRefIndex:
                sAdbTransportServices->push_back(this);
                break;
            case kADBSecurePairingServiceRefIndex:
            case kADBSecurePairingServiceRefIndex:
                sAdbSecurePairingServices->push_back(this);
                sAdbSecurePairingServices->push_back(this);
                break;
                break;
@@ -233,16 +236,21 @@ class ResolvedService : public AsyncServiceRef {


    std::string serviceName() const { return serviceName_; }
    std::string serviceName() const { return serviceName_; }


    std::string regType() const { return regType_; }

    std::string ipAddress() const { return ip_addr_; }
    std::string ipAddress() const { return ip_addr_; }


    uint16_t port() const { return port_; }
    uint16_t port() const { return port_; }


    using ServiceRegistry = std::vector<ResolvedService*>;
    using ServiceRegistry = std::vector<ResolvedService*>;


    // unencrypted tcp connections
    static ServiceRegistry* sAdbTransportServices;

    static ServiceRegistry* sAdbSecurePairingServices;
    static ServiceRegistry* sAdbSecurePairingServices;
    static ServiceRegistry* sAdbSecureConnectServices;
    static ServiceRegistry* sAdbSecureConnectServices;


    static void initAdbSecure();
    static void initAdbServiceRegistries();


    static void forEachService(const ServiceRegistry& services, const std::string& hostname,
    static void forEachService(const ServiceRegistry& services, const std::string& hostname,
                               adb_secure_foreach_service_callback cb);
                               adb_secure_foreach_service_callback cb);
@@ -263,6 +271,9 @@ class ResolvedService : public AsyncServiceRef {
    int serviceVersion_;
    int serviceVersion_;
};
};


// static
std::vector<ResolvedService*>* ResolvedService::sAdbTransportServices = NULL;

// static
// static
std::vector<ResolvedService*>* ResolvedService::sAdbSecurePairingServices = NULL;
std::vector<ResolvedService*>* ResolvedService::sAdbSecurePairingServices = NULL;


@@ -270,7 +281,10 @@ std::vector<ResolvedService*>* ResolvedService::sAdbSecurePairingServices = NULL
std::vector<ResolvedService*>* ResolvedService::sAdbSecureConnectServices = NULL;
std::vector<ResolvedService*>* ResolvedService::sAdbSecureConnectServices = NULL;


// static
// static
void ResolvedService::initAdbSecure() {
void ResolvedService::initAdbServiceRegistries() {
    if (!sAdbTransportServices) {
        sAdbTransportServices = new ServiceRegistry;
    }
    if (!sAdbSecurePairingServices) {
    if (!sAdbSecurePairingServices) {
        sAdbSecurePairingServices = new ServiceRegistry;
        sAdbSecurePairingServices = new ServiceRegistry;
    }
    }
@@ -283,17 +297,18 @@ void ResolvedService::initAdbSecure() {
void ResolvedService::forEachService(const ServiceRegistry& services,
void ResolvedService::forEachService(const ServiceRegistry& services,
                                     const std::string& wanted_service_name,
                                     const std::string& wanted_service_name,
                                     adb_secure_foreach_service_callback cb) {
                                     adb_secure_foreach_service_callback cb) {
    initAdbSecure();
    initAdbServiceRegistries();


    for (auto service : services) {
    for (auto service : services) {
        auto service_name = service->serviceName();
        auto service_name = service->serviceName();
        auto reg_type = service->regType();
        auto ip = service->ipAddress();
        auto ip = service->ipAddress();
        auto port = service->port();
        auto port = service->port();


        if (wanted_service_name == "") {
        if (wanted_service_name == "") {
            cb(service_name.c_str(), ip.c_str(), port);
            cb(service_name.c_str(), reg_type.c_str(), ip.c_str(), port);
        } else if (service_name == wanted_service_name) {
        } else if (service_name == wanted_service_name) {
            cb(service_name.c_str(), ip.c_str(), port);
            cb(service_name.c_str(), reg_type.c_str(), ip.c_str(), port);
        }
        }
    }
    }
}
}
@@ -301,7 +316,7 @@ void ResolvedService::forEachService(const ServiceRegistry& services,
// static
// static
bool ResolvedService::connectByServiceName(const ServiceRegistry& services,
bool ResolvedService::connectByServiceName(const ServiceRegistry& services,
                                           const std::string& service_name) {
                                           const std::string& service_name) {
    initAdbSecure();
    initAdbServiceRegistries();
    for (auto service : services) {
    for (auto service : services) {
        if (service_name == service->serviceName()) {
        if (service_name == service->serviceName()) {
            D("Got service_name match [%s]", service->serviceName().c_str());
            D("Got service_name match [%s]", service->serviceName().c_str());
@@ -398,6 +413,9 @@ static void adb_RemoveDNSService(const char* regType, const char* serviceName) {
    int index = adb_DNSServiceIndexByName(regType);
    int index = adb_DNSServiceIndexByName(regType);
    ResolvedService::ServiceRegistry* services;
    ResolvedService::ServiceRegistry* services;
    switch (index) {
    switch (index) {
        case kADBTransportServiceRefIndex:
            services = ResolvedService::sAdbTransportServices;
            break;
        case kADBSecurePairingServiceRefIndex:
        case kADBSecurePairingServiceRefIndex:
            services = ResolvedService::sAdbSecurePairingServices;
            services = ResolvedService::sAdbSecurePairingServices;
            break;
            break;
@@ -542,7 +560,7 @@ void init_mdns_transport_discovery_thread(void) {
}
}


void init_mdns_transport_discovery(void) {
void init_mdns_transport_discovery(void) {
    ResolvedService::initAdbSecure();
    ResolvedService::initAdbServiceRegistries();
    std::thread(init_mdns_transport_discovery_thread).detach();
    std::thread(init_mdns_transport_discovery_thread).detach();
}
}


@@ -559,3 +577,17 @@ std::string mdns_check() {
    result = android::base::StringPrintf("mdns daemon version [%u]", daemon_version);
    result = android::base::StringPrintf("mdns daemon version [%u]", daemon_version);
    return result;
    return result;
}
}

std::string mdns_list_discovered_services() {
    std::string result;
    auto cb = [&](const char* service_name, const char* reg_type, const char* ip_addr,
                  uint16_t port) {
        result += android::base::StringPrintf("%s\t%s\t%s:%u\n", service_name, reg_type, ip_addr,
                                              port);
    };

    ResolvedService::forEachService(*ResolvedService::sAdbTransportServices, "", cb);
    ResolvedService::forEachService(*ResolvedService::sAdbSecureConnectServices, "", cb);
    ResolvedService::forEachService(*ResolvedService::sAdbSecurePairingServices, "", cb);
    return result;
}
Loading