2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
42#include "net/in6/config/ConfigAddress.h"
44#include "net/config/ConfigAddressBase.hpp"
45#include "net/config/ConfigAddressLocal.hpp"
46#include "net/config/ConfigAddressRemote.hpp"
47#include "net/config/ConfigAddressReverse.hpp"
48#include "net/config/ConfigSection.hpp"
50#ifndef DOXYGEN_SHOULD_SKIP_THIS
52#include "core/system/netdb.h"
53#include "utils/PreserveErrno.h"
64 template <
template <
typename SocketAddress>
typename ConfigAddressType>
67 [[
maybe_unused]]
const std::string& addressOptionDescription)
69 , ConfigAddressType<net::in6::SocketAddress>(
this) {
72 "Suppress reverse host name lookup",
74 XSTR(IN6_NUMERIC_REVERSE),
75 CLI::IsMember({
"true",
"false"}));
78 template <
template <
typename SocketAddress>
typename ConfigAddressType>
80 SocketAddress::SockLen sockAddrLen) {
81 SocketAddress socketAddress;
84 }
catch ([[maybe_unused]]
const SocketAddress::
BadSocketAddress& badSocketAddress) {
86 socketAddress =
Super::getSocketAddress(sockAddr, sockAddrLen);
87 }
catch ([[maybe_unused]]
const SocketAddress::
BadSocketAddress& badSocketAddress) {
95 template <
template <
typename SocketAddress>
typename ConfigAddressType>
102 template <
template <
typename SocketAddress>
typename ConfigAddressType>
107 template <
template <
typename SocketAddress>
typename ConfigAddressType>
110 [[
maybe_unused]]
const std::string& addressOptionDescription)
112 , ConfigAddressType<net::in6::SocketAddress>(
this) {
115 "Host name or IPv6 address",
118 CLI::TypeValidator<std::string>());
125 CLI::Range(std::numeric_limits<uint16_t>::min(), std::numeric_limits<uint16_t>::max()));
129 "Suppress host name lookup",
132 CLI::IsMember({
"true",
"false"}));
136 "Suppress reverse host name lookup",
138 XSTR(IN6_NUMERIC_REVERSE),
139 CLI::IsMember({
"true",
"false"}));
143 "Resolve IPv4-mapped IPv6 addresses also",
145 XSTR(IN6_IPV4_MAPPED),
146 CLI::IsMember({
"true",
"false"}));
149 template <
template <
typename SocketAddress>
typename ConfigAddressType>
151 SocketAddress* socketAddress =
new SocketAddress
(hostOpt->as<std::string>()
, portOpt->as<uint16_t>()
);
154 socketAddress
->init({.aiFlags = (aiFlags & ~AI_NUMERICHOST) | (numericOpt->as<
bool>() ? AI_NUMERICHOST : 0),
155 .aiSockType = aiSockType,
156 .aiProtocol = aiProtocol});
158 delete socketAddress;
159 socketAddress =
nullptr;
164 return socketAddress;
167 template <
template <
typename SocketAddress>
typename ConfigAddressType>
169 SocketAddress::SockLen sockAddrLen) {
170 SocketAddress socketAddress;
173 }
catch ([[maybe_unused]]
const SocketAddress::
BadSocketAddress& badSocketAddress) {
175 socketAddress =
Super::getSocketAddress(sockAddr, sockAddrLen);
176 }
catch ([[maybe_unused]]
const SocketAddress::
BadSocketAddress& badSocketAddress) {
181 return socketAddress;
184 template <
template <
typename SocketAddress>
typename ConfigAddressType>
192 template <
template <
typename SocketAddress>
typename ConfigAddressType>
196 setDefaultValue(
hostOpt, ipOrHostname);
202 template <
template <
typename SocketAddress>
typename ConfigAddressType>
204 return hostOpt->as<std::string>();
207 template <
template <
typename SocketAddress>
typename ConfigAddressType>
211 setDefaultValue(
portOpt, port);
217 template <
template <
typename SocketAddress>
typename ConfigAddressType>
219 return portOpt->as<uint16_t>();
222 template <
template <
typename SocketAddress>
typename ConfigAddressType>
226 setDefaultValue(
numericOpt, numeric ?
"true" :
"false");
231 template <
template <
typename SocketAddress>
typename ConfigAddressType>
236 template <
template <
typename SocketAddressT>
typename ConfigAddressTypeT>
238 this->setConfigurable(
hostOpt, configurable);
239 this->setConfigurable(
portOpt, configurable);
242 template <
template <
typename SocketAddress>
typename ConfigAddressType>
251 template <
template <
typename SocketAddress>
typename ConfigAddressType>
255 setDefaultValue(
ipv4MappedOpt, ipv4Mapped ?
"true" :
"false");
260 template <
template <
typename SocketAddress>
typename ConfigAddressType>
265 template <
template <
typename SocketAddress>
typename ConfigAddressType>
272 template <
template <
typename SocketAddress>
typename ConfigAddressType>
277 template <
template <
typename SocketAddress>
typename ConfigAddressType>
284 template <
template <
typename SocketAddress>
typename ConfigAddressType>
289 template <
template <
typename SocketAddress>
typename ConfigAddressType>
296 template <
template <
typename SocketAddress>
typename ConfigAddressType>
301 template <
template <
typename SocketAddress>
typename ConfigAddressType>
303 this->required(
hostOpt, required);
308 template <
template <
typename SocketAddress>
typename ConfigAddressType>
310 this->required(
portOpt, required);
317template class net::config::ConfigAddress<net::in6::SocketAddress>;
318template class net::config::ConfigAddressLocal<net::in6::SocketAddress>;
319template class net::config::ConfigAddressRemote<net::in6::SocketAddress>;
320template class net::config::ConfigAddressReverse<net::in6::SocketAddress>;
321template class net::config::ConfigAddressBase<net::in6::SocketAddress>;
void init(const Hints &hints={.aiFlags=0,.aiSockType=0,.aiProtocol=0})
std::string getHost() const
SocketAddress(const std::string &ipOrHostname, uint16_t port)
SocketAddress(const SockAddr &sockAddr, SockLen sockAddrLen, bool numeric=true)
ConfigAddressReverse(net::config::ConfigInstance *instance, const std::string &addressOptionName, const std::string &addressOptionDescription)
CLI::Option * numericReverseOpt
ConfigAddressTypeT< SocketAddress > Super
ConfigAddressReverse & setNumericReverse(bool numeric=true)
SocketAddress getSocketAddress(const SocketAddress::SockAddr &sockAddr, SocketAddress::SockLen sockAddrLen)
bool getNumericReverse() const
ConfigAddress & setIpv4Mapped(bool ipv4Mapped=true)
ConfigAddress & setNumericReverse(bool numeric=true)
bool getIpv4Mapped() const
ConfigAddress & setAiFlags(int aiFlags)
CLI::Option * numericReverseOpt
ConfigAddress & setPortRequired(bool required=true)
SocketAddress getSocketAddress(const SocketAddress::SockAddr &sockAddr, SocketAddress::SockLen sockAddrLen)
ConfigAddress(net::config::ConfigInstance *instance, const std::string &addressOptionName, const std::string &addressOptionDescription)
ConfigAddress & setNumeric(bool numeric=true)
ConfigAddress & setPort(uint16_t port)
ConfigAddress & setSocketAddress(const SocketAddress &socketAddress)
int getAiProtocol() const
SocketAddress * init() final
ConfigAddress & setHost(const std::string &ipOrHostname)
ConfigAddressTypeT< SocketAddress > Super
ConfigAddress & setAiSockType(int aiSocktype)
ConfigAddress & setHostRequired(bool required=true)
std::string getHost() const
ConfigAddress & setAiProtocol(int aiProtocol)
CLI::Option * ipv4MappedOpt
void configurable(bool configurable=true) final
int getAiSockType() const