1*6777b538SAndroid Build Coastguard Worker // Copyright 2019 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef NET_DNS_ADDRESS_INFO_H_ 6*6777b538SAndroid Build Coastguard Worker #define NET_DNS_ADDRESS_INFO_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <memory> 9*6777b538SAndroid Build Coastguard Worker #include <optional> 10*6777b538SAndroid Build Coastguard Worker #include <string> 11*6777b538SAndroid Build Coastguard Worker #include <tuple> 12*6777b538SAndroid Build Coastguard Worker 13*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h" 14*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h" 15*6777b538SAndroid Build Coastguard Worker #include "net/base/address_family.h" 16*6777b538SAndroid Build Coastguard Worker #include "net/base/net_export.h" 17*6777b538SAndroid Build Coastguard Worker #include "net/base/network_handle.h" 18*6777b538SAndroid Build Coastguard Worker #include "net/base/sys_addrinfo.h" 19*6777b538SAndroid Build Coastguard Worker 20*6777b538SAndroid Build Coastguard Worker namespace net { 21*6777b538SAndroid Build Coastguard Worker 22*6777b538SAndroid Build Coastguard Worker class AddressList; 23*6777b538SAndroid Build Coastguard Worker class AddrInfoGetter; 24*6777b538SAndroid Build Coastguard Worker 25*6777b538SAndroid Build Coastguard Worker using FreeAddrInfoFunc = void (*)(addrinfo*); 26*6777b538SAndroid Build Coastguard Worker 27*6777b538SAndroid Build Coastguard Worker // AddressInfo -- this encapsulates the system call to getaddrinfo and the 28*6777b538SAndroid Build Coastguard Worker // data structure that it populates and returns. 29*6777b538SAndroid Build Coastguard Worker class NET_EXPORT_PRIVATE AddressInfo { 30*6777b538SAndroid Build Coastguard Worker public: 31*6777b538SAndroid Build Coastguard Worker // Types 32*6777b538SAndroid Build Coastguard Worker class NET_EXPORT_PRIVATE const_iterator { 33*6777b538SAndroid Build Coastguard Worker public: 34*6777b538SAndroid Build Coastguard Worker using iterator_category = std::forward_iterator_tag; 35*6777b538SAndroid Build Coastguard Worker using value_type = const addrinfo; 36*6777b538SAndroid Build Coastguard Worker using difference_type = std::ptrdiff_t; 37*6777b538SAndroid Build Coastguard Worker using pointer = const addrinfo*; 38*6777b538SAndroid Build Coastguard Worker using reference = const addrinfo&; 39*6777b538SAndroid Build Coastguard Worker 40*6777b538SAndroid Build Coastguard Worker const_iterator(const const_iterator& other) = default; 41*6777b538SAndroid Build Coastguard Worker explicit const_iterator(const addrinfo* ai); 42*6777b538SAndroid Build Coastguard Worker bool operator!=(const const_iterator& o) const; 43*6777b538SAndroid Build Coastguard Worker const_iterator& operator++(); // prefix 44*6777b538SAndroid Build Coastguard Worker const addrinfo* operator->() const; 45*6777b538SAndroid Build Coastguard Worker const addrinfo& operator*() const; 46*6777b538SAndroid Build Coastguard Worker 47*6777b538SAndroid Build Coastguard Worker private: 48*6777b538SAndroid Build Coastguard Worker // Owned by AddressInfo. 49*6777b538SAndroid Build Coastguard Worker raw_ptr<const addrinfo> ai_; 50*6777b538SAndroid Build Coastguard Worker }; 51*6777b538SAndroid Build Coastguard Worker 52*6777b538SAndroid Build Coastguard Worker // Constructors 53*6777b538SAndroid Build Coastguard Worker using AddressInfoAndResult = 54*6777b538SAndroid Build Coastguard Worker std::tuple<std::optional<AddressInfo>, int /* err */, int /* os_error */>; 55*6777b538SAndroid Build Coastguard Worker // Invokes AddrInfoGetter with provided `host` and `hints`. If `getter` is 56*6777b538SAndroid Build Coastguard Worker // null, the system's getaddrinfo will be invoked. (A non-null `getter` is 57*6777b538SAndroid Build Coastguard Worker // primarily for tests). 58*6777b538SAndroid Build Coastguard Worker // `network` is an optional parameter, when specified (!= 59*6777b538SAndroid Build Coastguard Worker // handles::kInvalidNetworkHandle) the lookup will be performed specifically 60*6777b538SAndroid Build Coastguard Worker // for `network` (currently only supported on Android platforms). 61*6777b538SAndroid Build Coastguard Worker static AddressInfoAndResult Get( 62*6777b538SAndroid Build Coastguard Worker const std::string& host, 63*6777b538SAndroid Build Coastguard Worker const addrinfo& hints, 64*6777b538SAndroid Build Coastguard Worker std::unique_ptr<AddrInfoGetter> getter = nullptr, 65*6777b538SAndroid Build Coastguard Worker handles::NetworkHandle network = handles::kInvalidNetworkHandle); 66*6777b538SAndroid Build Coastguard Worker 67*6777b538SAndroid Build Coastguard Worker AddressInfo(const AddressInfo&) = delete; 68*6777b538SAndroid Build Coastguard Worker AddressInfo& operator=(const AddressInfo&) = delete; 69*6777b538SAndroid Build Coastguard Worker 70*6777b538SAndroid Build Coastguard Worker AddressInfo(AddressInfo&& other); 71*6777b538SAndroid Build Coastguard Worker AddressInfo& operator=(AddressInfo&& other); 72*6777b538SAndroid Build Coastguard Worker 73*6777b538SAndroid Build Coastguard Worker ~AddressInfo(); 74*6777b538SAndroid Build Coastguard Worker 75*6777b538SAndroid Build Coastguard Worker // Accessors 76*6777b538SAndroid Build Coastguard Worker const_iterator begin() const; 77*6777b538SAndroid Build Coastguard Worker const_iterator end() const; 78*6777b538SAndroid Build Coastguard Worker 79*6777b538SAndroid Build Coastguard Worker // Methods 80*6777b538SAndroid Build Coastguard Worker std::optional<std::string> GetCanonicalName() const; 81*6777b538SAndroid Build Coastguard Worker bool IsAllLocalhostOfOneFamily() const; 82*6777b538SAndroid Build Coastguard Worker AddressList CreateAddressList() const; 83*6777b538SAndroid Build Coastguard Worker 84*6777b538SAndroid Build Coastguard Worker private: 85*6777b538SAndroid Build Coastguard Worker // Constructors 86*6777b538SAndroid Build Coastguard Worker AddressInfo(std::unique_ptr<addrinfo, FreeAddrInfoFunc> ai, 87*6777b538SAndroid Build Coastguard Worker std::unique_ptr<AddrInfoGetter> getter); 88*6777b538SAndroid Build Coastguard Worker 89*6777b538SAndroid Build Coastguard Worker // Data. 90*6777b538SAndroid Build Coastguard Worker std::unique_ptr<addrinfo, FreeAddrInfoFunc> 91*6777b538SAndroid Build Coastguard Worker ai_; // Never null (except after move) 92*6777b538SAndroid Build Coastguard Worker std::unique_ptr<AddrInfoGetter> getter_; 93*6777b538SAndroid Build Coastguard Worker }; 94*6777b538SAndroid Build Coastguard Worker 95*6777b538SAndroid Build Coastguard Worker // Encapsulates calls to getaddrinfo and freeaddrinfo for tests. 96*6777b538SAndroid Build Coastguard Worker class NET_EXPORT_PRIVATE AddrInfoGetter { 97*6777b538SAndroid Build Coastguard Worker public: 98*6777b538SAndroid Build Coastguard Worker AddrInfoGetter(); 99*6777b538SAndroid Build Coastguard Worker 100*6777b538SAndroid Build Coastguard Worker AddrInfoGetter(const AddrInfoGetter&) = delete; 101*6777b538SAndroid Build Coastguard Worker AddrInfoGetter& operator=(const AddrInfoGetter&) = delete; 102*6777b538SAndroid Build Coastguard Worker 103*6777b538SAndroid Build Coastguard Worker // Virtual for tests. 104*6777b538SAndroid Build Coastguard Worker virtual ~AddrInfoGetter(); 105*6777b538SAndroid Build Coastguard Worker virtual std::unique_ptr<addrinfo, FreeAddrInfoFunc> getaddrinfo( 106*6777b538SAndroid Build Coastguard Worker const std::string& host, 107*6777b538SAndroid Build Coastguard Worker const addrinfo* hints, 108*6777b538SAndroid Build Coastguard Worker int* out_os_error, 109*6777b538SAndroid Build Coastguard Worker handles::NetworkHandle network); 110*6777b538SAndroid Build Coastguard Worker }; 111*6777b538SAndroid Build Coastguard Worker 112*6777b538SAndroid Build Coastguard Worker } // namespace net 113*6777b538SAndroid Build Coastguard Worker 114*6777b538SAndroid Build Coastguard Worker #endif // NET_DNS_ADDRESS_INFO_H_ 115