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
|
// - TCP Sockets
|
||||||
|
|
||||||
[[nodiscard]] std::optional<tr_tos_t> tr_tos_t::from_string(std::string_view name)
|
[[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)setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, reinterpret_cast<char const*>(&optval), sizeof(optval));
|
||||||
(void)evutil_make_listen_socket_reuseable(fd);
|
(void)evutil_make_listen_socket_reuseable(fd);
|
||||||
|
|
||||||
#ifdef IPV6_V6ONLY
|
if (addr.is_ipv6() && tr_make_listen_socket_ipv6only(fd) == -1 &&
|
||||||
// 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 &&
|
|
||||||
sockerrno != ENOPROTOOPT) // if the kernel doesn't support it, ignore it
|
sockerrno != ENOPROTOOPT) // if the kernel doesn't support it, ignore it
|
||||||
{
|
{
|
||||||
*err_out = sockerrno;
|
*err_out = sockerrno;
|
||||||
tr_net_close_socket(fd);
|
tr_net_close_socket(fd);
|
||||||
return TR_BAD_SOCKET;
|
return TR_BAD_SOCKET;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
auto const [sock, addrlen] = tr_socket_address::to_sockaddr(addr, port);
|
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)
|
* @param err an errno on Unix/Linux and an WSAError on win32)
|
||||||
*/
|
*/
|
||||||
[[nodiscard]] std::string tr_net_strerror(int err);
|
[[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)
|
if constexpr (ip_protocol == TR_AF_INET6)
|
||||||
{
|
{
|
||||||
// must be done before binding on Linux
|
// 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;
|
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)
|
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_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 addr = session_.bind_address(TR_AF_INET6);
|
||||||
auto const [ss, sslen] = tr_socket_address::to_sockaddr(addr, udp_port_);
|
auto const [ss, sslen] = tr_socket_address::to_sockaddr(addr, udp_port_);
|
||||||
|
|||||||
Reference in New Issue
Block a user