mirror of
https://github.com/transmission/transmission.git
synced 2025-12-20 02:18:42 +00:00
refactor: replace all evutil_make_listen_socket_ipv6only usages (#7779)
This commit is contained in:
@@ -99,6 +99,15 @@ tr_address_type tr_af_to_ip_protocol(int af)
|
||||
}
|
||||
}
|
||||
|
||||
int tr_make_listen_socket_ipv6only(tr_socket_t const sock)
|
||||
{
|
||||
#if defined(IPV6_V6ONLY)
|
||||
int optval = 1;
|
||||
return setsockopt(sock, IPPROTO_IPV6, IPV6_V6ONLY, reinterpret_cast<char const*>(&optval), sizeof(optval));
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
// - TCP Sockets
|
||||
|
||||
[[nodiscard]] std::optional<tr_tos_t> tr_tos_t::from_string(std::string_view name)
|
||||
@@ -325,17 +334,13 @@ tr_socket_t tr_netBindTCPImpl(tr_address const& addr, tr_port port, bool suppres
|
||||
(void)setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, reinterpret_cast<char const*>(&optval), sizeof(optval));
|
||||
(void)evutil_make_listen_socket_reuseable(fd);
|
||||
|
||||
#ifdef IPV6_V6ONLY
|
||||
// TODO(tearfur): Consider using `evutil_make_listen_socket_ipv6only` once minimum libevent version is bumped to 2.1.9 or above
|
||||
if (addr.is_ipv6() &&
|
||||
setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, reinterpret_cast<char const*>(&optval), sizeof(optval)) == -1 &&
|
||||
if (addr.is_ipv6() && tr_make_listen_socket_ipv6only(fd) == -1 &&
|
||||
sockerrno != ENOPROTOOPT) // if the kernel doesn't support it, ignore it
|
||||
{
|
||||
*err_out = sockerrno;
|
||||
tr_net_close_socket(fd);
|
||||
return TR_BAD_SOCKET;
|
||||
}
|
||||
#endif
|
||||
|
||||
auto const [sock, addrlen] = tr_socket_address::to_sockaddr(addr, port);
|
||||
|
||||
|
||||
@@ -556,3 +556,5 @@ void tr_netSetTOS(tr_socket_t sock, int tos, tr_address_type type);
|
||||
* @param err an errno on Unix/Linux and an WSAError on win32)
|
||||
*/
|
||||
[[nodiscard]] std::string tr_net_strerror(int err);
|
||||
|
||||
[[nodiscard]] int tr_make_listen_socket_ipv6only(tr_socket_t sock);
|
||||
|
||||
@@ -335,7 +335,7 @@ private:
|
||||
if constexpr (ip_protocol == TR_AF_INET6)
|
||||
{
|
||||
// must be done before binding on Linux
|
||||
if (evutil_make_listen_socket_ipv6only(sock) == -1)
|
||||
if (tr_make_listen_socket_ipv6only(sock) == -1)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -213,7 +213,7 @@ tr_session::tr_udp_core::tr_udp_core(tr_session& session, tr_port udp_port)
|
||||
else if (auto sock = socket(PF_INET6, SOCK_DGRAM, 0); sock != TR_BAD_SOCKET)
|
||||
{
|
||||
(void)evutil_make_listen_socket_reuseable(sock);
|
||||
(void)evutil_make_listen_socket_ipv6only(sock);
|
||||
(void)tr_make_listen_socket_ipv6only(sock);
|
||||
|
||||
auto const addr = session_.bind_address(TR_AF_INET6);
|
||||
auto const [ss, sslen] = tr_socket_address::to_sockaddr(addr, udp_port_);
|
||||
|
||||
Reference in New Issue
Block a user