uvw  1.3.0
dns.hpp
1 #pragma once
2 
3 
4 #include <utility>
5 #include <memory>
6 #include <string>
7 #include <uv.h>
8 #include "request.hpp"
9 #include "util.hpp"
10 #include "loop.hpp"
11 
12 
13 namespace uvw {
14 
15 
21 struct AddrInfoEvent {
22  using Deleter = void(*)(addrinfo *);
23 
24  AddrInfoEvent(std::unique_ptr<addrinfo, Deleter> addr)
25  : data{std::move(addr)}
26  {}
27 
34  std::unique_ptr<addrinfo, Deleter> data;
35 };
36 
37 
43 struct NameInfoEvent {
44  NameInfoEvent(const char *host, const char *serv)
45  : hostname{host}, service{serv}
46  {}
47 
54  const char * hostname;
55 
62  const char * service;
63 };
64 
65 
74 class GetAddrInfoReq final: public Request<GetAddrInfoReq, uv_getaddrinfo_t> {
75  static void addrInfoCallback(uv_getaddrinfo_t *req, int status, addrinfo *res) {
76  auto ptr = reserve(req);
77 
78  if(status) {
79  ptr->publish(ErrorEvent{status});
80  } else {
81  auto data = std::unique_ptr<addrinfo, void(*)(addrinfo *)>{
82  res, [](addrinfo *addr){ uv_freeaddrinfo(addr); }};
83 
84  ptr->publish(AddrInfoEvent{std::move(data)});
85  }
86  }
87 
88  void nodeAddrInfo(const char *node, const char *service, addrinfo *hints = nullptr) {
89  invoke(&uv_getaddrinfo, parent(), get(), &addrInfoCallback, node, service, hints);
90  }
91 
92  auto nodeAddrInfoSync(const char *node, const char *service, addrinfo *hints = nullptr) {
93  auto req = get();
94  auto err = uv_getaddrinfo(parent(), req, nullptr, node, service, hints);
95  auto data = std::unique_ptr<addrinfo, void(*)(addrinfo *)>{req->addrinfo, [](addrinfo *addr){ uv_freeaddrinfo(addr); }};
96  return std::make_pair(!err, std::move(data));
97  }
98 
99 public:
100  using Deleter = void(*)(addrinfo *);
101 
102  using Request::Request;
103 
110  void nodeAddrInfo(std::string node, addrinfo *hints = nullptr) {
111  nodeAddrInfo(node.data(), nullptr, hints);
112  }
113 
125  std::pair<bool, std::unique_ptr<addrinfo, Deleter>>
126  nodeAddrInfoSync(std::string node, addrinfo *hints = nullptr) {
127  return nodeAddrInfoSync(node.data(), nullptr, hints);
128  }
129 
136  void serviceAddrInfo(std::string service, addrinfo *hints = nullptr) {
137  nodeAddrInfo(nullptr, service.data(), hints);
138  }
139 
151  std::pair<bool, std::unique_ptr<addrinfo, Deleter>>
152  serviceAddrInfoSync(std::string service, addrinfo *hints = nullptr) {
153  return nodeAddrInfoSync(nullptr, service.data(), hints);
154  }
155 
163  void addrInfo(std::string node, std::string service, addrinfo *hints = nullptr) {
164  nodeAddrInfo(node.data(), service.data(), hints);
165  }
166 
179  std::pair<bool, std::unique_ptr<addrinfo, Deleter>>
180  addrInfoSync(std::string node, std::string service, addrinfo *hints = nullptr) {
181  return nodeAddrInfoSync(node.data(), service.data(), hints);
182  }
183 };
184 
185 
194 class GetNameInfoReq final: public Request<GetNameInfoReq, uv_getnameinfo_t> {
195  static void nameInfoCallback(uv_getnameinfo_t *req, int status, const char *hostname, const char *service) {
196  auto ptr = reserve(req);
197  if(status) { ptr->publish(ErrorEvent{status}); }
198  else { ptr->publish(NameInfoEvent{hostname, service}); }
199  }
200 
201 public:
202  using Request::Request;
203 
210  template<typename I = IPv4>
211  void nameInfo(std::string ip, unsigned int port, int flags = 0) {
212  typename details::IpTraits<I>::Type addr;
213  details::IpTraits<I>::addrFunc(ip.data(), port, &addr);
214  auto saddr = reinterpret_cast<const sockaddr *>(&addr);
215  invoke(&uv_getnameinfo, parent(), get(), &nameInfoCallback, saddr, flags);
216  }
217 
223  template<typename I = IPv4>
224  void nameInfo(Addr addr, int flags = 0) {
225  nameInfo<I>(addr.ip, addr.port, flags);
226  }
227 
241  template<typename I = IPv4>
242  std::pair<bool, std::pair<const char *, const char *>>
243  nameInfoSync(std::string ip, unsigned int port, int flags = 0) {
244  typename details::IpTraits<I>::Type addr;
245  details::IpTraits<I>::addrFunc(ip.data(), port, &addr);
246  auto req = get();
247  auto saddr = reinterpret_cast<const sockaddr *>(&addr);
248  auto err = uv_getnameinfo(parent(), req, nullptr, saddr, flags);
249  return std::make_pair(!err, std::make_pair(req->host, req->service));
250  }
251 
264  template<typename I = IPv4>
265  std::pair<bool, std::pair<const char *, const char *>>
266  nameInfoSync(Addr addr, int flags = 0) {
267  return nameInfoSync<I>(addr.ip, addr.port, flags);
268  }
269 };
270 
271 
272 }
Address representation.
Definition: util.hpp:286
std::unique_ptr< addrinfo, Deleter > data
An initialized instance of addrinfo.
Definition: dns.hpp:34
unsigned int port
Definition: util.hpp:288
std::string ip
Definition: util.hpp:287
NameInfoEvent event.
Definition: dns.hpp:43
void nodeAddrInfo(std::string node, addrinfo *hints=nullptr)
Async getaddrinfo.
Definition: dns.hpp:110
void nameInfo(std::string ip, unsigned int port, int flags=0)
Async getnameinfo.
Definition: dns.hpp:211
std::pair< bool, std::pair< const char *, const char * > > nameInfoSync(Addr addr, int flags=0)
Sync getnameinfo.
Definition: dns.hpp:266
The GetNameInfoReq request.
Definition: dns.hpp:194
std::pair< bool, std::unique_ptr< addrinfo, Deleter > > nodeAddrInfoSync(std::string node, addrinfo *hints=nullptr)
Sync getaddrinfo.
Definition: dns.hpp:126
void serviceAddrInfo(std::string service, addrinfo *hints=nullptr)
Async getaddrinfo.
Definition: dns.hpp:136
void addrInfo(std::string node, std::string service, addrinfo *hints=nullptr)
Async getaddrinfo.
Definition: dns.hpp:163
void nameInfo(Addr addr, int flags=0)
Async getnameinfo.
Definition: dns.hpp:224
std::pair< bool, std::unique_ptr< addrinfo, Deleter > > serviceAddrInfoSync(std::string service, addrinfo *hints=nullptr)
Sync getaddrinfo.
Definition: dns.hpp:152
const char * service
A valid service name.
Definition: dns.hpp:62
AddrInfoEvent event.
Definition: dns.hpp:21
The ErrorEvent event.
Definition: emitter.hpp:23
The GetAddrInfoReq request.
Definition: dns.hpp:74
std::pair< bool, std::unique_ptr< addrinfo, Deleter > > addrInfoSync(std::string node, std::string service, addrinfo *hints=nullptr)
Sync getaddrinfo.
Definition: dns.hpp:180
std::pair< bool, std::pair< const char *, const char * > > nameInfoSync(std::string ip, unsigned int port, int flags=0)
Sync getnameinfo.
Definition: dns.hpp:243
const char * hostname
A valid hostname.
Definition: dns.hpp:54
uvw default namespace.
Definition: async.hpp:11