diff --git a/scripts/checks.m4 b/scripts/checks.m4 index 9ce90dab..c3ff3af7 100644 --- a/scripts/checks.m4 +++ b/scripts/checks.m4 @@ -79,7 +79,7 @@ AC_DEFUN([TORRENT_WITHOUT_KQUEUE], [ AC_DEFUN([TORRENT_WITH_ADDRESS_SPACE], [ AC_ARG_WITH(address-space, - AS_HELP_STRING([--with-address-space=MB],[change the default address space size [[default=1024mb-or-32768mb]]]), + AS_HELP_STRING([--with-address-space=MB],[change the default address space size [default=1024mb-or-32768mb]]), [ if test ! -z $withval -a "$withval" != "yes" -a "$withval" != "no"; then AC_DEFINE_UNQUOTED(DEFAULT_ADDRESS_SPACE_SIZE, [$withval]) @@ -99,6 +99,43 @@ AC_DEFUN([TORRENT_WITH_ADDRESS_SPACE], [ ]) +AC_DEFUN([TORRENT_CHECK_ATOMIC], [ + AC_MSG_CHECKING([whether 64-bit atomic operations require -latomic]) + AC_LANG_PUSH(C++) + + AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include + #include ]], + [[std::atomic x(0); + return x.load();]])], + [ + AC_MSG_RESULT([no]) + ATOMIC_LIBS="" + ], + [ + save_LIBS="$LIBS" + LIBS="$LIBS -latomic" + + AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include + #include ]], + [[std::atomic x(0); + return x.load();]])], + [ + AC_MSG_RESULT([yes]) + ATOMIC_LIBS="-latomic" + ], + [ + AC_MSG_RESULT([unsupported]) + AC_MSG_ERROR([Compiler target lacks proper 64-bit atomic support.]) + ]) + + LIBS="$save_LIBS" + ]) + + AC_LANG_POP(C++) + AC_SUBST([ATOMIC_LIBS]) +]) + + AC_DEFUN([TORRENT_WITH_XMLRPC_C], [ AC_MSG_CHECKING(for XMLRPC-C) diff --git a/src/command_events.cc b/src/command_events.cc index 27ed37a9..0d594bd4 100644 --- a/src/command_events.cc +++ b/src/command_events.cc @@ -329,42 +329,40 @@ directory_watch_ready(const torrent::Object::list_type& args) { void initialize_command_events() { - CMD2_ANY_STRING ("on_ratio", std::bind(&apply_on_ratio, std::placeholders::_2)); + CMD2_ANY_STRING ("on_ratio", [](auto, auto& args) { return apply_on_ratio(args); }); - CMD2_ANY ("start_tied", std::bind(&apply_start_tied)); - CMD2_ANY ("stop_untied", std::bind(&apply_stop_untied)); - CMD2_ANY ("close_untied", std::bind(&apply_close_untied)); - CMD2_ANY ("remove_untied", std::bind(&apply_remove_untied)); + CMD2_ANY ("start_tied", [](auto, auto) { return apply_start_tied(); }); + CMD2_ANY ("stop_untied", [](auto, auto) { return apply_stop_untied(); }); + CMD2_ANY ("close_untied", [](auto, auto) { return apply_close_untied(); }); + CMD2_ANY ("remove_untied", [](auto, auto) { return apply_remove_untied(); }); - // TODO: Deprecate schedule2 in the future. - CMD2_ANY_LIST ("schedule", std::bind(&apply_schedule, std::placeholders::_2)); - CMD2_ANY_LIST ("schedule2", std::bind(&apply_schedule, std::placeholders::_2)); - CMD2_ANY_STRING_V("schedule.remove", std::bind(&rpc::CommandScheduler::erase_str, control->command_scheduler(), std::placeholders::_2)); - CMD2_ANY_STRING_V("schedule_remove2", std::bind(&rpc::CommandScheduler::erase_str, control->command_scheduler(), std::placeholders::_2)); + CMD2_ANY_LIST ("schedule", [](auto, auto& args) { return apply_schedule(args); }); + CMD2_ANY_STRING_V("schedule.remove", [](auto, auto& str) { return control->command_scheduler()->erase_str(str); }); - CMD2_ANY_STRING_V("import", std::bind(&apply_import, std::placeholders::_2)); - CMD2_ANY_STRING_V("try_import", std::bind(&apply_try_import, std::placeholders::_2)); + CMD2_ANY_STRING_V("import", [](auto, auto& str) { return apply_import(str); }); + CMD2_ANY_STRING_V("try_import", [](auto, auto& str) { return apply_try_import(str); }); - CMD2_ANY_LIST ("load.normal", std::bind(&apply_load, std::placeholders::_2, core::Manager::create_quiet | core::Manager::create_tied)); - CMD2_ANY_LIST ("load.verbose", std::bind(&apply_load, std::placeholders::_2, core::Manager::create_tied)); - CMD2_ANY_LIST ("load.start", std::bind(&apply_load, std::placeholders::_2, - core::Manager::create_quiet | core::Manager::create_tied | core::Manager::create_start)); - CMD2_ANY_LIST ("load.start_verbose", std::bind(&apply_load, std::placeholders::_2, core::Manager::create_tied | core::Manager::create_start)); - CMD2_ANY_LIST ("load.raw", std::bind(&apply_load, std::placeholders::_2, core::Manager::create_quiet | core::Manager::create_raw_data)); - CMD2_ANY_LIST ("load.raw_verbose", std::bind(&apply_load, std::placeholders::_2, core::Manager::create_raw_data)); - CMD2_ANY_LIST ("load.raw_start", std::bind(&apply_load, std::placeholders::_2, - core::Manager::create_quiet | core::Manager::create_start | core::Manager::create_raw_data)); - CMD2_ANY_LIST ("load.raw_start_verbose", std::bind(&apply_load, std::placeholders::_2, core::Manager::create_start | core::Manager::create_raw_data)); + CMD2_ANY_LIST ("load.normal", [](auto, auto& args) { return apply_load(args, core::Manager::create_quiet | core::Manager::create_tied); }); + CMD2_ANY_LIST ("load.verbose", [](auto, auto& args) { return apply_load(args, core::Manager::create_tied); }); + CMD2_ANY_LIST ("load.start", [](auto, auto& args) { return apply_load(args, core::Manager::create_quiet | core::Manager::create_tied | core::Manager::create_start); }); + CMD2_ANY_LIST ("load.start_verbose", [](auto, auto& args) { return apply_load(args, core::Manager::create_tied | core::Manager::create_start); }); + CMD2_ANY_LIST ("load.raw", [](auto, auto& args) { return apply_load(args, core::Manager::create_quiet | core::Manager::create_raw_data); }); + CMD2_ANY_LIST ("load.raw_verbose", [](auto, auto& args) { return apply_load(args, core::Manager::create_raw_data); }); + CMD2_ANY_LIST ("load.raw_start", [](auto, auto& args) { return apply_load(args, core::Manager::create_quiet | core::Manager::create_start | core::Manager::create_raw_data); }); + CMD2_ANY_LIST ("load.raw_start_verbose", [](auto, auto& args) { return apply_load(args, core::Manager::create_start | core::Manager::create_raw_data); }); - CMD2_ANY_VALUE ("close_low_diskspace", std::bind(&apply_close_low_diskspace, std::placeholders::_2, 99)); - CMD2_ANY_VALUE ("close_low_diskspace.normal", std::bind(&apply_close_low_diskspace, std::placeholders::_2, 3)); + CMD2_ANY_VALUE ("close_low_diskspace", [](auto, auto& arg) { return apply_close_low_diskspace(arg, 99); }); + CMD2_ANY_VALUE ("close_low_diskspace.normal", [](auto, auto& arg) { return apply_close_low_diskspace(arg, 3); }); - CMD2_ANY_LIST ("download_list", std::bind(&apply_download_list, std::placeholders::_2)); - CMD2_ANY_LIST ("d.multicall2", std::bind(&d_multicall, std::placeholders::_2)); - CMD2_ANY_LIST ("d.multicall.filtered", std::bind(&d_multicall_filtered, std::placeholders::_2)); + CMD2_ANY_LIST ("download_list", [](auto, auto& args) { return apply_download_list(args); }); - CMD2_ANY_LIST ("directory.watch.added", std::bind(&directory_watch_added, std::placeholders::_2)); - CMD2_ANY_LIST ("directory.watch.ready", std::bind(&directory_watch_ready, std::placeholders::_2)); + // TODO: Deprecate d.multicall2. (6/2026) + CMD2_ANY_LIST ("d.multicall", [](auto, auto& args) { return d_multicall(args); }); + CMD2_ANY_LIST ("d.multicall2", [](auto, auto& args) { return d_multicall(args); }); + CMD2_ANY_LIST ("d.multicall.filtered", [](auto, auto& args) { return d_multicall_filtered(args); }); + + CMD2_ANY_LIST ("directory.watch.added", [](auto, auto& args) { return directory_watch_added(args); }); + CMD2_ANY_LIST ("directory.watch.ready", [](auto, auto& args) { return directory_watch_ready(args); }); rpc::rpc.mark_safe("start_tied"); rpc::rpc.mark_safe("stop_untied"); @@ -374,6 +372,7 @@ initialize_command_events() { rpc::rpc.mark_safe("close_low_diskspace"); rpc::rpc.mark_safe("close_low_diskspace.normal"); rpc::rpc.mark_safe("download_list"); + rpc::rpc.mark_safe("d.multicall"); rpc::rpc.mark_safe("d.multicall2"); rpc::rpc.mark_safe("d.multicall.filtered"); } diff --git a/src/command_local.cc b/src/command_local.cc index b421de38..cf0620c7 100644 --- a/src/command_local.cc +++ b/src/command_local.cc @@ -114,9 +114,9 @@ group_insert(const torrent::Object::list_type& args) { const std::string& view = check_name(post_increment(itr, last)->as_string()); rpc::commands.call("method.insert", rpc::create_object_list("group." + name + ".ratio.enable", "simple", - "schedule2=group." + name + ".ratio,5,60,on_ratio=" + name)); + "schedule=group." + name + ".ratio,5,60,on_ratio=" + name)); rpc::commands.call("method.insert", rpc::create_object_list("group." + name + ".ratio.disable", "simple", - "schedule_remove2=group." + name + ".ratio")); + "schedule_remove=group." + name + ".ratio")); rpc::commands.call("method.insert", rpc::create_object_list("group." + name + ".ratio.command", "simple", "d.try_close= ;d.ignore_commands.set=1")); rpc::commands.call("method.insert", rpc::create_object_list("group." + name + ".view", "string", view)); @@ -133,19 +133,6 @@ group_insert(const torrent::Object::list_type& args) { rpc::rpc.mark_safe("group." + name + ".ratio.upload"); rpc::rpc.mark_safe("group." + name + ".ratio.upload.set"); - if (rpc::call_command_value("method.use_intermediate") == 3) { - // Cleaned up in 0.16.1: - - CMD2_REDIRECT_MUTABLE("group2." + name + ".view", "group." + name + ".view"); - CMD2_REDIRECT_MUTABLE("group2." + name + ".view.set", "group." + name + ".view.set"); - CMD2_REDIRECT_MUTABLE("group2." + name + ".ratio.min", "group." + name + ".ratio.min"); - CMD2_REDIRECT_MUTABLE("group2." + name + ".ratio.min.set", "group." + name + ".ratio.min.set"); - CMD2_REDIRECT_MUTABLE("group2." + name + ".ratio.max", "group." + name + ".ratio.max"); - CMD2_REDIRECT_MUTABLE("group2." + name + ".ratio.max.set", "group." + name + ".ratio.max.set"); - CMD2_REDIRECT_MUTABLE("group2." + name + ".ratio.upload", "group." + name + ".ratio.upload"); - CMD2_REDIRECT_MUTABLE("group2." + name + ".ratio.upload.set", "group." + name + ".ratio.upload.set"); - } - return name; } @@ -203,6 +190,10 @@ initialize_command_local() { torrent::ChunkManager* chunkManager = torrent::chunk_manager(); torrent::FileManager* fileManager = torrent::file_manager(); + if (rpc::call_command_value("method.use_deprecated") == 1) { + CMD2_ANY_LIST ("file.append", std::bind(&cmd_file_append, std::placeholders::_2)); + } + CMD2_ANY ("system.hostname", std::bind(&system_hostname)); CMD2_ANY ("system.pid", std::bind(&getpid)); @@ -310,8 +301,7 @@ initialize_command_local() { #define CMD2_EXECUTE(key, flags) \ CMD2_ANY(key, std::bind(&rpc::ExecFile::execute_object, &rpc::execFile, std::placeholders::_2, flags)); - CMD2_EXECUTE ("execute", rpc::ExecFile::flag_expand_tilde | rpc::ExecFile::flag_throw); - CMD2_EXECUTE ("execute2", rpc::ExecFile::flag_expand_tilde | rpc::ExecFile::flag_throw); + CMD2_EXECUTE ("execute", rpc::ExecFile::flag_expand_tilde | rpc::ExecFile::flag_throw); CMD2_EXECUTE ("execute.throw", rpc::ExecFile::flag_expand_tilde | rpc::ExecFile::flag_throw); CMD2_EXECUTE ("execute.throw.bg", rpc::ExecFile::flag_expand_tilde | rpc::ExecFile::flag_throw | rpc::ExecFile::flag_background); CMD2_EXECUTE ("execute.nothrow", rpc::ExecFile::flag_expand_tilde); @@ -323,8 +313,6 @@ initialize_command_local() { CMD2_EXECUTE ("execute.capture", rpc::ExecFile::flag_throw | rpc::ExecFile::flag_expand_tilde | rpc::ExecFile::flag_capture); CMD2_EXECUTE ("execute.capture_nothrow", rpc::ExecFile::flag_expand_tilde | rpc::ExecFile::flag_capture); - CMD2_ANY_LIST ("file.append", std::bind(&cmd_file_append, std::placeholders::_2)); - // TODO: Convert to new command types: *rpc::command_base::argument(0) = "placeholder.0"; *rpc::command_base::argument(1) = "placeholder.1"; diff --git a/src/command_tracker.cc b/src/command_tracker.cc index 5de83533..2ddabd72 100644 --- a/src/command_tracker.cc +++ b/src/command_tracker.cc @@ -81,73 +81,71 @@ apply_enable_trackers(int64_t arg) { void initialize_command_tracker() { - CMD2_TRACKER ("t.is_busy", std::bind(&torrent::tracker::Tracker::is_requesting, std::placeholders::_1)); - CMD2_TRACKER ("t.is_enabled", std::bind(&torrent::tracker::Tracker::is_enabled, std::placeholders::_1)); - CMD2_TRACKER ("t.is_extra_tracker", std::bind(&torrent::tracker::Tracker::is_extra_tracker, std::placeholders::_1)); - CMD2_TRACKER ("t.is_open", std::bind(&torrent::tracker::Tracker::is_requesting, std::placeholders::_1)); - CMD2_TRACKER ("t.is_scrapable", std::bind(&torrent::tracker::Tracker::is_scrapable, std::placeholders::_1)); - CMD2_TRACKER ("t.is_usable", std::bind(&torrent::tracker::Tracker::is_usable, std::placeholders::_1)); + CMD2_TRACKER ("t.is_busy", [](auto* tracker, auto) { return tracker->is_requesting(); }); + CMD2_TRACKER ("t.is_enabled", [](auto* tracker, auto) { return tracker->is_enabled(); }); + CMD2_TRACKER ("t.is_extra_tracker", [](auto* tracker, auto) { return tracker->is_extra_tracker(); }); + CMD2_TRACKER ("t.is_open", [](auto* tracker, auto) { return tracker->is_requesting(); }); + CMD2_TRACKER ("t.is_scrapable", [](auto* tracker, auto) { return tracker->is_scrapable(); }); + CMD2_TRACKER ("t.is_usable", [](auto* tracker, auto) { return tracker->is_usable(); }); // TODO: Deprecate. - CMD2_TRACKER ("t.can_scrape", std::bind(&torrent::tracker::Tracker::is_scrapable, std::placeholders::_1)); + CMD2_TRACKER ("t.can_scrape", [](auto* tracker, auto) { return tracker->is_scrapable(); }); - CMD2_TRACKER_V ("t.enable", std::bind(&torrent::tracker::Tracker::enable, std::placeholders::_1)); - CMD2_TRACKER_V ("t.disable", std::bind(&torrent::tracker::Tracker::disable, std::placeholders::_1)); + CMD2_TRACKER_V ("t.enable", [](auto* tracker, auto) { tracker->enable(); }); + CMD2_TRACKER_V ("t.disable", [](auto* tracker, auto) { tracker->disable(); }); - CMD2_TRACKER_VALUE_V("t.is_enabled.set", std::bind(&tracker_set_enabled, std::placeholders::_1, std::placeholders::_2)); + CMD2_TRACKER_VALUE_V("t.is_enabled.set", [](auto* tracker, auto& value) { return tracker_set_enabled(tracker, value); }); - CMD2_TRACKER ("t.url", std::bind(&torrent::tracker::Tracker::url, std::placeholders::_1)); - CMD2_TRACKER ("t.group", std::bind(&torrent::tracker::Tracker::group, std::placeholders::_1)); - CMD2_TRACKER ("t.type", std::bind(&torrent::tracker::Tracker::type, std::placeholders::_1)); - CMD2_TRACKER ("t.id", std::bind(&torrent::tracker::Tracker::tracker_id, std::placeholders::_1)); + CMD2_TRACKER ("t.url", [](auto* tracker, auto) { return tracker->url(); }); + CMD2_TRACKER ("t.group", [](auto* tracker, auto) { return tracker->group(); }); + CMD2_TRACKER ("t.type", [](auto* tracker, auto) { return tracker->type(); }); + CMD2_TRACKER ("t.id", [](auto* tracker, auto) { return tracker->tracker_id(); }); - CMD2_TRACKER ("t.latest_event", [](auto* tracker, auto) { return tracker->state().latest_event(); }); - CMD2_TRACKER ("t.latest_new_peers", [](auto* tracker, auto) { return tracker->state().latest_new_peers(); }); - CMD2_TRACKER ("t.latest_sum_peers", [](auto* tracker, auto) { return tracker->state().latest_sum_peers(); }); + CMD2_TRACKER ("t.latest_event", [](auto* tracker, auto) { return tracker->state().latest_event(); }); + CMD2_TRACKER ("t.latest_new_peers", [](auto* tracker, auto) { return tracker->state().latest_new_peers(); }); + CMD2_TRACKER ("t.latest_sum_peers", [](auto* tracker, auto) { return tracker->state().latest_sum_peers(); }); - CMD2_TRACKER ("t.normal_interval", [](auto* tracker, auto) { return tracker->state().normal_interval(); }); - CMD2_TRACKER ("t.min_interval", [](auto* tracker, auto) { return tracker->state().min_interval(); }); + CMD2_TRACKER ("t.normal_interval", [](auto* tracker, auto) { return tracker->state().normal_interval(); }); + CMD2_TRACKER ("t.min_interval", [](auto* tracker, auto) { return tracker->state().min_interval(); }); CMD2_TRACKER ("t.activity_time_next", [](auto* tracker, auto) { return tracker->state().activity_time_next(); }); CMD2_TRACKER ("t.activity_time_last", [](auto* tracker, auto) { return tracker->state().activity_time_last(); }); - CMD2_TRACKER ("t.success_time_next", [](auto* tracker, auto) { return tracker->state().success_time_next(); }); - CMD2_TRACKER ("t.success_time_last", [](auto* tracker, auto) { return tracker->state().success_time_last(); }); - CMD2_TRACKER ("t.success_counter", [](auto* tracker, auto) { return tracker->state().success_counter(); }); + CMD2_TRACKER ("t.success_time_next", [](auto* tracker, auto) { return tracker->state().success_time_next(); }); + CMD2_TRACKER ("t.success_time_last", [](auto* tracker, auto) { return tracker->state().success_time_last(); }); + CMD2_TRACKER ("t.success_counter", [](auto* tracker, auto) { return tracker->state().success_counter(); }); - CMD2_TRACKER ("t.failed_time_next", [](auto* tracker, auto) { return tracker->state().failed_time_next(); }); - CMD2_TRACKER ("t.failed_time_last", [](auto* tracker, auto) { return tracker->state().failed_time_last(); }); - CMD2_TRACKER ("t.failed_counter", [](auto* tracker, auto) { return tracker->state().failed_counter(); }); + CMD2_TRACKER ("t.failed_time_next", [](auto* tracker, auto) { return tracker->state().failed_time_next(); }); + CMD2_TRACKER ("t.failed_time_last", [](auto* tracker, auto) { return tracker->state().failed_time_last(); }); + CMD2_TRACKER ("t.failed_counter", [](auto* tracker, auto) { return tracker->state().failed_counter(); }); - CMD2_TRACKER ("t.scrape_time_last", [](auto* tracker, auto) { return tracker->state().scrape_time_last(); }); - CMD2_TRACKER ("t.scrape_counter", [](auto* tracker, auto) { return tracker->state().scrape_counter(); }); + CMD2_TRACKER ("t.scrape_time_last", [](auto* tracker, auto) { return tracker->state().scrape_time_last(); }); + CMD2_TRACKER ("t.scrape_counter", [](auto* tracker, auto) { return tracker->state().scrape_counter(); }); - CMD2_TRACKER ("t.scrape_complete", [](auto* tracker, auto) { return tracker->state().scrape_complete(); }); - CMD2_TRACKER ("t.scrape_incomplete", [](auto* tracker, auto) { return tracker->state().scrape_incomplete(); }); - CMD2_TRACKER ("t.scrape_downloaded", [](auto* tracker, auto) { return tracker->state().scrape_downloaded(); }); + CMD2_TRACKER ("t.scrape_complete", [](auto* tracker, auto) { return tracker->state().scrape_complete(); }); + CMD2_TRACKER ("t.scrape_incomplete", [](auto* tracker, auto) { return tracker->state().scrape_incomplete(); }); + CMD2_TRACKER ("t.scrape_downloaded", [](auto* tracker, auto) { return tracker->state().scrape_downloaded(); }); - CMD2_ANY_VALUE ("trackers.enable", std::bind(&apply_enable_trackers, int64_t(1))); - CMD2_ANY_VALUE ("trackers.disable", std::bind(&apply_enable_trackers, int64_t(0))); + CMD2_ANY_VALUE ("trackers.enable", [](auto, auto) { return apply_enable_trackers(1); }); + CMD2_ANY_VALUE ("trackers.disable", [](auto, auto) { return apply_enable_trackers(0); }); CMD2_VAR_BOOL ("trackers.delay_scrape", false); - CMD2_VAR_VALUE ("trackers.numwant", -1); + CMD2_VAR_VALUE ("trackers.numwant", -1); CMD2_ANY ("trackers.use_udp", [](auto, auto) { return true; }); CMD2_ANY_VALUE_V ("trackers.use_udp.set", [](auto, auto) { lt_log_print(torrent::LOG_ERROR, "trackers.use_udp.set is no longer supported", 0); }) - auto dht_manager = control->dht_manager(); - - CMD2_ANY_STRING_V ("dht.mode.set", std::bind(&core::DhtManager::set_mode, control->dht_manager(), std::placeholders::_2)); - CMD2_ANY ("dht.port", [](auto, auto) { return torrent::runtime::network_manager()->dht_controller()->port(); }); + CMD2_ANY_STRING_V ("dht.mode.set", [](auto, auto& str) { return control->dht_manager()->set_mode_by_user(str); }); + CMD2_ANY ("dht.port", [](auto, auto) { return torrent::runtime::network_manager()->dht_controller()->port(); }); CMD2_ANY_VALUE_V ("dht.port.set", [](auto, auto) { lt_log_print(torrent::LOG_DHT_ERROR, "dht.port.set is no longer supported, use dht.override_port.set", 0); }); - CMD2_ANY ("dht.override_port", std::bind(&torrent::runtime::NetworkConfig::override_dht_port, torrent::runtime::network_config())); - CMD2_ANY_VALUE_V ("dht.override_port.set", std::bind(&torrent::runtime::NetworkConfig::set_override_dht_port, torrent::runtime::network_config(), std::placeholders::_2)); + CMD2_ANY ("dht.override_port", [](auto, auto) { return torrent::runtime::network_config()->override_dht_port(); }); + CMD2_ANY_VALUE_V ("dht.override_port.set", [](auto, auto& value) { return torrent::runtime::network_config()->set_override_dht_port(value); }); - CMD2_ANY_STRING ("dht.add_node", std::bind(&apply_dht_add_node, std::placeholders::_2)); - CMD2_ANY ("dht.statistics", std::bind(&core::DhtManager::dht_statistics, dht_manager)); + CMD2_ANY_STRING ("dht.add_node", [](auto, auto& str) { return apply_dht_add_node(str); }); + CMD2_ANY ("dht.statistics", [](auto, auto) { return control->dht_manager()->dht_statistics(); }); rpc::rpc.mark_safe("t.url"); rpc::rpc.mark_safe("t.group"); diff --git a/src/command_ui.cc b/src/command_ui.cc index 88ac2f48..697b8ca5 100644 --- a/src/command_ui.cc +++ b/src/command_ui.cc @@ -795,61 +795,59 @@ apply_set_color(int color_id, const torrent::Object::string_type& color_str) { void initialize_command_ui() { - CMD2_VAR_STRING("keys.layout", "qwerty"); + CMD2_VAR_STRING ("keys.layout", "qwerty"); - CMD2_ANY_STRING("view.add", object_convert_void(std::bind(&core::ViewManager::insert_throw, control->view_manager(), std::placeholders::_2))); + CMD2_ANY_STRING ("view.add", object_convert_void(std::bind(&core::ViewManager::insert_throw, control->view_manager(), std::placeholders::_2))); - CMD2_ANY_L ("view.list", std::bind(&apply_view_list)); - CMD2_ANY_LIST("view.set", std::bind(&apply_view_set, std::placeholders::_2)); + CMD2_ANY_L ("view.list", std::bind(&apply_view_list)); + CMD2_ANY_LIST ("view.set", std::bind(&apply_view_set, std::placeholders::_2)); - CMD2_ANY_LIST ("view.filter", std::bind(&apply_view_event, &core::ViewManager::set_filter, std::placeholders::_2)); - CMD2_ANY_LIST ("view.filter_on", std::bind(&apply_view_filter_on, std::placeholders::_2)); - CMD2_ANY_LIST ("view.filter.temp", std::bind(&apply_view_event, &core::ViewManager::set_filter_temp, std::placeholders::_2)); - CMD2_VAR_STRING("view.filter.temp.excluded", "default,started,stopped"); - CMD2_VAR_BOOL ("view.filter.temp.log", 0); + CMD2_ANY_LIST ("view.filter", std::bind(&apply_view_event, &core::ViewManager::set_filter, std::placeholders::_2)); + CMD2_ANY_LIST ("view.filter_on", std::bind(&apply_view_filter_on, std::placeholders::_2)); + CMD2_ANY_LIST ("view.filter.temp", std::bind(&apply_view_event, &core::ViewManager::set_filter_temp, std::placeholders::_2)); + CMD2_VAR_STRING ("view.filter.temp.excluded", "default,started,stopped"); + CMD2_VAR_BOOL ("view.filter.temp.log", 0); - CMD2_ANY_LIST("view.sort", std::bind(&apply_view_sort, std::placeholders::_2)); - CMD2_ANY_LIST("view.sort_new", std::bind(&apply_view_event, &core::ViewManager::set_sort_new, std::placeholders::_2)); - CMD2_ANY_LIST("view.sort_current", std::bind(&apply_view_event, &core::ViewManager::set_sort_current, std::placeholders::_2)); + CMD2_ANY_LIST ("view.sort", std::bind(&apply_view_sort, std::placeholders::_2)); + CMD2_ANY_LIST ("view.sort_new", std::bind(&apply_view_event, &core::ViewManager::set_sort_new, std::placeholders::_2)); + CMD2_ANY_LIST ("view.sort_current", std::bind(&apply_view_event, &core::ViewManager::set_sort_current, std::placeholders::_2)); - CMD2_ANY_LIST("view.event_added", std::bind(&apply_view_event, &core::ViewManager::set_event_added, std::placeholders::_2)); - CMD2_ANY_LIST("view.event_removed", std::bind(&apply_view_event, &core::ViewManager::set_event_removed, std::placeholders::_2)); + CMD2_ANY_LIST ("view.event_added", std::bind(&apply_view_event, &core::ViewManager::set_event_added, std::placeholders::_2)); + CMD2_ANY_LIST ("view.event_removed", std::bind(&apply_view_event, &core::ViewManager::set_event_removed, std::placeholders::_2)); - // Cleanup and add . to view. - - CMD2_ANY_STRING("view.size", std::bind(&cmd_view_size, std::placeholders::_2)); - CMD2_ANY_STRING("view.size_not_visible", std::bind(&cmd_view_size_not_visible, std::placeholders::_2)); - CMD2_ANY_STRING("view.persistent", std::bind(&cmd_view_persistent, std::placeholders::_2)); + CMD2_ANY_STRING ("view.size", std::bind(&cmd_view_size, std::placeholders::_2)); + CMD2_ANY_STRING ("view.size_not_visible", std::bind(&cmd_view_size_not_visible, std::placeholders::_2)); + CMD2_ANY_STRING ("view.persistent", std::bind(&cmd_view_persistent, std::placeholders::_2)); CMD2_ANY_STRING_V("view.filter_all", std::bind(&core::View::filter, std::bind(&core::ViewManager::find_ptr_throw, control->view_manager(), std::placeholders::_2))); - CMD2_DL_STRING ("view.filter_download", std::bind(&cmd_view_filter_download, std::placeholders::_1, std::placeholders::_2)); - CMD2_DL_STRING ("view.set_visible", std::bind(&cmd_view_set_visible, std::placeholders::_1, std::placeholders::_2)); - CMD2_DL_STRING ("view.set_not_visible", std::bind(&cmd_view_set_not_visible, std::placeholders::_1, std::placeholders::_2)); + CMD2_DL_STRING ("view.filter_download", std::bind(&cmd_view_filter_download, std::placeholders::_1, std::placeholders::_2)); + CMD2_DL_STRING ("view.set_visible", std::bind(&cmd_view_set_visible, std::placeholders::_1, std::placeholders::_2)); + CMD2_DL_STRING ("view.set_not_visible", std::bind(&cmd_view_set_not_visible, std::placeholders::_1, std::placeholders::_2)); // Commands that affect the default rtorrent UI. - CMD2_DL ("ui.unfocus_download", std::bind(&cmd_ui_unfocus_download, std::placeholders::_1)); - CMD2_ANY ("ui.current_view", std::bind(&cmd_ui_current_view)); - CMD2_ANY_STRING("ui.current_view.set", std::bind(&cmd_ui_set_view, std::placeholders::_2)); + CMD2_DL ("ui.unfocus_download", std::bind(&cmd_ui_unfocus_download, std::placeholders::_1)); + CMD2_ANY ("ui.current_view", std::bind(&cmd_ui_current_view)); + CMD2_ANY_STRING ("ui.current_view.set", std::bind(&cmd_ui_set_view, std::placeholders::_2)); - CMD2_ANY ("ui.input.history.size", std::bind(&ui::Root::get_input_history_size, control->ui())); - CMD2_ANY_VALUE_V("ui.input.history.size.set", std::bind(&ui::Root::set_input_history_size, control->ui(), std::placeholders::_2)); - CMD2_ANY_V ("ui.input.history.clear", std::bind(&ui::Root::clear_input_history, control->ui())); + CMD2_ANY ("ui.input.history.size", std::bind(&ui::Root::get_input_history_size, control->ui())); + CMD2_ANY_VALUE_V ("ui.input.history.size.set", std::bind(&ui::Root::set_input_history_size, control->ui(), std::placeholders::_2)); + CMD2_ANY_V ("ui.input.history.clear", std::bind(&ui::Root::clear_input_history, control->ui())); - CMD2_VAR_VALUE ("ui.throttle.global.step.small", 5); - CMD2_VAR_VALUE ("ui.throttle.global.step.medium", 50); - CMD2_VAR_VALUE ("ui.throttle.global.step.large", 500); + CMD2_VAR_VALUE ("ui.throttle.global.step.small", 5); + CMD2_VAR_VALUE ("ui.throttle.global.step.medium", 50); + CMD2_VAR_VALUE ("ui.throttle.global.step.large", 500); - CMD2_VAR_VALUE ("ui.focus.page_size", 0); + CMD2_VAR_VALUE ("ui.focus.page_size", 0); - CMD2_ANY_LIST ("ui.status.throttle.up.set", std::bind(&cmd_status_throttle_names, true, std::placeholders::_2)); - CMD2_ANY_LIST ("ui.status.throttle.down.set", std::bind(&cmd_status_throttle_names, false, std::placeholders::_2)); + CMD2_ANY_LIST ("ui.status.throttle.up.set", std::bind(&cmd_status_throttle_names, true, std::placeholders::_2)); + CMD2_ANY_LIST ("ui.status.throttle.down.set", std::bind(&cmd_status_throttle_names, false, std::placeholders::_2)); CMD2_ANY ("ui.keymap.style", std::bind(&ui::Root::keymap_style, control->ui())); CMD2_ANY_STRING_V("ui.keymap.style.set", std::bind(&ui::Root::set_keymap_style, control->ui(), std::placeholders::_2)); // TODO: Add 'option_string' for rtorrent-specific options. - CMD2_VAR_STRING("ui.torrent_list.layout", "full"); + CMD2_VAR_STRING ("ui.torrent_list.layout", "full"); // Move. CMD2_ANY("print", &apply_print); diff --git a/src/core/dht_manager.cc b/src/core/dht_manager.cc index 57d64ae4..027d1c26 100644 --- a/src/core/dht_manager.cc +++ b/src/core/dht_manager.cc @@ -140,24 +140,43 @@ DhtManager::save_dht_cache() { } void -DhtManager::set_mode(const std::string& arg) { - int i; - for (i = 0; i < dht_settings_num; i++) { +DhtManager::set_mode_by_user(const std::string& arg) { + for (int i = 0; i < dht_settings_num; i++) { if (arg == dht_settings[i]) { - m_start = i; - break; + m_set_by_user = true; + return set_mode_directly(i); } } +} - if (i == dht_settings_num) +void +DhtManager::set_mode_directly(unsigned int mode) { + if (mode >= dht_settings_num) throw torrent::input_error("Invalid argument."); + m_start = mode; + if (m_start == dht_off) stop_dht(); else if (m_start == dht_on) start_dht(); } +void +DhtManager::set_auto_if_untouched_and_has_session() { + if (m_set_by_user) + return; + + if (rpc::call_command_string("session.path").empty()) { + LT_LOG("DHT auto-start disabled, session path not set.", 0); + return; + } + + set_mode_directly(dht_auto); + + LT_LOG("DHT auto-start enabled.", 0); +} + void DhtManager::update() { if (!torrent::runtime::network_manager()->is_dht_active()) diff --git a/src/core/dht_manager.h b/src/core/dht_manager.h index 811e17ce..eb6d6474 100644 --- a/src/core/dht_manager.h +++ b/src/core/dht_manager.h @@ -8,6 +8,11 @@ namespace core { class DhtManager { public: + static constexpr int dht_disable = 0; + static constexpr int dht_off = 1; + static constexpr int dht_auto = 2; + static constexpr int dht_on = 3; + ~DhtManager(); void load_dht_cache(); @@ -18,16 +23,14 @@ public: void stop_dht(); void auto_start() { if (m_start == dht_auto) start_dht(); } - void set_mode(const std::string& arg); + void set_mode_by_user(const std::string& arg); + void set_mode_directly(unsigned int mode); + + void set_auto_if_untouched_and_has_session(); private: - static const int dht_disable = 0; - static const int dht_off = 1; - static const int dht_auto = 2; - static const int dht_on = 3; - - static const int dht_settings_num = 4; - static const char* dht_settings[dht_settings_num]; + static constexpr int dht_settings_num = 4; + static const char* dht_settings[dht_settings_num]; void update(); bool log_statistics(bool force); @@ -43,6 +46,7 @@ private: torrent::utils::SchedulerEntry m_stop_timeout; bool m_warned{}; + bool m_set_by_user{}; int m_start{dht_off}; }; diff --git a/src/main.cc b/src/main.cc index bd49033b..9880fdad 100644 --- a/src/main.cc +++ b/src/main.cc @@ -281,12 +281,12 @@ main(int argc, char** argv) { "view.filter = leeching,((and,((d.state)),((not,((d.complete))))))\n" "view.filter_on = leeching,event.download.resumed,event.download.paused,event.download.finished\n" - "schedule2 = view.main,10,10,((view.sort,main,20))\n" - "schedule2 = view.name,10,10,((view.sort,name,20))\n" + "schedule = view.main,10,10,((view.sort,main,20))\n" + "schedule = view.name,10,10,((view.sort,name,20))\n" - "schedule2 = session_save,1200,1200,((session.save))\n" - "schedule2 = low_diskspace,5,60,((close_low_diskspace,500M))\n" - "schedule2 = prune_file_status,3600,86400,((system.file_status_cache.prune))\n" + "schedule = session_save,1200,1200,((session.save))\n" + "schedule = low_diskspace,5,60,((close_low_diskspace,500M))\n" + "schedule = prune_file_status,3600,86400,((system.file_status_cache.prune))\n" "protocol.encryption.set=allow_incoming,prefer_plaintext,enable_retry\n" @@ -309,7 +309,8 @@ main(int argc, char** argv) { CMD2_REDIRECT("ratio.upload.set", "group.seeding.ratio.upload.set"); CMD2_REDIRECT("encryption", "protocol.encryption.set"); - CMD2_REDIRECT("encoding_list", "encoding.add"); + + CMD2_REDIRECT("check_hash", "pieces.hash.on_completion.set"); CMD2_REDIRECT("connection_leech", "protocol.connection.leech.set"); CMD2_REDIRECT("connection_seed", "protocol.connection.seed.set"); @@ -329,26 +330,11 @@ main(int argc, char** argv) { CMD2_REDIRECT("max_downloads_div", "throttle.max_downloads.div.set"); CMD2_REDIRECT("max_downloads_global", "throttle.max_downloads.global.set"); - CMD2_REDIRECT("max_memory_usage", "pieces.memory.max.set"); - - CMD2_REDIRECT("bind", "network.bind_address.set"); - CMD2_REDIRECT("ip", "network.local_address.set"); - CMD2_REDIRECT("port_range", "network.port_range.set"); - - CMD2_REDIRECT("dht", "dht.mode.set"); - - CMD2_REDIRECT("port_random", "network.port_random.set"); - CMD2_REDIRECT("proxy_address", "network.proxy_address.set"); - - CMD2_REDIRECT("scgi_port", "network.scgi.open_port"); - CMD2_REDIRECT("scgi_local", "network.scgi.open_local"); - CMD2_REDIRECT("directory", "directory.default.set"); CMD2_REDIRECT("session", "session.path.set"); - CMD2_REDIRECT("check_hash", "pieces.hash.on_completion.set"); - - CMD2_REDIRECT("key_layout", "keys.layout.set"); + CMD2_REDIRECT("scgi_port", "network.scgi.open_port"); + CMD2_REDIRECT("scgi_local", "network.scgi.open_local"); CMD2_REDIRECT("to_gm_time", "convert.gm_time"); CMD2_REDIRECT("to_gm_date", "convert.gm_date"); @@ -360,37 +346,44 @@ main(int argc, char** argv) { CMD2_REDIRECT("to_xb", "convert.xb"); CMD2_REDIRECT("to_throttle", "convert.throttle"); - CMD2_REDIRECT("torrent_list_layout", "ui.torrent_list.layout.set"); - - // Deprecate: - - CMD2_VAR_STRING("dht.throttle.name", "deprecated"); - rpc::rpc.mark_safe("dht.throttle.name"); - - CMD2_REDIRECT("network.http.max_open", "network.http.max_total_connections"); - CMD2_REDIRECT("network.http.max_open.set", "network.http.max_total_connections.set"); - - // Deprecated commands. Don't use these anymore. - // - // It has been so long that we now re-create these commands with the new (old by now) command - // call style, where the first argument is the target. // if (rpc::call_command_value("method.use_intermediate") == 1) { - // CMD2_REDIRECT("execute", "execute2"); - - // CMD2_REDIRECT("schedule", "schedule2"); - // CMD2_REDIRECT("schedule_remove", "schedule_remove2"); // } else if (rpc::call_command_value("method.use_intermediate") == 2) { // Allow for use in config files, etc, just don't export it. - // CMD2_REDIRECT_NO_EXPORT("execute", "execute2"); - - // CMD2_REDIRECT_NO_EXPORT("schedule", "schedule2"); - // CMD2_REDIRECT_NO_EXPORT("schedule_remove", "schedule_remove2"); // } - // if (rpc::call_command_value("method.use_deprecated") == 1) { - // } + if (rpc::call_command_value("method.use_deprecated") == 1) { + CMD2_REDIRECT("execute2", "execute"); + CMD2_REDIRECT("schedule2", "schedule"); + CMD2_REDIRECT("schedule_remove2", "schedule.remove"); + + // TODO: Remove file.append when cleaning these up. + + CMD2_REDIRECT("bind", "network.bind_address.set"); + CMD2_REDIRECT("ip", "network.local_address.set"); + CMD2_REDIRECT("port_range", "network.port_range.set"); + + // TODO: Check if dht is on by default. + CMD2_REDIRECT("dht", "dht.mode.set"); + + CMD2_REDIRECT("port_random", "network.port_random.set"); + CMD2_REDIRECT("proxy_address", "network.proxy_address.set"); + + CMD2_REDIRECT("key_layout", "keys.layout.set"); + + CMD2_REDIRECT("torrent_list_layout", "ui.torrent_list.layout.set"); + + CMD2_VAR_STRING("dht.throttle.name", "deprecated"); + rpc::rpc.mark_safe("dht.throttle.name"); + + CMD2_REDIRECT("network.http.max_open", "network.http.max_total_connections"); + CMD2_REDIRECT("network.http.max_open.set", "network.http.max_total_connections.set"); + + // Users should check their setups to see if they need to modify their use of these options. + CMD2_REDIRECT("max_memory_usage", "pieces.memory.max.set"); + CMD2_REDIRECT("encoding_list", "encoding.add"); + } { auto fd = torrent::fd_open_family(torrent::fd_flag_stream, AF_INET6); @@ -421,16 +414,16 @@ main(int argc, char** argv) { control->initialize(); control->ui()->load_input_history(); - // Load session torrents and perform scheduled tasks to ensure - // session torrents are loaded before arg torrents. + // Load session torrents and perform scheduled tasks to ensure session torrents are loaded + // before arg torrents. + control->dht_manager()->set_auto_if_untouched_and_has_session(); control->dht_manager()->load_dht_cache(); load_session_torrents(session_thread::manager()->path()); load_arg_torrents(argv + firstArg, argv + argc); - // Make sure we update the display before any scheduled tasks can - // run, so that loading of torrents doesn't look like it hangs on - // startup. + // Make sure we update the display before any scheduled tasks can run, so that loading of + // torrents doesn't look like it hangs on startup. control->display()->adjust_layout(); control->display()->receive_update();