14#include <fmt/format.h>
15#include <userver/utils/fmt_compat.hpp>
17#include <userver/logging/log_helper_fwd.hpp>
19USERVER_NAMESPACE_BEGIN
26 using std::runtime_error::runtime_error;
39 "Your socket subsystem looks broken, please contact support chat."
47 Sockaddr()
noexcept { ::memset(&data_, 0,
sizeof(data_)); }
53 const auto* sockaddr =
reinterpret_cast<
const struct sockaddr*>(data);
54 const auto domain =
static_cast<
AddrDomain>(sockaddr->sa_family);
77 static_assert(
sizeof(T) <=
sizeof(data_),
"Invalid socket address type");
78 return reinterpret_cast<T*>(&data_);
86 static_assert(
sizeof(T) <=
sizeof(data_),
"Invalid socket address type");
87 return reinterpret_cast<
const T*>(&data_);
91 struct sockaddr*
Data() {
return As<struct sockaddr
>(); }
94 const struct sockaddr*
Data()
const {
return As<struct sockaddr
>(); }
100 socklen_t
Capacity()
const {
return sizeof(data_); }
123 const auto res = AddrlenImpl(domain);
126 throw AddrException(fmt::format(
"Unexpected address family {}",
static_cast<
int>(domain)));
133 static constexpr socklen_t AddrlenImpl(
AddrDomain domain)
noexcept {
136 return sizeof(
struct sockaddr);
138 return sizeof(
struct sockaddr_in);
140 return sizeof(
struct sockaddr_in6);
142 return sizeof(
struct sockaddr_un);
149 struct sockaddr sa_any;
150 struct sockaddr_in sa_inet;
151 struct sockaddr_in6 sa_inet6;
152 struct sockaddr_un sa_unix;
165struct fmt::formatter<USERVER_NAMESPACE::engine::
io::Sockaddr> {
166 static constexpr auto parse(format_parse_context&);
168 template <
typename FormatContext>
169 auto format(
const USERVER_NAMESPACE::engine::
io::Sockaddr& sa, FormatContext& ctx)
USERVER_FMT_CONST;
172inline constexpr auto fmt::formatter<USERVER_NAMESPACE::engine::
io::Sockaddr>::parse(format_parse_context& ctx) {
173 const auto* it = ctx.begin();
174 if (it != ctx.end() && *it !=
'}') {
175 throw format_error(
"invalid Sockaddr format");
180template <
typename FormatContext>
181inline auto fmt::formatter<USERVER_NAMESPACE::engine::
io::Sockaddr>::format(
182 const USERVER_NAMESPACE::engine::
io::Sockaddr& sa,