From bf53700f978658042e10c556be66bfec8e32470e Mon Sep 17 00:00:00 2001 From: Jari Sundell Date: Sat, 4 Oct 2025 13:24:08 +0200 Subject: [PATCH] Added 'network.bind_address.ipv{4,6}.set' commands. --- src/command_network.cc | 7 ++++++- src/core/manager.cc | 38 ++++++++++++++++++++++++++++++++++++++ src/core/manager.h | 2 ++ src/display/utils.cc | 2 +- src/main.cc | 4 ++++ 5 files changed, 51 insertions(+), 2 deletions(-) diff --git a/src/command_network.cc b/src/command_network.cc index f5e148c7..477d0087 100644 --- a/src/command_network.cc +++ b/src/command_network.cc @@ -214,8 +214,13 @@ initialize_command_network() { CMD2_ANY_VALUE_V ("network.receive_buffer.size.set", std::bind(&torrent::net::NetworkConfig::set_receive_buffer_size, network_config, std::placeholders::_2)); CMD2_ANY_STRING ("network.tos.set", std::bind(&apply_tos, std::placeholders::_2)); - CMD2_ANY ("network.bind_address", std::bind(&torrent::net::NetworkConfig::bind_address_str, network_config)); + CMD2_ANY ("network.bind_address", std::bind(&torrent::net::NetworkConfig::bind_address_best_match_str, network_config)); CMD2_ANY_STRING_V("network.bind_address.set", std::bind(&core::Manager::set_bind_address, control->core(), std::placeholders::_2)); + CMD2_ANY ("network.bind_address.ipv4", std::bind(&torrent::net::NetworkConfig::bind_inet_address_str, network_config)); + CMD2_ANY_STRING_V("network.bind_address.ipv4.set", std::bind(&core::Manager::set_bind_inet_address, control->core(), std::placeholders::_2)); + CMD2_ANY ("network.bind_address.ipv6", std::bind(&torrent::net::NetworkConfig::bind_inet6_address_str, network_config)); + CMD2_ANY_STRING_V("network.bind_address.ipv6.set", std::bind(&core::Manager::set_bind_inet6_address, control->core(), std::placeholders::_2)); + CMD2_ANY ("network.local_address", std::bind(&torrent::net::NetworkConfig::local_address_str, network_config)); CMD2_ANY_STRING_V("network.local_address.set", std::bind(&core::Manager::set_local_address, control->core(), std::placeholders::_2)); CMD2_ANY ("network.proxy_address", std::bind(&torrent::net::NetworkConfig::proxy_address_str, network_config)); diff --git a/src/core/manager.cc b/src/core/manager.cc index 583e0704..ff968f58 100644 --- a/src/core/manager.cc +++ b/src/core/manager.cc @@ -216,6 +216,44 @@ Manager::set_bind_address(const std::string& addr) { } } +void +Manager::set_bind_inet_address(const std::string& addr) { + int err; + rak::address_info* ai; + + if ((err = rak::address_info::get_address_info(addr.c_str(), PF_INET, SOCK_STREAM, &ai)) != 0) + throw torrent::input_error("Could not set bind inet6 address: " + std::string(rak::address_info::strerror(err)) + "."); + + try { + torrent::config::network_config()->set_bind_inet_address(ai->c_addrinfo()->ai_addr); + + rak::address_info::free_address_info(ai); + + } catch (torrent::input_error& e) { + rak::address_info::free_address_info(ai); + throw e; + } +} + +void +Manager::set_bind_inet6_address(const std::string& addr) { + int err; + rak::address_info* ai; + + if ((err = rak::address_info::get_address_info(addr.c_str(), PF_INET6, SOCK_STREAM, &ai)) != 0) + throw torrent::input_error("Could not set bind inet6 address: " + std::string(rak::address_info::strerror(err)) + "."); + + try { + torrent::config::network_config()->set_bind_inet6_address(ai->c_addrinfo()->ai_addr); + + rak::address_info::free_address_info(ai); + + } catch (torrent::input_error& e) { + rak::address_info::free_address_info(ai); + throw e; + } +} + void Manager::set_local_address(const std::string& addr) { int err; diff --git a/src/core/manager.h b/src/core/manager.h index 0a3c313d..ea3d2947 100644 --- a/src/core/manager.h +++ b/src/core/manager.h @@ -62,6 +62,8 @@ public: void listen_open(); void set_bind_address(const std::string& addr); + void set_bind_inet_address(const std::string& addr); + void set_bind_inet6_address(const std::string& addr); void set_local_address(const std::string& addr); void set_proxy_address(const std::string& addr); diff --git a/src/display/utils.cc b/src/display/utils.cc index 76fc34bf..384c3e36 100644 --- a/src/display/utils.cc +++ b/src/display/utils.cc @@ -388,7 +388,7 @@ print_status_info(char* first, char* last) { if (first > last) throw torrent::internal_error("print_status_info(...) wrote past end of the buffer."); - auto bind_address = torrent::config::network_config()->bind_address(); + auto bind_address = torrent::config::network_config()->bind_address_best_match(); if (!torrent::sa_is_any(bind_address.get())) { first = print_buffer(first, last, " [Bind "); diff --git a/src/main.cc b/src/main.cc index c09fb215..cbf011ac 100644 --- a/src/main.cc +++ b/src/main.cc @@ -497,6 +497,8 @@ main(int argc, char** argv) { lt_log_print_dump(torrent::LOG_CRITICAL, e.backtrace().c_str(), e.backtrace().size(), "Caught internal_error: '%s'.", e.what()); + + torrent::log_cleanup(); return -1; } catch (std::exception& e) { @@ -505,6 +507,8 @@ main(int argc, char** argv) { std::cout << "rtorrent: caught" << typeid(e).name() << " : " << e.what() << std::endl; lt_log_print(torrent::LOG_CRITICAL, "Caught exception: '%s'.", e.what()); + + torrent::log_cleanup(); return -1; }