xref: /aosp_15_r20/external/cronet/net/dns/address_info.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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