14#include <fmt/format.h>
15#include <userver/utils/fmt_compat.hpp>
16#include <userver/utils/zstring_view.hpp>
18#include <userver/logging/log_helper_fwd.hpp>
20USERVER_NAMESPACE_BEGIN
27 using std::runtime_error::runtime_error;
40 "Your socket subsystem looks broken, please contact support chat."
48 Sockaddr()
noexcept { ::memset(&data_, 0,
sizeof(data_)); }
54 const auto* sockaddr =
reinterpret_cast<
const struct sockaddr*>(data);
55 const auto domain =
static_cast<
AddrDomain>(sockaddr->sa_family);
93 static_assert(
sizeof(T) <=
sizeof(data_),
"Invalid socket address type");
94 return reinterpret_cast<T*>(&data_);
100 template <
typename T>
101 const T*
As()
const {
102 static_assert(
sizeof(T) <=
sizeof(data_),
"Invalid socket address type");
103 return reinterpret_cast<
const T*>(&data_);
110 const struct sockaddr*
Data()
const {
return As<struct sockaddr
>(); }
116 socklen_t
Capacity()
const {
return sizeof(data_); }
139 const auto res = AddrlenImpl(domain);
142 throw AddrException(fmt::format(
"Unexpected address family {}",
static_cast<
int>(domain)));
149 static constexpr socklen_t AddrlenImpl(
AddrDomain domain)
noexcept {
152 return sizeof(
struct sockaddr);
154 return sizeof(
struct sockaddr_in);
156 return sizeof(
struct sockaddr_in6);
158 return sizeof(
struct sockaddr_un);
165 struct sockaddr sa_any;
166 struct sockaddr_in sa_inet;
167 struct sockaddr_in6 sa_inet6;
168 struct sockaddr_un sa_unix;
173logging::LogHelper& operator<<(logging::LogHelper&,
const Sockaddr&);
181struct fmt::formatter<USERVER_NAMESPACE::engine::
io::Sockaddr> {
182 static constexpr auto parse(format_parse_context&);
184 template <
typename FormatContext>
185 auto format(
const USERVER_NAMESPACE::engine::
io::Sockaddr& sa, FormatContext& ctx)
USERVER_FMT_CONST;
188inline constexpr auto fmt::formatter<USERVER_NAMESPACE::engine::
io::Sockaddr>::parse(format_parse_context& ctx) {
189 const auto* it = ctx.begin();
190 if (it != ctx.end() && *it !=
'}') {
191 throw format_error(
"invalid Sockaddr format");
196template <
typename FormatContext>
197inline auto fmt::formatter<USERVER_NAMESPACE::engine::
io::Sockaddr>::format(
198 const USERVER_NAMESPACE::engine::
io::Sockaddr& sa,