uvco 0.1
Loading...
Searching...
No Matches
name_resolution.h
Go to the documentation of this file.
1// uvco (c) 2023 Lewin Bormann. See LICENSE for specific terms.
2
3#pragma once
4
5#include <cstddef>
6#include <netdb.h>
7#include <netinet/in.h>
8#include <sys/socket.h>
9#include <uv.h>
10
13#include "uvco/run.h"
14
15#include <coroutine>
16#include <cstdint>
17#include <optional>
18#include <span>
19#include <string>
20#include <string_view>
21#include <variant>
22
23namespace uvco {
24
30
39 struct NtopHelper_;
40
41public:
42 constexpr static size_t ipv4Length = 4;
43 constexpr static size_t ipv6Length = 16;
44
45 AddressHandle() = default;
46 AddressHandle(const AddressHandle &) = default;
50 ~AddressHandle() = default;
51
52 AddressHandle(std::span<const uint8_t> ipv4_or_6, uint16_t port,
53 uint32_t v6scope = 0);
54 AddressHandle(uint32_t ipv4, uint16_t port);
55 AddressHandle(std::string_view ip, uint16_t port, uint32_t v6scope = 0);
56 explicit AddressHandle(const struct addrinfo *ai);
57 explicit AddressHandle(const struct sockaddr *sa);
58
59 // The address, formatted by `inet_ntop(3)`.
60 [[nodiscard]] std::string address() const {
61 return std::visit(NtopHelper_{}, addr_);
62 }
63 [[nodiscard]] uint16_t port() const;
65 int family() const;
68 [[nodiscard]] const struct sockaddr *sockaddr() const;
69
70 [[nodiscard]] std::string toString() const;
71
72private:
73 std::variant<struct sockaddr_in, struct sockaddr_in6> addr_;
74
76 struct NtopHelper_ {
77 static std::string operator()(const struct sockaddr_in &ipv4);
78 static std::string operator()(const struct sockaddr_in6 &ipv6);
79 static std::string ntop(int family, void *addr);
80 };
81};
82
84class Resolver {
85 struct AddrinfoAwaiter_;
86
87public:
89 explicit Resolver(const Loop &loop) : loop_{&loop} {}
90
92 Promise<AddressHandle> gai(std::string_view host, std::string_view port,
93 int af_hint = AF_UNSPEC);
96 Promise<AddressHandle> gai(std::string_view host, uint16_t port,
97 int af_hint = AF_UNSPEC);
98
99private:
100 const Loop *loop_;
101
102 static void onAddrinfo(uv_getaddrinfo_t *req, uv_status status,
103 struct addrinfo *result);
104
107 [[nodiscard]] bool await_ready() const { return false; }
108 bool await_suspend(std::coroutine_handle<> handle);
109
110 struct addrinfo *await_resume();
111
112 uv_getaddrinfo_t req_;
113 std::optional<struct addrinfo *> addrinfo_;
114 std::optional<int> status_;
115 std::optional<std::coroutine_handle<>> handle_;
116 };
117};
118
120
121} // namespace uvco
AddressHandle is a light-weight wrapper around a struct sockaddr_in(6), and is therefore cheap to cop...
Definition name_resolution.h:38
static constexpr size_t ipv4Length
Definition name_resolution.h:42
std::string address() const
Definition name_resolution.h:60
std::variant< struct sockaddr_in, struct sockaddr_in6 > addr_
Definition name_resolution.h:73
AddressHandle(AddressHandle &&)=default
int family() const
Family is either AF_INET or AF_INET6.
Definition name_resolution.cc:76
const struct sockaddr * sockaddr() const
Definition name_resolution.cc:83
AddressHandle(const AddressHandle &)=default
std::string toString() const
Definition name_resolution.cc:58
uint16_t port() const
Definition name_resolution.cc:67
AddressHandle & operator=(AddressHandle &&)=default
static constexpr size_t ipv6Length
Definition name_resolution.h:43
~AddressHandle()=default
AddressHandle()=default
AddressHandle & operator=(const AddressHandle &)=default
Definition loop.h:26
Definition promise.h:76
Asynchronous name resolution using the libuv getaddrinfo(3) interface.
Definition name_resolution.h:84
Resolver(const Loop &loop)
Instantiate a resolver based on an event loop.
Definition name_resolution.h:89
const Loop * loop_
Definition name_resolution.h:100
Promise< AddressHandle > gai(std::string_view host, std::string_view port, int af_hint=AF_UNSPEC)
Resolve a host and port string. Throws an UvcoException upon error.
Definition name_resolution.cc:153
static void onAddrinfo(uv_getaddrinfo_t *req, uv_status status, struct addrinfo *result)
Definition name_resolution.cc:177
int uv_status
Result of a libuv operation, an errno error code.
Definition internal_utils.h:22
Definition async_work.cc:17
A helper for calling inet_ntop(3).
Definition name_resolution.h:76
static std::string operator()(const struct sockaddr_in &ipv4)
Definition name_resolution.cc:217
static std::string ntop(int family, void *addr)
Definition name_resolution.cc:196
Definition name_resolution.h:105
bool await_ready() const
Definition name_resolution.h:107
AddrinfoAwaiter_()
Definition name_resolution.h:106
std::optional< int > status_
Definition name_resolution.h:114
std::optional< std::coroutine_handle<> > handle_
Definition name_resolution.h:115
struct addrinfo * await_resume()
Definition name_resolution.cc:186
std::optional< struct addrinfo * > addrinfo_
Definition name_resolution.h:113
uv_getaddrinfo_t req_
Definition name_resolution.h:112
bool await_suspend(std::coroutine_handle<> handle)
Definition name_resolution.cc:191