uvw  2.12.1
dns.h
1 #ifndef UVW_DNS_INCLUDE_H
2 #define UVW_DNS_INCLUDE_H
3 
4 #include <memory>
5 #include <string>
6 #include <utility>
7 #include <uv.h>
8 #include "loop.h"
9 #include "request.hpp"
10 #include "util.h"
11 
12 namespace uvw {
13 
19 struct AddrInfoEvent {
20  using Deleter = void (*)(addrinfo *);
21 
22  AddrInfoEvent(std::unique_ptr<addrinfo, Deleter> addr);
23 
30  std::unique_ptr<addrinfo, Deleter> data;
31 };
32 
38 struct NameInfoEvent {
39  NameInfoEvent(const char *host, const char *serv);
40 
47  const char *hostname;
48 
55  const char *service;
56 };
57 
66 class GetAddrInfoReq final: public Request<GetAddrInfoReq, uv_getaddrinfo_t> {
67  static void addrInfoCallback(uv_getaddrinfo_t *req, int status, addrinfo *res);
68  void nodeAddrInfo(const char *node, const char *service, addrinfo *hints = nullptr);
69  auto nodeAddrInfoSync(const char *node, const char *service, addrinfo *hints = nullptr);
70 
71 public:
72  using Deleter = void (*)(addrinfo *);
73 
74  using Request::Request;
75 
82  void nodeAddrInfo(const std::string &node, addrinfo *hints = nullptr);
83 
95  std::pair<bool, std::unique_ptr<addrinfo, Deleter>> nodeAddrInfoSync(const std::string &node, addrinfo *hints = nullptr);
96 
103  void serviceAddrInfo(const std::string &service, addrinfo *hints = nullptr);
104 
116  std::pair<bool, std::unique_ptr<addrinfo, Deleter>> serviceAddrInfoSync(const std::string &service, addrinfo *hints = nullptr);
117 
125  void addrInfo(const std::string &node, const std::string &service, addrinfo *hints = nullptr);
126 
139  std::pair<bool, std::unique_ptr<addrinfo, Deleter>> addrInfoSync(const std::string &node, const std::string &service, addrinfo *hints = nullptr);
140 };
141 
150 class GetNameInfoReq final: public Request<GetNameInfoReq, uv_getnameinfo_t> {
151  static void nameInfoCallback(uv_getnameinfo_t *req, int status, const char *hostname, const char *service);
152 
153 public:
154  using Request::Request;
155 
161  void nameInfo(const sockaddr &addr, int flags = 0);
162 
169  template<typename I = IPv4>
170  void nameInfo(const std::string &ip, unsigned int port, int flags = 0);
171 
177  template<typename I = IPv4>
178  void nameInfo(Addr addr, int flags = 0);
179 
192  std::pair<bool, std::pair<const char *, const char *>> nameInfoSync(const sockaddr &addr, int flags = 0);
193 
207  template<typename I = IPv4>
208  std::pair<bool, std::pair<const char *, const char *>> nameInfoSync(const std::string &ip, unsigned int port, int flags = 0);
209 
222  template<typename I = IPv4>
223  std::pair<bool, std::pair<const char *, const char *>> nameInfoSync(Addr addr, int flags = 0);
224 };
225 
231 // (extern) explicit instantiations
232 #ifdef UVW_AS_LIB
233 extern template void GetNameInfoReq::nameInfo<IPv4>(const std::string &, unsigned int, int);
234 extern template void GetNameInfoReq::nameInfo<IPv6>(const std::string &, unsigned int, int);
235 
236 extern template void GetNameInfoReq::nameInfo<IPv4>(Addr, int);
237 extern template void GetNameInfoReq::nameInfo<IPv6>(Addr, int);
238 
239 extern template std::pair<bool, std::pair<const char *, const char *>> GetNameInfoReq::nameInfoSync<IPv4>(const std::string &, unsigned int, int);
240 extern template std::pair<bool, std::pair<const char *, const char *>> GetNameInfoReq::nameInfoSync<IPv6>(const std::string &, unsigned int, int);
241 
242 extern template std::pair<bool, std::pair<const char *, const char *>> GetNameInfoReq::nameInfoSync<IPv4>(Addr, int);
243 extern template std::pair<bool, std::pair<const char *, const char *>> GetNameInfoReq::nameInfoSync<IPv6>(Addr, int);
244 #endif // UVW_AS_LIB
245 
251 } // namespace uvw
252 
253 #ifndef UVW_AS_LIB
254 # include "dns.cpp"
255 #endif
256 
257 #endif // UVW_DNS_INCLUDE_H
The GetAddrInfoReq request.
Definition: dns.h:66
void addrInfo(const std::string &node, const std::string &service, addrinfo *hints=nullptr)
Async getaddrinfo.
std::pair< bool, std::unique_ptr< addrinfo, Deleter > > addrInfoSync(const std::string &node, const std::string &service, addrinfo *hints=nullptr)
Sync getaddrinfo.
std::pair< bool, std::unique_ptr< addrinfo, Deleter > > nodeAddrInfoSync(const std::string &node, addrinfo *hints=nullptr)
Sync getaddrinfo.
void serviceAddrInfo(const std::string &service, addrinfo *hints=nullptr)
Async getaddrinfo.
void nodeAddrInfo(const std::string &node, addrinfo *hints=nullptr)
Async getaddrinfo.
std::pair< bool, std::unique_ptr< addrinfo, Deleter > > serviceAddrInfoSync(const std::string &service, addrinfo *hints=nullptr)
Sync getaddrinfo.
The GetNameInfoReq request.
Definition: dns.h:150
std::pair< bool, std::pair< const char *, const char * > > nameInfoSync(Addr addr, int flags=0)
Sync getnameinfo.
void nameInfo(Addr addr, int flags=0)
Async getnameinfo.
std::pair< bool, std::pair< const char *, const char * > > nameInfoSync(const sockaddr &addr, int flags=0)
Sync getnameinfo.
void nameInfo(const sockaddr &addr, int flags=0)
Async getnameinfo.
void nameInfo(const std::string &ip, unsigned int port, int flags=0)
Async getnameinfo.
std::pair< bool, std::pair< const char *, const char * > > nameInfoSync(const std::string &ip, unsigned int port, int flags=0)
Sync getnameinfo.
Request base class.
Definition: request.hpp:18
uvw default namespace.
Definition: async.h:8
AddrInfoEvent event.
Definition: dns.h:19
std::unique_ptr< addrinfo, Deleter > data
An initialized instance of addrinfo.
Definition: dns.h:30
Address representation.
Definition: util.h:332
NameInfoEvent event.
Definition: dns.h:38
const char * service
A valid service name.
Definition: dns.h:55
const char * hostname
A valid hostname.
Definition: dns.h:47