/* * Copyright (C) 2015-present ScyllaDB */ /* * SPDX-License-Identifier: AGPL-3.0-or-later */ #pragma once #include #include #include #include #include #include #include #include "bytes.hh" namespace gms { class inet_address { private: net::inet_address _addr; public: inet_address() = default; explicit inet_address(int32_t ip) noexcept : inet_address(uint32_t(ip)) { } explicit inet_address(uint32_t ip) noexcept : _addr(net::ipv4_address(ip)) { } inet_address(const net::inet_address& addr) noexcept : _addr(addr) {} inet_address(const socket_address& sa) noexcept : inet_address(sa.addr()) {} const net::inet_address& addr() const noexcept { return _addr; } inet_address(const inet_address&) = default; operator const seastar::net::inet_address&() const noexcept { return _addr; } // throws std::invalid_argument if sstring is invalid explicit inet_address(const sstring& addr) { // FIXME: We need a real DNS resolver if (addr == "localhost") { _addr = net::ipv4_address("127.0.0.1"); } else { _addr = net::inet_address(addr); } } bytes_view bytes() const noexcept { return bytes_view(reinterpret_cast(_addr.data()), _addr.size()); } // TODO remove uint32_t raw_addr() const { return addr().as_ipv4_address().ip; } friend inline bool operator==(const inet_address& x, const inet_address& y) noexcept = default; friend inline bool operator<(const inet_address& x, const inet_address& y) noexcept { return x.bytes() < y.bytes(); } friend struct std::hash; using opt_family = std::optional; static future lookup(sstring, opt_family family = {}, opt_family preferred = {}); }; std::ostream& operator<<(std::ostream& os, const inet_address& x); } namespace std { template<> struct hash { size_t operator()(gms::inet_address a) const noexcept { return std::hash()(a._addr); } }; } template <> struct fmt::formatter : fmt::formatter { template auto format(const ::gms::inet_address& x, FormatContext& ctx) const { return fmt::format_to(ctx.out(), "{}", x.addr()); } };