refactor: add tr_address::is_any() (#5398)

As suggested by @tearfur

Xref: https://github.com/transmission/transmission/pull/5329#discussion_r1166236165
This commit is contained in:
Charles Kerr 2023-04-15 19:30:20 -05:00 committed by GitHub
parent 6b230e753b
commit 3af9645615
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 19 additions and 23 deletions

View File

@ -217,7 +217,7 @@ tr_peer_socket tr_netOpenPeerSocket(tr_session* session, tr_address const& addr,
auto const [sock, addrlen] = addr.to_sockaddr(port);
// set source address
auto const [source_addr, is_any] = session->publicAddress(addr.type);
auto const source_addr = session->publicAddress(addr.type);
auto const [source_sock, sourcelen] = source_addr.to_sockaddr({});
if (bind(s, reinterpret_cast<sockaddr const*>(&source_sock), sourcelen) == -1)

View File

@ -305,6 +305,11 @@ struct tr_address
return type == TR_AF_INET || type == TR_AF_INET6;
}
[[nodiscard]] auto is_any() const noexcept
{
return *this == (is_ipv4() ? any_ipv4() : any_ipv6());
}
[[nodiscard]] bool is_valid_for_peers(tr_port port) const noexcept;
};

View File

@ -324,7 +324,7 @@ public:
if (session->allowsDHT() && io->supports_dht())
{
// only send PORT over IPv6 iff IPv6 DHT is running (BEP-32).
if (auto const [addr, is_any] = session->publicAddress(TR_AF_INET6); !is_any)
if (auto const addr = session->publicAddress(TR_AF_INET6); !addr.is_any())
{
protocolSendPort(this, session->udpPort());
}
@ -935,7 +935,7 @@ void sendLtepHandshake(tr_peerMsgsImpl* msgs)
tr_variantInitDict(&val, 8);
tr_variantDictAddBool(&val, TR_KEY_e, msgs->session->encryptionMode() != TR_CLEAR_PREFERRED);
if (auto const [addr, is_any] = msgs->session->publicAddress(TR_AF_INET6); !is_any)
if (auto const addr = msgs->session->publicAddress(TR_AF_INET6); !addr.is_any())
{
TR_ASSERT(addr.is_ipv6());
tr_variantDictAddRaw(&val, TR_KEY_ipv6, &addr.addr.addr6, sizeof(addr.addr.addr6));

View File

@ -303,7 +303,7 @@ std::optional<std::string_view> tr_session::WebMediator::userAgent() const
std::optional<std::string> tr_session::WebMediator::publicAddressV4() const
{
if (auto const [addr, is_any] = session_->publicAddress(TR_AF_INET); !is_any)
if (auto const addr = session_->publicAddress(TR_AF_INET); !addr.is_any())
{
return addr.display_name();
}
@ -313,7 +313,7 @@ std::optional<std::string> tr_session::WebMediator::publicAddressV4() const
std::optional<std::string> tr_session::WebMediator::publicAddressV6() const
{
if (auto const [addr, is_any] = session_->publicAddress(TR_AF_INET6); !is_any)
if (auto const addr = session_->publicAddress(TR_AF_INET6); !addr.is_any())
{
return addr.display_name();
}
@ -417,15 +417,13 @@ tr_session::BoundSocket::~BoundSocket()
}
}
tr_session::PublicAddressResult tr_session::publicAddress(tr_address_type type) const noexcept
tr_address tr_session::publicAddress(tr_address_type type) const noexcept
{
if (type == TR_AF_INET)
{
// if user provided an address, use it.
// otherwise, use any_ipv4 (0.0.0.0).
static auto constexpr DefaultAddr = tr_address::any_ipv4();
auto addr = tr_address::from_string(settings_.bind_address_ipv4).value_or(DefaultAddr);
return { addr, addr == DefaultAddr };
return tr_address::from_string(settings_.bind_address_ipv4).value_or(tr_address::any_ipv4());
}
if (type == TR_AF_INET6)
@ -435,8 +433,7 @@ tr_session::PublicAddressResult tr_session::publicAddress(tr_address_type type)
// otherwise, use any_ipv6 (::).
static auto constexpr AnyAddr = tr_address::any_ipv6();
auto const default_addr = tr_globalIPv6().value_or(AnyAddr);
auto addr = tr_address::from_string(settings_.bind_address_ipv6).value_or(default_addr);
return { addr, addr == AnyAddr };
return tr_address::from_string(settings_.bind_address_ipv6).value_or(default_addr);
}
TR_ASSERT_MSG(false, "invalid type");
@ -727,14 +724,14 @@ void tr_session::setSettings(tr_session_settings&& settings_in, bool force)
{
if (auto const& val = new_settings.bind_address_ipv4; force || port_changed || val != old_settings.bind_address_ipv4)
{
auto const [addr, is_default] = publicAddress(TR_AF_INET);
auto const addr = publicAddress(TR_AF_INET);
bound_ipv4_.emplace(eventBase(), addr, local_peer_port_, &tr_session::onIncomingPeerConnection, this);
addr_changed = true;
}
if (auto const& val = new_settings.bind_address_ipv6; force || port_changed || val != old_settings.bind_address_ipv6)
{
auto const [addr, is_default] = publicAddress(TR_AF_INET6);
auto const addr = publicAddress(TR_AF_INET6);
bound_ipv6_.emplace(eventBase(), addr, local_peer_port_, &tr_session::onIncomingPeerConnection, this);
addr_changed = true;
}

View File

@ -193,7 +193,7 @@ private:
[[nodiscard]] tr_address incomingPeerAddress() const override
{
return session_.publicAddress(TR_AF_INET).address;
return session_.publicAddress(TR_AF_INET);
}
[[nodiscard]] tr_port localPeerPort() const override
@ -777,13 +777,7 @@ public:
[[nodiscard]] bool addressIsBlocked(tr_address const& addr) const noexcept;
struct PublicAddressResult
{
tr_address address;
bool is_any_addr;
};
[[nodiscard]] PublicAddressResult publicAddress(tr_address_type type) const noexcept;
[[nodiscard]] tr_address publicAddress(tr_address_type type) const noexcept;
[[nodiscard]] constexpr auto speedLimitKBps(tr_direction dir) const noexcept
{

View File

@ -150,7 +150,7 @@ tr_session::tr_udp_core::tr_udp_core(tr_session& session, tr_port udp_port)
auto optval = int{ 1 };
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, reinterpret_cast<char const*>(&optval), sizeof(optval));
auto const [addr, is_any] = session_.publicAddress(TR_AF_INET);
auto const addr = session_.publicAddress(TR_AF_INET);
auto const [ss, sslen] = addr.to_sockaddr(udp_port_);
if (bind(sock, reinterpret_cast<sockaddr const*>(&ss), sslen) != 0)
@ -184,7 +184,7 @@ tr_session::tr_udp_core::tr_udp_core(tr_session& session, tr_port udp_port)
auto optval = int{ 1 };
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, reinterpret_cast<char const*>(&optval), sizeof(optval));
auto const [addr, is_any] = session_.publicAddress(TR_AF_INET6);
auto const addr = session_.publicAddress(TR_AF_INET6);
auto const [ss, sslen] = addr.to_sockaddr(udp_port_);
if (bind(sock, reinterpret_cast<sockaddr const*>(&ss), sslen) != 0)