Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package rtorrent for openSUSE:Factory checked in at 2026-09-04 12:41:22 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/rtorrent (Old) and /work/SRC/openSUSE:Factory/.rtorrent.new.1265 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "rtorrent" Fri Sep 4 12:41:22 2026 rev:40 rq:1375602 version:0.16.22 Changes: -------- --- /work/SRC/openSUSE:Factory/rtorrent/rtorrent.changes 2026-08-27 18:55:17.969798200 +0200 +++ /work/SRC/openSUSE:Factory/.rtorrent.new.1265/rtorrent.changes 2026-09-04 12:42:16.618518156 +0200 @@ -1,0 +2,12 @@ +Thu Sep 3 10:46:27 UTC 2026 - Jan Engelhardt <[email protected]> + +- Update to release 0.16.22 + * New commands: Use `system.file_name.replace_slash.set` and + `system.torrent_name.use_sanitized.set` to replace forward + slashes in download and file names, defaults to _ and is + disabled by using an empty string. + * Reject an XMLRPC size limit above the SCGI content size limit. + * Expose `system.files.close_idle` for FileManager idle FD + timeout. + +------------------------------------------------------------------- Old: ---- rtorrent-0.16.21.tar.gz New: ---- rtorrent-0.16.22.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ rtorrent.spec ++++++ --- /var/tmp/diff_new_pack.euU2QH/_old 2026-09-04 12:42:17.344543653 +0200 +++ /var/tmp/diff_new_pack.euU2QH/_new 2026-09-04 12:42:17.345543688 +0200 @@ -17,7 +17,7 @@ Name: rtorrent -Version: 0.16.21 +Version: 0.16.22 Release: 0 Summary: Console-based BitTorrent client License: SUSE-GPL-2.0+-with-openssl-exception ++++++ _scmsync.obsinfo ++++++ --- /var/tmp/diff_new_pack.euU2QH/_old 2026-09-04 12:42:17.376544777 +0200 +++ /var/tmp/diff_new_pack.euU2QH/_new 2026-09-04 12:42:17.378544847 +0200 @@ -1,5 +1,5 @@ -mtime: 1787772810 -commit: 3fe33b2305c63145f6696b910c5cc6f720140d482809b522817c358d1b46569a +mtime: 1788432728 +commit: ac4b3d50b3755e209866122a7814a4414c2ae92f336e0eb270b9801f006d06c3 url: https://src.opensuse.org/jengelh/rtorrent revision: master ++++++ build.specials.obscpio ++++++ ++++++ build.specials.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/.gitignore new/.gitignore --- old/.gitignore 1970-01-01 01:00:00.000000000 +0100 +++ new/.gitignore 2026-09-03 12:52:08.000000000 +0200 @@ -0,0 +1 @@ +.osc ++++++ rtorrent-0.16.21.tar.gz -> rtorrent-0.16.22.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rtorrent-0.16.21/configure new/rtorrent-0.16.22/configure --- old/rtorrent-0.16.21/configure 2026-08-26 09:35:40.000000000 +0200 +++ new/rtorrent-0.16.22/configure 2026-09-02 10:40:38.000000000 +0200 @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.72 for rtorrent 0.16.21. +# Generated by GNU Autoconf 2.72 for rtorrent 0.16.22. # # Report bugs to <[email protected]>. # @@ -614,8 +614,8 @@ # Identity of this package. PACKAGE_NAME='rtorrent' PACKAGE_TARNAME='rtorrent' -PACKAGE_VERSION='0.16.21' -PACKAGE_STRING='rtorrent 0.16.21' +PACKAGE_VERSION='0.16.22' +PACKAGE_STRING='rtorrent 0.16.22' PACKAGE_BUGREPORT='[email protected]' PACKAGE_URL='' @@ -1422,7 +1422,7 @@ # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -'configure' configures rtorrent 0.16.21 to adapt to many kinds of systems. +'configure' configures rtorrent 0.16.22 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1493,7 +1493,7 @@ if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of rtorrent 0.16.21:";; + short | recursive ) echo "Configuration of rtorrent 0.16.22:";; esac cat <<\_ACEOF @@ -1645,7 +1645,7 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -rtorrent configure 0.16.21 +rtorrent configure 0.16.22 generated by GNU Autoconf 2.72 Copyright (C) 2023 Free Software Foundation, Inc. @@ -2274,7 +2274,7 @@ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by rtorrent $as_me 0.16.21, which was +It was created by rtorrent $as_me 0.16.22, which was generated by GNU Autoconf 2.72. Invocation command line was $ $0$ac_configure_args_raw @@ -3967,7 +3967,7 @@ # Define the identity of the package. PACKAGE='rtorrent' - VERSION='0.16.21' + VERSION='0.16.22' printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h @@ -21574,19 +21574,19 @@ fi pkg_failed=no -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libtorrent >= 0.16.21" >&5 -printf %s "checking for libtorrent >= 0.16.21... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libtorrent >= 0.16.22" >&5 +printf %s "checking for libtorrent >= 0.16.22... " >&6; } if test -n "$DEPENDENCIES_CFLAGS"; then pkg_cv_DEPENDENCIES_CFLAGS="$DEPENDENCIES_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libtorrent >= 0.16.21\""; } >&5 - ($PKG_CONFIG --exists --print-errors "libtorrent >= 0.16.21") 2>&5 + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libtorrent >= 0.16.22\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libtorrent >= 0.16.22") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then - pkg_cv_DEPENDENCIES_CFLAGS=`$PKG_CONFIG --cflags "libtorrent >= 0.16.21" 2>/dev/null` + pkg_cv_DEPENDENCIES_CFLAGS=`$PKG_CONFIG --cflags "libtorrent >= 0.16.22" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes @@ -21598,12 +21598,12 @@ pkg_cv_DEPENDENCIES_LIBS="$DEPENDENCIES_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libtorrent >= 0.16.21\""; } >&5 - ($PKG_CONFIG --exists --print-errors "libtorrent >= 0.16.21") 2>&5 + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libtorrent >= 0.16.22\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libtorrent >= 0.16.22") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then - pkg_cv_DEPENDENCIES_LIBS=`$PKG_CONFIG --libs "libtorrent >= 0.16.21" 2>/dev/null` + pkg_cv_DEPENDENCIES_LIBS=`$PKG_CONFIG --libs "libtorrent >= 0.16.22" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes @@ -21624,14 +21624,14 @@ _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then - DEPENDENCIES_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libtorrent >= 0.16.21" 2>&1` + DEPENDENCIES_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libtorrent >= 0.16.22" 2>&1` else - DEPENDENCIES_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libtorrent >= 0.16.21" 2>&1` + DEPENDENCIES_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libtorrent >= 0.16.22" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$DEPENDENCIES_PKG_ERRORS" >&5 - as_fn_error $? "Package requirements (libtorrent >= 0.16.21) were not met: + as_fn_error $? "Package requirements (libtorrent >= 0.16.22) were not met: $DEPENDENCIES_PKG_ERRORS @@ -23631,7 +23631,7 @@ # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by rtorrent $as_me 0.16.21, which was +This file was extended by rtorrent $as_me 0.16.22, which was generated by GNU Autoconf 2.72. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -23699,7 +23699,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ -rtorrent config.status 0.16.21 +rtorrent config.status 0.16.22 configured by $0, generated by GNU Autoconf 2.72, with options \\"\$ac_cs_config\\" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rtorrent-0.16.21/configure.ac new/rtorrent-0.16.22/configure.ac --- old/rtorrent-0.16.21/configure.ac 2026-08-26 09:17:45.000000000 +0200 +++ new/rtorrent-0.16.22/configure.ac 2026-09-02 10:22:23.000000000 +0200 @@ -1,6 +1,6 @@ m4_pattern_allow([PKG_CHECK_EXISTS]) -AC_INIT([rtorrent],[0.16.21],[[email protected]]) +AC_INIT([rtorrent],[0.16.22],[[email protected]]) AC_CONFIG_HEADERS([config.h]) AC_CONFIG_MACRO_DIRS([scripts]) @@ -49,7 +49,7 @@ PKG_CHECK_MODULES([CPPUNIT], [cppunit],, [no_cppunit="yes"]) PKG_CHECK_MODULES([ZLIB], [zlib]) -PKG_CHECK_MODULES([DEPENDENCIES], [libtorrent >= 0.16.21]) +PKG_CHECK_MODULES([DEPENDENCIES], [libtorrent >= 0.16.22]) AC_LANG_PUSH(C++) TORRENT_WITH_XMLRPC_C diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rtorrent-0.16.21/src/Makefile.am new/rtorrent-0.16.22/src/Makefile.am --- old/rtorrent-0.16.21/src/Makefile.am 2026-08-26 09:17:45.000000000 +0200 +++ new/rtorrent-0.16.22/src/Makefile.am 2026-09-02 10:22:23.000000000 +0200 @@ -195,6 +195,7 @@ command_tracker.cc \ command_scheduler.cc \ command_string.cc \ + command_system.cc \ command_ui.cc \ control.cc \ control.h \ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rtorrent-0.16.21/src/Makefile.in new/rtorrent-0.16.22/src/Makefile.in --- old/rtorrent-0.16.21/src/Makefile.in 2026-08-26 09:35:41.000000000 +0200 +++ new/rtorrent-0.16.22/src/Makefile.in 2026-09-02 10:40:39.000000000 +0200 @@ -203,10 +203,10 @@ command_helpers.h command_groups.cc command_local.cc \ command_logging.cc command_network.cc command_peer.cc \ command_throttle.cc command_tracker.cc command_scheduler.cc \ - command_string.cc command_ui.cc control.cc control.h \ - globals.cc globals.h option_parser.cc option_parser.h setup.cc \ - setup.h signal_handler.cc signal_handler.h \ - display/curses_stub.cc display/curses_stub.h + command_string.cc command_system.cc command_ui.cc control.cc \ + control.h globals.cc globals.h option_parser.cc \ + option_parser.h setup.cc setup.h signal_handler.cc \ + signal_handler.h display/curses_stub.cc display/curses_stub.h am__dirstamp = $(am__leading_dot)dirstamp @NO_NCURSES_TRUE@am__objects_1 = display/curses_stub.$(OBJEXT) am_libsub_root_a_OBJECTS = core/dht_manager.$(OBJEXT) \ @@ -266,9 +266,9 @@ command_network.$(OBJEXT) command_peer.$(OBJEXT) \ command_throttle.$(OBJEXT) command_tracker.$(OBJEXT) \ command_scheduler.$(OBJEXT) command_string.$(OBJEXT) \ - command_ui.$(OBJEXT) control.$(OBJEXT) globals.$(OBJEXT) \ - option_parser.$(OBJEXT) setup.$(OBJEXT) \ - signal_handler.$(OBJEXT) $(am__objects_1) + command_system.$(OBJEXT) command_ui.$(OBJEXT) \ + control.$(OBJEXT) globals.$(OBJEXT) option_parser.$(OBJEXT) \ + setup.$(OBJEXT) signal_handler.$(OBJEXT) $(am__objects_1) libsub_root_a_OBJECTS = $(am_libsub_root_a_OBJECTS) am_rtorrent_OBJECTS = main.$(OBJEXT) rtorrent_OBJECTS = $(am_rtorrent_OBJECTS) @@ -299,12 +299,13 @@ ./$(DEPDIR)/command_local.Po ./$(DEPDIR)/command_logging.Po \ ./$(DEPDIR)/command_network.Po ./$(DEPDIR)/command_peer.Po \ ./$(DEPDIR)/command_scheduler.Po ./$(DEPDIR)/command_string.Po \ - ./$(DEPDIR)/command_throttle.Po ./$(DEPDIR)/command_tracker.Po \ - ./$(DEPDIR)/command_ui.Po ./$(DEPDIR)/control.Po \ - ./$(DEPDIR)/globals.Po ./$(DEPDIR)/main.Po \ - ./$(DEPDIR)/option_parser.Po ./$(DEPDIR)/setup.Po \ - ./$(DEPDIR)/signal_handler.Po core/$(DEPDIR)/dht_manager.Po \ - core/$(DEPDIR)/download.Po core/$(DEPDIR)/download_factory.Po \ + ./$(DEPDIR)/command_system.Po ./$(DEPDIR)/command_throttle.Po \ + ./$(DEPDIR)/command_tracker.Po ./$(DEPDIR)/command_ui.Po \ + ./$(DEPDIR)/control.Po ./$(DEPDIR)/globals.Po \ + ./$(DEPDIR)/main.Po ./$(DEPDIR)/option_parser.Po \ + ./$(DEPDIR)/setup.Po ./$(DEPDIR)/signal_handler.Po \ + core/$(DEPDIR)/dht_manager.Po core/$(DEPDIR)/download.Po \ + core/$(DEPDIR)/download_factory.Po \ core/$(DEPDIR)/download_list.Po core/$(DEPDIR)/http_queue.Po \ core/$(DEPDIR)/manager.Po core/$(DEPDIR)/view.Po \ core/$(DEPDIR)/view_manager.Po display/$(DEPDIR)/canvas.Po \ @@ -663,9 +664,10 @@ command_helpers.h command_groups.cc command_local.cc \ command_logging.cc command_network.cc command_peer.cc \ command_throttle.cc command_tracker.cc command_scheduler.cc \ - command_string.cc command_ui.cc control.cc control.h \ - globals.cc globals.h option_parser.cc option_parser.h setup.cc \ - setup.h signal_handler.cc signal_handler.h $(am__append_1) + command_string.cc command_system.cc command_ui.cc control.cc \ + control.h globals.cc globals.h option_parser.cc \ + option_parser.h setup.cc setup.h signal_handler.cc \ + signal_handler.h $(am__append_1) AM_CPPFLAGS = -I$(srcdir) -I$(top_srcdir) -DPACKAGE_DATADIR=\"$(pkgdatadir)\" all: all-am @@ -994,6 +996,7 @@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/command_peer.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/command_scheduler.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/command_string.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/command_system.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/command_throttle.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/command_tracker.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/command_ui.Po@am__quote@ # am--include-marker @@ -1278,6 +1281,7 @@ -rm -f ./$(DEPDIR)/command_peer.Po -rm -f ./$(DEPDIR)/command_scheduler.Po -rm -f ./$(DEPDIR)/command_string.Po + -rm -f ./$(DEPDIR)/command_system.Po -rm -f ./$(DEPDIR)/command_throttle.Po -rm -f ./$(DEPDIR)/command_tracker.Po -rm -f ./$(DEPDIR)/command_ui.Po @@ -1425,6 +1429,7 @@ -rm -f ./$(DEPDIR)/command_peer.Po -rm -f ./$(DEPDIR)/command_scheduler.Po -rm -f ./$(DEPDIR)/command_string.Po + -rm -f ./$(DEPDIR)/command_system.Po -rm -f ./$(DEPDIR)/command_throttle.Po -rm -f ./$(DEPDIR)/command_tracker.Po -rm -f ./$(DEPDIR)/command_ui.Po diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rtorrent-0.16.21/src/command_download.cc new/rtorrent-0.16.22/src/command_download.cc --- old/rtorrent-0.16.21/src/command_download.cc 2026-08-26 09:17:45.000000000 +0200 +++ new/rtorrent-0.16.22/src/command_download.cc 2026-09-02 10:22:23.000000000 +0200 @@ -142,16 +142,6 @@ return torrent::Object(); } -void -apply_d_directory(core::Download* download, const std::string& name) { - if (!download->file_list()->is_multi_file()) - download->set_root_directory(name); - else if (name.empty() || *name.rbegin() == '/') - download->set_root_directory(name + download->info()->name().str()); - else - download->set_root_directory(name + "/" + download->info()->name().str()); -} - torrent::Object apply_d_connection_type(core::Download* download, const std::string& name) { torrent::Download::ConnectionType t = @@ -718,7 +708,7 @@ CMD2_DL_V ("d.pause", std::bind(&core::DownloadList::pause_default, control->core()->download_list(), std::placeholders::_1)); CMD2_DL_V ("d.open", std::bind(&core::DownloadList::open_throw, control->core()->download_list(), std::placeholders::_1)); CMD2_DL_V ("d.close", std::bind(&core::DownloadList::close_throw, control->core()->download_list(), std::placeholders::_1)); - CMD2_DL_V ("d.close.directly", std::bind(&core::DownloadList::close_directly, control->core()->download_list(), std::placeholders::_1)); + CMD2_DL_V ("d.close.directly", std::bind(&core::DownloadList::close_files, control->core()->download_list(), std::placeholders::_1)); CMD2_DL_V ("d.erase", std::bind(&core::DownloadList::erase_ptr, control->core()->download_list(), std::placeholders::_1)); CMD2_DL_V ("d.check_hash", std::bind(&core::DownloadList::check_hash, control->core()->download_list(), std::placeholders::_1)); @@ -884,12 +874,11 @@ CMD2_DL_LIST ("d.tracker.insert", std::bind(&download_tracker_insert, std::placeholders::_1, std::placeholders::_2)); CMD2_DL_VALUE_V ("d.tracker.send_scrape", [](auto download, uint64_t arg) { download->tracker_controller().scrape_request(arg); }); - CMD2_DL ("d.directory", CMD2_ON_FL(root_dir)); - CMD2_DL ("d.directory.realpath.or_empty", [](auto* download, auto) { return resolve_path(download->file_list()->root_dir()); }); - CMD2_DL ("d.directory.realpath.or_throw", [](auto* download, auto) { return resolve_path_or_throw(download->file_list()->root_dir()); }); - CMD2_DL_STRING_V("d.directory.set", std::bind(&apply_d_directory, std::placeholders::_1, std::placeholders::_2)); - CMD2_DL ("d.directory_base", CMD2_ON_FL(root_dir)); - CMD2_DL_STRING_V("d.directory_base.set", std::bind(&core::Download::set_root_directory, std::placeholders::_1, std::placeholders::_2)); + CMD2_DL ("d.directory", CMD2_ON_FL(root_dir)); + CMD2_DL ("d.directory.realpath.or_empty", [](auto* download, auto) { return resolve_path(download->file_list()->root_dir()); }); + CMD2_DL ("d.directory.realpath.or_throw", [](auto* download, auto) { return resolve_path_or_throw(download->file_list()->root_dir()); }); + CMD2_DL_STRING_V("d.directory.set", [](auto* download, auto arg) { download->set_directory(arg); }); + CMD2_DL_STRING_V("d.directory.base.set", [](auto* download, auto arg) { download->set_base_directory(arg); }); CMD2_DL ("d.priority", std::bind(&core::Download::priority, std::placeholders::_1)); CMD2_DL ("d.priority_str", std::bind(&retrieve_d_priority_str, std::placeholders::_1)); @@ -950,7 +939,6 @@ rpc::rpc.mark_safe("d.name.or_base64"); rpc::rpc.mark_safe("d.name.or_as_binary"); rpc::rpc.mark_safe("d.directory"); - rpc::rpc.mark_safe("d.directory_base"); rpc::rpc.mark_safe("d.creation_date"); rpc::rpc.mark_safe("d.load_date"); rpc::rpc.mark_safe("d.up.rate"); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rtorrent-0.16.21/src/command_helpers.cc new/rtorrent-0.16.22/src/command_helpers.cc --- old/rtorrent-0.16.21/src/command_helpers.cc 2026-08-26 09:17:45.000000000 +0200 +++ new/rtorrent-0.16.22/src/command_helpers.cc 2026-09-02 10:22:23.000000000 +0200 @@ -20,6 +20,7 @@ void initialize_command_tracker(); void initialize_command_scheduler(); void initialize_command_string(); +void initialize_command_system(); void initialize_command_ui(); void @@ -39,4 +40,5 @@ initialize_command_tracker(); initialize_command_scheduler(); initialize_command_string(); + initialize_command_system(); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rtorrent-0.16.21/src/command_local.cc new/rtorrent-0.16.22/src/command_local.cc --- old/rtorrent-0.16.21/src/command_local.cc 2026-08-26 09:17:45.000000000 +0200 +++ new/rtorrent-0.16.22/src/command_local.cc 2026-09-02 10:22:23.000000000 +0200 @@ -1,34 +1,16 @@ #include "config.h" -#include <cerrno> -#include <fcntl.h> -#include <functional> -#include <limits> -#include <stdio.h> -#include <unistd.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <torrent/torrent.h> -#include <torrent/data/file_manager.h> -#include <torrent/data/chunk_utils.h> -#include <torrent/runtime/runtime.h> #include <torrent/runtime/memory_manager.h> -#include <torrent/runtime/socket_manager.h> -#include <torrent/utils/chrono.h> -#include <torrent/utils/option_strings.h> +#include <torrent/utils/log.h> +#include "command_helpers.h" +#include "control.h" #include "core/download.h" -#include "core/download_list.h" #include "core/manager.h" #include "rpc/parse_commands.h" +#include "rpc/lua.h" #include "rpc/scgi.h" #include "session/session_manager.h" -#include "utils/file_status_cache.h" - -#include "globals.h" -#include "rpc/lua.h" -#include "control.h" -#include "command_helpers.h" typedef torrent::ChunkManager CM_t; typedef torrent::FileManager FM_t; @@ -44,49 +26,6 @@ return size; } -torrent::Object -system_env(const torrent::Object::string_type& arg) { - if (arg.empty()) - throw torrent::input_error("system.env: Missing variable name."); - - char* val = getenv(arg.c_str()); - return std::string(val ? val : ""); -} - -torrent::Object -system_hostname() { - char buffer[1024]; - - if (gethostname(buffer, 1023) == -1) - throw torrent::input_error("Unable to read hostname."); - -// if (shorten) -// *std::find(buffer, buffer + 1023, '.') = '\0'; - - return std::string(buffer); -} - -torrent::Object -system_get_cwd() { - char* buffer = getcwd(NULL, 0); - - if (buffer == NULL) - throw torrent::input_error("Unable to read cwd."); - - torrent::Object result = torrent::Object(std::string(buffer)); - free(buffer); - - return result; -} - -torrent::Object -system_set_cwd(const torrent::Object::string_type& rawArgs) { - if (::chdir(rawArgs.c_str()) != 0) - throw torrent::input_error("Could not change current working directory."); - - return torrent::Object(); -} - inline torrent::Object::list_const_iterator post_increment(torrent::Object::list_const_iterator& itr, const torrent::Object::list_const_iterator& last) { if (itr == last) @@ -186,104 +125,19 @@ return torrent::Object(); } -uint32_t -checked_socket_value(int64_t value, const char* label) { - if (value < 0 || value > std::numeric_limits<uint32_t>::max()) - throw torrent::input_error(std::string("Invalid ") + label + " value."); - - return static_cast<uint32_t>(value); -} - void initialize_command_local() { - core::DownloadList* dList = control->core()->download_list(); - torrent::FileManager* fileManager = torrent::file_manager(); - - CMD_ANY ("system.hostname", std::bind(&system_hostname)); - CMD_ANY ("system.pid", std::bind(&getpid)); - - CMD_VAR_C_STRING("system.api_version", (int64_t)API_VERSION); - CMD_VAR_C_STRING("system.client_version", PACKAGE_VERSION); - CMD_VAR_C_STRING("system.library_version", torrent::runtime::version()); - - CMD_VAR_VALUE ("system.file.allocate", 0); - CMD_VAR_VALUE ("system.file.max_size", (int64_t)512 << 30); - CMD_VAR_VALUE ("system.file.split_size", -1); - CMD_VAR_STRING ("system.file.split_suffix", ".part"); - - CMD_ANY ("system.file_status_cache.size", std::bind(&utils::FileStatusCache::size, - (utils::FileStatusCache::base_type*)control->core()->file_status_cache())); - CMD_ANY_V ("system.file_status_cache.prune", std::bind(&utils::FileStatusCache::prune, control->core()->file_status_cache())); - - CMD_VAR_BOOL ("file.prioritize_toc", 0); - CMD_VAR_LIST ("file.prioritize_toc.first"); - CMD_VAR_LIST ("file.prioritize_toc.last"); - - CMD_ANY ("system.files.advise_random", std::bind(&FM_t::advise_random, fileManager)); - CMD_ANY_VALUE_V ("system.files.advise_random.set", std::bind(&FM_t::set_advise_random, fileManager, std::placeholders::_2)); - CMD_ANY ("system.files.advise_random.hashing", std::bind(&FM_t::advise_random_hashing, fileManager)); - CMD_ANY_VALUE_V ("system.files.advise_random.hashing.set", std::bind(&FM_t::set_advise_random_hashing, fileManager, std::placeholders::_2)); - CMD_ANY ("system.files.session.fdatasync", [](auto, auto) { return session_thread::manager()->use_fsyncdisk(); }); - CMD_ANY_VALUE_V ("system.files.session.fdatasync.set", [](auto, auto& value) { return session_thread::manager()->set_use_fsyncdisk(value); }); - - CMD_ANY ("system.files.opened_counter", std::bind(&FM_t::files_opened_counter, fileManager)); - CMD_ANY ("system.files.closed_counter", std::bind(&FM_t::files_closed_counter, fileManager)); - CMD_ANY ("system.files.failed_counter", std::bind(&FM_t::files_failed_counter, fileManager)); - - CMD_ANY_STRING ("system.env", [](auto, auto& str) { return system_env(str); }); - - CMD_ANY ("system.time", [](auto, auto) { return torrent::this_thread::cached_seconds().count(); }); - CMD_ANY ("system.time_seconds", [](auto, auto) { return torrent::utils::cast_seconds(torrent::utils::time_since_epoch()).count(); }); - CMD_ANY ("system.time_usec", [](auto, auto) { return torrent::utils::time_since_epoch().count(); }); - - CMD_ANY_VALUE_V ("system.umask.set", [](auto, auto& value) { return ::umask(value); }); - - CMD_VAR_BOOL ("system.daemon", false); - - CMD_ANY_V ("system.shutdown.normal", [](auto, auto) { control->receive_normal_shutdown(); }); - CMD_ANY_V ("system.shutdown.quick", [](auto, auto) { control->receive_quick_shutdown(); }); - - CMD_REDIRECT_NO_EXPORT("system.shutdown", "system.shutdown.normal"); - - CMD_ANY ("system.cwd", [](auto, auto) { return system_get_cwd(); }); - CMD_ANY_STRING ("system.cwd.set", [](auto, auto& str) { return system_set_cwd(str); }); - - CMD_ANY ("system.sockets.size", [](auto, auto) { return torrent::runtime::socket_manager()->size(); }); - CMD_ANY ("system.sockets.max_size", [](auto, auto) { return torrent::runtime::socket_manager()->max_size(); }); - CMD_ANY_VALUE_V ("system.sockets.max_size.set", [](auto, auto& value) { return torrent::runtime::socket_manager()->set_max_size_and_adjust(checked_socket_value(value, "socket max size")); }); - CMD_ANY_V ("system.sockets.adjust_alloc", [](auto, auto) { torrent::runtime::socket_manager()->adjust_allocation(); }); - CMD_ANY ("system.sockets.reserved_alloc", [](auto, auto) { return torrent::runtime::socket_manager()->reserved_allocation(); }); - CMD_ANY ("system.sockets.available_alloc", [](auto, auto) { return torrent::runtime::socket_manager()->available_allocation(); }); - - for (uint32_t i = 0; i < torrent::runtime::SocketManager::category_count; ++i) { - auto category = static_cast<torrent::runtime::socket_manager_category_t>(i); - auto category_name = "system.sockets." + torrent::option_to_str_or_throw(torrent::OPTION_SOCKET_CATEGORY, i); - - CMD_ANY (category_name + ".size", [category](auto, auto) { return torrent::runtime::socket_manager()->category_managed_size(category); }); - CMD_ANY (category_name + ".max_size", [category](auto, auto) { return torrent::runtime::socket_manager()->category_max_size(category); }); - - if (i == 0) { - CMD_ANY (category_name + ".min_alloc", [](auto, auto) { return torrent::runtime::socket_manager()->generic_min_allocation(); }); - continue; - } - - CMD_ANY (category_name + ".max_alloc.limit", [category](auto, auto) { return torrent::runtime::socket_manager()->category_alloc_limit(category); }); - CMD_ANY (category_name + ".min_alloc.limit", [category](auto, auto) { return torrent::runtime::socket_manager()->category_alloc_minimum(category); }); - CMD_ANY (category_name + ".min_alloc", [category](auto, auto) { return torrent::runtime::socket_manager()->category_min_allocation(category); }); - CMD_ANY (category_name + ".max_alloc", [category](auto, auto) { return torrent::runtime::socket_manager()->category_max_allocation(category); }); - CMD_ANY_VALUE_V(category_name + ".min_alloc.set", [category](auto, auto& value) { torrent::runtime::socket_manager()->set_category_min_allocation(category, checked_socket_value(value, "socket min alloc")); }); - CMD_ANY_VALUE_V(category_name + ".max_alloc.set", [category](auto, auto& value) { torrent::runtime::socket_manager()->set_category_max_allocation(category, checked_socket_value(value, "socket max alloc")); }); - } + core::DownloadList* dList = control->core()->download_list(); CMD_ANY ("pieces.sync.always_safe", [](auto, auto) { return torrent::runtime::memory_manager()->safe_sync(); }); CMD_ANY_VALUE_V ("pieces.sync.always_safe.set", [](auto, auto& value) { return torrent::runtime::memory_manager()->set_safe_sync(value); }); CMD_ANY ("pieces.sync.safe_free_diskspace", [](auto, auto) { return torrent::runtime::memory_manager()->sync_safe_free_diskspace(); }); CMD_ANY ("pieces.sync.timeout", [](auto, auto) { return torrent::runtime::memory_manager()->timeout_sync().count(); }); CMD_ANY_VALUE_V ("pieces.sync.timeout.set", [](auto, auto& value) { return torrent::runtime::memory_manager()->set_timeout_sync(value); }); - // CMD_ANY ("pieces.sync.timeout_safe", [](auto, auto) { return torrent::runtime::memory_manager()->timeout_safe_sync(); }); - // CMD_ANY_VALUE_V ("pieces.sync.timeout_safe.set", [](auto, auto& value) { return torrent::runtime::memory_manager()->set_timeout_safe_sync(value); }); CMD_ANY ("pieces.sync.timeout_safe", [](auto, auto) { return 0; }); - CMD_ANY_VALUE_V ("pieces.sync.timeout_safe.set", [](auto, auto) { }); + CMD_ANY_VALUE_V ("pieces.sync.timeout_safe.set", [](auto, auto) { + lt_log_print(torrent::LOG_WARN, "pieces.sync.timeout_safe.set is no longer supported and does nothing."); + }); CMD_ANY ("pieces.sync.queue_size", [](auto, auto) { return torrent::runtime::memory_manager()->sync_queue_block_count(); }); CMD_ANY ("pieces.preload.type", [](auto, auto) { return torrent::runtime::memory_manager()->preload_type(); }); @@ -358,38 +212,6 @@ CMD_ANY_LIST ("group.insert", std::bind(&group_insert, std::placeholders::_2)); - rpc::rpc.mark_safe("system.api_version"); - rpc::rpc.mark_safe("system.client_version"); - rpc::rpc.mark_safe("system.library_version"); - rpc::rpc.mark_safe("system.time"); - rpc::rpc.mark_safe("system.time_seconds"); - rpc::rpc.mark_safe("system.time_usec"); - rpc::rpc.mark_safe("system.file.max_size"); - rpc::rpc.mark_safe("system.file.split_size"); - rpc::rpc.mark_safe("system.file.split_suffix"); - - rpc::rpc.mark_safe("system.sockets.size"); - rpc::rpc.mark_safe("system.sockets.max_size"); - rpc::rpc.mark_safe("system.sockets.reserved_alloc"); - rpc::rpc.mark_safe("system.sockets.available_alloc"); - - for (uint32_t i = 0; i < torrent::runtime::SocketManager::category_count; ++i) { - auto category_name = "system.sockets." + torrent::option_to_str_or_throw(torrent::OPTION_SOCKET_CATEGORY, i); - - rpc::rpc.mark_safe(category_name + ".size"); - rpc::rpc.mark_safe(category_name + ".max_size"); - - if (i == 0) { - rpc::rpc.mark_safe(category_name + ".min_alloc"); - continue; - } - - rpc::rpc.mark_safe(category_name + ".max_alloc.limit"); - rpc::rpc.mark_safe(category_name + ".min_alloc.limit"); - rpc::rpc.mark_safe(category_name + ".min_alloc"); - rpc::rpc.mark_safe(category_name + ".max_alloc"); - } - rpc::rpc.mark_safe("directory.default"); rpc::rpc.mark_safe("session.path"); rpc::rpc.mark_safe("session.path.realpath.or_empty"); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rtorrent-0.16.21/src/command_logging.cc new/rtorrent-0.16.22/src/command_logging.cc --- old/rtorrent-0.16.21/src/command_logging.cc 2026-08-26 09:17:45.000000000 +0200 +++ new/rtorrent-0.16.22/src/command_logging.cc 2026-09-02 10:22:23.000000000 +0200 @@ -135,7 +135,7 @@ CMD2_ANY_LIST ("log.open_gz_file_pid", std::bind(&apply_log_open, log_flag_append_pid | log_flag_use_gz, std::placeholders::_2)); CMD2_ANY_LIST ("log.append_file", std::bind(&apply_log_open, log_flag_append_file, std::placeholders::_2)); CMD2_ANY_LIST ("log.append_file.flush", std::bind(&apply_log_open, log_flag_append_file | log_flag_flush, std::placeholders::_2)); - CMD2_ANY_LIST ("log.append_gz_file", std::bind(&apply_log_open, log_flag_append_file, std::placeholders::_2)); + CMD2_ANY_LIST ("log.append_gz_file", std::bind(&apply_log_open, log_flag_append_file | log_flag_use_gz, std::placeholders::_2)); CMD2_ANY_STRING_V("log.close", std::bind(&torrent::log_close_output_str, std::placeholders::_2)); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rtorrent-0.16.21/src/command_system.cc new/rtorrent-0.16.22/src/command_system.cc --- old/rtorrent-0.16.21/src/command_system.cc 1970-01-01 01:00:00.000000000 +0100 +++ new/rtorrent-0.16.22/src/command_system.cc 2026-09-02 10:22:23.000000000 +0200 @@ -0,0 +1,195 @@ +#include "config.h" + +#include <unistd.h> +#include <sys/stat.h> +#include <torrent/data/file_manager.h> +#include <torrent/runtime/client_config.h> +#include <torrent/runtime/memory_manager.h> +#include <torrent/runtime/socket_manager.h> +#include <torrent/runtime/runtime.h> +#include <torrent/utils/chrono.h> +#include <torrent/utils/option_strings.h> + +#include "command_helpers.h" +#include "control.h" +#include "globals.h" +#include "core/manager.h" +#include "session/session_manager.h" +#include "utils/file_status_cache.h" + + +torrent::Object +system_env(const torrent::Object::string_type& arg) { + if (arg.empty()) + throw torrent::input_error("system.env: Missing variable name."); + + char* val = getenv(arg.c_str()); + return std::string(val ? val : ""); +} + +torrent::Object +system_hostname() { + char buffer[1024]; + + if (gethostname(buffer, 1023) == -1) + throw torrent::input_error("Unable to read hostname."); + +// if (shorten) +// *std::find(buffer, buffer + 1023, '.') = '\0'; + + return std::string(buffer); +} + +torrent::Object +system_get_cwd() { + char* buffer = getcwd(NULL, 0); + + if (buffer == NULL) + throw torrent::input_error("Unable to read cwd."); + + torrent::Object result = torrent::Object(std::string(buffer)); + free(buffer); + + return result; +} + +torrent::Object +system_set_cwd(const torrent::Object::string_type& rawArgs) { + if (::chdir(rawArgs.c_str()) != 0) + throw torrent::input_error("Could not change current working directory."); + + return torrent::Object(); +} + +uint32_t +checked_socket_value(int64_t value, const char* label) { + if (value < 0 || value > std::numeric_limits<uint32_t>::max()) + throw torrent::input_error(std::string("Invalid ") + label + " value."); + + return static_cast<uint32_t>(value); +} + +void +initialize_command_system() { + CMD_ANY ("system.hostname", std::bind(&system_hostname)); + CMD_ANY ("system.pid", std::bind(&getpid)); + + CMD_VAR_C_STRING("system.api_version", (int64_t)API_VERSION); + CMD_VAR_C_STRING("system.client_version", PACKAGE_VERSION); + CMD_VAR_C_STRING("system.library_version", torrent::runtime::version()); + + CMD_ANY ("system.torrent_name.use_sanitized", [](auto, auto) { return torrent::runtime::client_config()->torrent_name_use_sanitized(); }); + CMD_ANY_VALUE_V ("system.torrent_name.use_sanitized.set", [](auto, auto& value) { return torrent::runtime::client_config()->set_torrent_name_use_sanitized(value); }); + + CMD_VAR_VALUE ("system.file.allocate", 0); + CMD_VAR_VALUE ("system.file.max_size", (int64_t)512 << 30); + CMD_VAR_VALUE ("system.file.split_size", -1); + CMD_VAR_STRING ("system.file.split_suffix", ".part"); + + CMD_ANY ("system.file_name.replace_slash", [](auto, auto) { return torrent::runtime::client_config()->file_name_replace_slash(); }); + CMD_ANY_STRING_V("system.file_name.replace_slash.set", [](auto, auto& str) { return torrent::runtime::client_config()->set_file_name_replace_slash(str); }); + + CMD_ANY ("system.file_status_cache.size", [](auto, auto) { return control->core()->file_status_cache()->size(); }); + CMD_ANY_V ("system.file_status_cache.prune", [](auto, auto) { return control->core()->file_status_cache()->prune(); }); + + CMD_VAR_BOOL ("file.prioritize_toc", 0); + CMD_VAR_LIST ("file.prioritize_toc.first"); + CMD_VAR_LIST ("file.prioritize_toc.last"); + + CMD_ANY ("system.files.advise_random", [](auto, auto) { return torrent::file_manager()->advise_random(); }); + CMD_ANY_VALUE_V ("system.files.advise_random.set", [](auto, auto& value) { return torrent::file_manager()->set_advise_random(value); }); + CMD_ANY ("system.files.advise_random.hashing", [](auto, auto) { return torrent::file_manager()->advise_random_hashing(); }); + CMD_ANY_VALUE_V ("system.files.advise_random.hashing.set", [](auto, auto& value) { return torrent::file_manager()->set_advise_random_hashing(value); }); + CMD_ANY ("system.files.session.fdatasync", [](auto, auto) { return session_thread::manager()->use_fsyncdisk(); }); + CMD_ANY_VALUE_V ("system.files.session.fdatasync.set", [](auto, auto& value) { return session_thread::manager()->set_use_fsyncdisk(value); }); + + CMD_ANY ("system.files.close_idle", [](auto, auto) { return torrent::file_manager()->close_idle_timeout().count(); }); + CMD_ANY_VALUE_V ("system.files.close_idle.set", [](auto, auto& value) { return torrent::file_manager()->set_close_idle_timeout(value * 1s); }); + + CMD_ANY ("system.files.opened_counter", [](auto, auto) { return torrent::file_manager()->files_opened_counter(); }); + CMD_ANY ("system.files.closed_counter", [](auto, auto) { return torrent::file_manager()->files_closed_counter(); }); + CMD_ANY ("system.files.failed_counter", [](auto, auto) { return torrent::file_manager()->files_failed_counter(); }); + + CMD_ANY_STRING ("system.env", [](auto, auto& str) { return system_env(str); }); + + CMD_ANY ("system.time", [](auto, auto) { return torrent::this_thread::cached_seconds().count(); }); + CMD_ANY ("system.time_seconds", [](auto, auto) { return torrent::utils::cast_seconds(torrent::utils::time_since_epoch()).count(); }); + CMD_ANY ("system.time_usec", [](auto, auto) { return torrent::utils::time_since_epoch().count(); }); + + CMD_ANY_VALUE_V ("system.umask.set", [](auto, auto& value) { return ::umask(value); }); + + CMD_VAR_BOOL ("system.daemon", false); + + CMD_ANY_V ("system.shutdown.normal", [](auto, auto) { control->receive_normal_shutdown(); }); + CMD_ANY_V ("system.shutdown.quick", [](auto, auto) { control->receive_quick_shutdown(); }); + + CMD_REDIRECT_NO_EXPORT("system.shutdown", "system.shutdown.normal"); + + CMD_ANY ("system.cwd", [](auto, auto) { return system_get_cwd(); }); + CMD_ANY_STRING ("system.cwd.set", [](auto, auto& str) { return system_set_cwd(str); }); + + CMD_ANY ("system.sockets.size", [](auto, auto) { return torrent::runtime::socket_manager()->size(); }); + CMD_ANY ("system.sockets.max_size", [](auto, auto) { return torrent::runtime::socket_manager()->max_size(); }); + CMD_ANY_VALUE_V ("system.sockets.max_size.set", [](auto, auto& value) { + return torrent::runtime::socket_manager()->set_max_size_and_adjust(checked_socket_value(value, "socket max size")); + }); + CMD_ANY_V ("system.sockets.adjust_alloc", [](auto, auto) { torrent::runtime::socket_manager()->adjust_allocation(); }); + CMD_ANY ("system.sockets.reserved_alloc", [](auto, auto) { return torrent::runtime::socket_manager()->reserved_allocation(); }); + CMD_ANY ("system.sockets.available_alloc", [](auto, auto) { return torrent::runtime::socket_manager()->available_allocation(); }); + + for (uint32_t i = 0; i < torrent::runtime::SocketManager::category_count; ++i) { + auto category = static_cast<torrent::runtime::socket_manager_category_t>(i); + auto category_name = "system.sockets." + torrent::option_to_str_or_throw(torrent::OPTION_SOCKET_CATEGORY, i); + + CMD_ANY (category_name + ".size", [category](auto, auto) { return torrent::runtime::socket_manager()->category_managed_size(category); }); + CMD_ANY (category_name + ".max_size", [category](auto, auto) { return torrent::runtime::socket_manager()->category_max_size(category); }); + + if (i == 0) { + CMD_ANY (category_name + ".min_alloc", [](auto, auto) { return torrent::runtime::socket_manager()->generic_min_allocation(); }); + continue; + } + + CMD_ANY (category_name + ".max_alloc.limit", [category](auto, auto) { return torrent::runtime::socket_manager()->category_alloc_limit(category); }); + CMD_ANY (category_name + ".min_alloc.limit", [category](auto, auto) { return torrent::runtime::socket_manager()->category_alloc_minimum(category); }); + CMD_ANY (category_name + ".min_alloc", [category](auto, auto) { return torrent::runtime::socket_manager()->category_min_allocation(category); }); + CMD_ANY (category_name + ".max_alloc", [category](auto, auto) { return torrent::runtime::socket_manager()->category_max_allocation(category); }); + CMD_ANY_VALUE_V(category_name + ".min_alloc.set", [category](auto, auto& value) { + torrent::runtime::socket_manager()->set_category_min_allocation(category, checked_socket_value(value, "socket min alloc")); + }); + CMD_ANY_VALUE_V(category_name + ".max_alloc.set", [category](auto, auto& value) { + torrent::runtime::socket_manager()->set_category_max_allocation(category, checked_socket_value(value, "socket max alloc")); + }); + } + + rpc::rpc.mark_safe("system.api_version"); + rpc::rpc.mark_safe("system.client_version"); + rpc::rpc.mark_safe("system.library_version"); + rpc::rpc.mark_safe("system.time"); + rpc::rpc.mark_safe("system.time_seconds"); + rpc::rpc.mark_safe("system.time_usec"); + rpc::rpc.mark_safe("system.file.max_size"); + rpc::rpc.mark_safe("system.file.split_size"); + rpc::rpc.mark_safe("system.file.split_suffix"); + + rpc::rpc.mark_safe("system.sockets.size"); + rpc::rpc.mark_safe("system.sockets.max_size"); + rpc::rpc.mark_safe("system.sockets.reserved_alloc"); + rpc::rpc.mark_safe("system.sockets.available_alloc"); + + for (uint32_t i = 0; i < torrent::runtime::SocketManager::category_count; ++i) { + auto category_name = "system.sockets." + torrent::option_to_str_or_throw(torrent::OPTION_SOCKET_CATEGORY, i); + + rpc::rpc.mark_safe(category_name + ".size"); + rpc::rpc.mark_safe(category_name + ".max_size"); + + if (i == 0) { + rpc::rpc.mark_safe(category_name + ".min_alloc"); + continue; + } + + rpc::rpc.mark_safe(category_name + ".max_alloc.limit"); + rpc::rpc.mark_safe(category_name + ".min_alloc.limit"); + rpc::rpc.mark_safe(category_name + ".min_alloc"); + rpc::rpc.mark_safe(category_name + ".max_alloc"); + } +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rtorrent-0.16.21/src/control.h new/rtorrent-0.16.22/src/control.h --- old/rtorrent-0.16.21/src/control.h 2026-08-26 09:17:45.000000000 +0200 +++ new/rtorrent-0.16.22/src/control.h 2026-09-02 10:22:23.000000000 +0200 @@ -118,4 +118,6 @@ std::atomic<bool> m_shutdown_quick{}; }; +extern Control* control; + #endif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rtorrent-0.16.21/src/core/download.cc new/rtorrent-0.16.22/src/core/download.cc --- old/rtorrent-0.16.21/src/core/download.cc 2026-08-26 09:17:45.000000000 +0200 +++ new/rtorrent-0.16.22/src/core/download.cc 2026-09-02 10:22:23.000000000 +0200 @@ -101,7 +101,18 @@ } void -Download::set_root_directory(const std::string& path) { +Download::set_directory(const std::string& path) { + if (!m_download.file_list()->is_multi_file()) + return set_base_directory(path); + + if (path.empty() || *path.rbegin() == '/') + return set_base_directory(path + m_download.info()->name_sanitized()); + + set_base_directory(path + "/" + m_download.info()->name_sanitized()); +} + +void +Download::set_base_directory(const std::string& path) { // If the download is open, hashed and has completed chunks make // sure to verify that the download files are still present. // @@ -120,13 +131,12 @@ !file_stat.update(file_list->front()->frozen_path().str()))) { set_message("Cannot change the directory of an open download after the files have been moved."); - rpc::call_command("d.state.set", (int64_t)0, rpc::make_target(this)); control->core()->download_list()->close_directly(this); throw torrent::input_error("Cannot change the directory of an open download after the files have been moved."); } - control->core()->download_list()->close_directly(this); + control->core()->download_list()->close_files(this); file_list->set_root_dir(expand_path(path)); bencode()->get_key("rtorrent").insert_key("directory", path); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rtorrent-0.16.21/src/core/download.h new/rtorrent-0.16.22/src/core/download.h --- old/rtorrent-0.16.21/src/core/download.h 2026-08-26 09:17:45.000000000 +0200 +++ new/rtorrent-0.16.22/src/core/download.h 2026-09-02 10:22:23.000000000 +0200 @@ -79,7 +79,8 @@ uint32_t resume_flags() { return m_resumeFlags; } void set_resume_flags(uint32_t flags) { m_resumeFlags = flags; } - void set_root_directory(const std::string& path); + void set_directory(const std::string& path); + void set_base_directory(const std::string& path); void set_throttle_name(const std::string& name); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rtorrent-0.16.21/src/core/download_list.cc new/rtorrent-0.16.22/src/core/download_list.cc --- old/rtorrent-0.16.21/src/core/download_list.cc 2026-08-26 09:17:45.000000000 +0200 +++ new/rtorrent-0.16.22/src/core/download_list.cc 2026-09-02 10:22:23.000000000 +0200 @@ -254,9 +254,11 @@ } } +// Releases the files without changing the download's state, for callers that +// need the files closed and will keep using the download. void -DownloadList::close_directly(Download* download) { - lt_log_print_info(torrent::LOG_TORRENT_INFO, download->info(), "download_list", "Closing download directly."); +DownloadList::close_files(Download* download) { + lt_log_print_info(torrent::LOG_TORRENT_INFO, download->info(), "download_list", "Closing download files."); if (download->download()->info()->is_active()) { download->download()->stop(torrent::Download::stop_skip_tracker); @@ -270,6 +272,44 @@ } void +DownloadList::close_directly(Download* download) { + lt_log_print_info(torrent::LOG_TORRENT_INFO, download->info(), "download_list", "Closing download directly."); + + bool was_active = download->download()->info()->is_active(); + bool was_open = download->download()->info()->is_open(); + + close_files(download); + set_state_stopped(download); + + if (was_active) { + DL_TRIGGER_EVENT(download, "event.download.paused"); + update_paused_state(download); + } + + if (was_open) { + DL_TRIGGER_EVENT(download, "event.download.hash_removed"); + DL_TRIGGER_EVENT(download, "event.download.closed"); + } +} + +void +DownloadList::set_state_stopped(Download* download) { + control->view_manager()->find_ptr_throw("stopped")->set_visible(download); + rpc::call_command("d.state.set", (int64_t)0, rpc::make_target(download)); +} + +void +DownloadList::update_paused_state(Download* download) { + rpc::call_command("d.state_changed.set", torrent::this_thread::cached_seconds().count(), rpc::make_target(download)); + rpc::call_command("d.state_counter.set", rpc::call_command_value("d.state_counter", rpc::make_target(download)), rpc::make_target(download)); + + // If initial seeding is complete, don't try it again when restarting. + if (download->is_done() && + rpc::call_command("d.connection_current", torrent::Object(), rpc::make_target(download)).as_string() == "initial_seed") + rpc::call_command("d.connection_seed.set", rpc::call_command("d.connection_current", torrent::Object(), rpc::make_target(download)), rpc::make_target(download)); +} + +void DownloadList::close_quick(Download* download) { lt_log_print_info(torrent::LOG_TORRENT_INFO, download->info(), "download_list", "Closing download quickly."); close(download); @@ -443,15 +483,7 @@ // view. DL_TRIGGER_EVENT(download, "event.download.paused"); - auto cached_seconds = torrent::this_thread::cached_seconds().count(); - - rpc::call_command("d.state_changed.set", cached_seconds, rpc::make_target(download)); - rpc::call_command("d.state_counter.set", rpc::call_command_value("d.state_counter", rpc::make_target(download)), rpc::make_target(download)); - - // If initial seeding is complete, don't try it again when restarting. - if (download->is_done() && - rpc::call_command("d.connection_current", torrent::Object(), rpc::make_target(download)).as_string() == "initial_seed") - rpc::call_command("d.connection_seed.set", rpc::call_command("d.connection_current", torrent::Object(), rpc::make_target(download)), rpc::make_target(download)); + update_paused_state(download); // Save the state after all the slots, etc have been called so we // include the modifications they may make. @@ -522,7 +554,7 @@ // If the download was previously completed but the files were // f.ex deleted, then we clear the state and complete. if (rpc::call_command_value("d.complete", rpc::make_target(download)) && !download->is_done()) { - rpc::call_command("d.state.set", (int64_t)0, rpc::make_target(download)); + set_state_stopped(download); download->set_message("Download registered as completed, but hash check returned unfinished chunks."); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rtorrent-0.16.21/src/core/download_list.h new/rtorrent-0.16.22/src/core/download_list.h --- old/rtorrent-0.16.21/src/core/download_list.h 2026-08-26 09:17:45.000000000 +0200 +++ new/rtorrent-0.16.22/src/core/download_list.h 2026-09-02 10:22:23.000000000 +0200 @@ -75,6 +75,7 @@ void close(Download* d); void close_directly(Download* d); + void close_files(Download* d); void close_quick(Download* d); void close_throw(Download* d); @@ -132,6 +133,9 @@ void hash_done(Download* d); void hash_queue(Download* d, int type); + void set_state_stopped(Download* d); + void update_paused_state(Download* d); + inline void check_contains(Download* d); void received_finished(Download* d); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rtorrent-0.16.21/src/main.cc new/rtorrent-0.16.22/src/main.cc --- old/rtorrent-0.16.21/src/main.cc 2026-08-26 09:17:45.000000000 +0200 +++ new/rtorrent-0.16.22/src/main.cc 2026-09-02 10:22:23.000000000 +0200 @@ -379,6 +379,12 @@ lt_log_print(torrent::LOG_WARN, "network.max_open_files.set is deprecated, use system.sockets.files.min_alloc.set instead."); }); + // TODO: Keep d.directory_base for a while as it is widely used. + CMD_REDIRECT("d.directory_base", "d.directory"); + CMD_REDIRECT("d.directory_base.set", "d.directory.base.set"); + + rpc::rpc.mark_safe("d.directory_base"); + // if (rpc::call_command_value("method.use_intermediate") == 1) { // } else if (rpc::call_command_value("method.use_intermediate") == 2) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rtorrent-0.16.21/src/rpc/rpc_manager.cc new/rtorrent-0.16.22/src/rpc/rpc_manager.cc --- old/rtorrent-0.16.21/src/rpc/rpc_manager.cc 2026-08-26 09:17:45.000000000 +0200 +++ new/rtorrent-0.16.22/src/rpc/rpc_manager.cc 2026-09-02 10:22:23.000000000 +0200 @@ -168,6 +168,14 @@ } void +RpcManager::set_size_limit(uint64_t size) { + if (size > SCgiTask::max_content_size) + throw torrent::input_error("XMLRPC size limit cannot exceed the SCGI content size limit."); + + m_xmlrpc.set_size_limit(size); +} + +void RpcManager::insert_command(const char* name, const char* parm, const char* doc) { m_xmlrpc.insert_command(name, parm, doc); m_jsonrpc.insert_command(name, parm, doc); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rtorrent-0.16.21/src/rpc/rpc_manager.h new/rtorrent-0.16.22/src/rpc/rpc_manager.h --- old/rtorrent-0.16.21/src/rpc/rpc_manager.h 2026-08-26 09:17:45.000000000 +0200 +++ new/rtorrent-0.16.22/src/rpc/rpc_manager.h 2026-09-02 10:22:23.000000000 +0200 @@ -62,7 +62,7 @@ void cleanup(); int64_t size_limit() { return m_xmlrpc.size_limit(); }; - void set_size_limit(uint64_t size) { m_xmlrpc.set_size_limit(size); }; + void set_size_limit(uint64_t size); int dialect() { return m_xmlrpc.dialect(); } void set_dialect(int dialect) { m_xmlrpc.set_dialect(dialect); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rtorrent-0.16.21/src/rpc/xmlrpc_c.cc new/rtorrent-0.16.22/src/rpc/xmlrpc_c.cc --- old/rtorrent-0.16.21/src/rpc/xmlrpc_c.cc 2026-08-26 09:17:45.000000000 +0200 +++ new/rtorrent-0.16.22/src/rpc/xmlrpc_c.cc 2026-09-02 10:22:23.000000000 +0200 @@ -529,9 +529,6 @@ void XmlRpc::set_size_limit(uint64_t size) { - if (size >= (64 << 20)) - throw torrent::input_error("Invalid XMLRPC limit size."); - xmlrpc_limit_set(XMLRPC_XML_SIZE_LIMIT_ID, size); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rtorrent-0.16.21/src/session/session_manager.h new/rtorrent-0.16.22/src/session/session_manager.h --- old/rtorrent-0.16.21/src/session/session_manager.h 2026-08-26 09:17:45.000000000 +0200 +++ new/rtorrent-0.16.22/src/session/session_manager.h 2026-09-02 10:22:23.000000000 +0200 @@ -126,7 +126,7 @@ inline bool SessionManager::is_used() const { return !m_path.empty(); } inline std::string SessionManager::path() const { return m_path; } -inline bool SessionManager::use_fsyncdisk() const { return true; } +inline bool SessionManager::use_fsyncdisk() const { return m_use_fsyncdisk; } inline bool SessionManager::use_lock() const { return m_use_lock; } inline void SessionManager::flush_all_pending_builds() { process_pending_builds(true); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rtorrent-0.16.21/src/utils/gzip.h new/rtorrent-0.16.22/src/utils/gzip.h --- old/rtorrent-0.16.21/src/utils/gzip.h 2026-08-26 09:17:45.000000000 +0200 +++ new/rtorrent-0.16.22/src/utils/gzip.h 2026-09-02 10:22:23.000000000 +0200 @@ -2,6 +2,7 @@ #define RTORRENT_UTILS_GZIP_H #include <functional> +#include <vector> namespace utils { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rtorrent-0.16.21/test/Makefile.am new/rtorrent-0.16.22/test/Makefile.am --- old/rtorrent-0.16.21/test/Makefile.am 2026-08-26 09:17:45.000000000 +0200 +++ new/rtorrent-0.16.22/test/Makefile.am 2026-09-02 10:22:23.000000000 +0200 @@ -51,8 +51,8 @@ rtorrent_Test_Src_SOURCES = $(rtorrent_Test_Common) \ src/test_command_dynamic.cc \ src/test_command_dynamic.h \ - src/test_command_local.cc \ - src/test_command_local.h \ + src/test_command_system.cc \ + src/test_command_system.h \ src/test_command_path.cc \ src/test_command_path.h \ src/test_command_string.cc \ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rtorrent-0.16.21/test/Makefile.in new/rtorrent-0.16.22/test/Makefile.in --- old/rtorrent-0.16.21/test/Makefile.in 2026-08-26 09:35:41.000000000 +0200 +++ new/rtorrent-0.16.22/test/Makefile.in 2026-09-02 10:40:39.000000000 +0200 @@ -152,7 +152,7 @@ helpers/rtorrent_Test_Src-test_thread.$(OBJEXT) am_rtorrent_Test_Src_OBJECTS = $(am__objects_2) \ src/rtorrent_Test_Src-test_command_dynamic.$(OBJEXT) \ - src/rtorrent_Test_Src-test_command_local.$(OBJEXT) \ + src/rtorrent_Test_Src-test_command_system.$(OBJEXT) \ src/rtorrent_Test_Src-test_command_path.$(OBJEXT) \ src/rtorrent_Test_Src-test_command_string.$(OBJEXT) \ src/rtorrent_Test_Src-test_watch_ready_queue.$(OBJEXT) @@ -200,9 +200,9 @@ rpc/$(DEPDIR)/rtorrent_Test_Rpc-test_parse_options.Po \ rpc/$(DEPDIR)/rtorrent_Test_Rpc-test_xmlrpc.Po \ src/$(DEPDIR)/rtorrent_Test_Src-test_command_dynamic.Po \ - src/$(DEPDIR)/rtorrent_Test_Src-test_command_local.Po \ src/$(DEPDIR)/rtorrent_Test_Src-test_command_path.Po \ src/$(DEPDIR)/rtorrent_Test_Src-test_command_string.Po \ + src/$(DEPDIR)/rtorrent_Test_Src-test_command_system.Po \ src/$(DEPDIR)/rtorrent_Test_Src-test_watch_ready_queue.Po am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ @@ -686,8 +686,8 @@ rtorrent_Test_Src_SOURCES = $(rtorrent_Test_Common) \ src/test_command_dynamic.cc \ src/test_command_dynamic.h \ - src/test_command_local.cc \ - src/test_command_local.h \ + src/test_command_system.cc \ + src/test_command_system.h \ src/test_command_path.cc \ src/test_command_path.h \ src/test_command_string.cc \ @@ -801,7 +801,7 @@ @: >>src/$(DEPDIR)/$(am__dirstamp) src/rtorrent_Test_Src-test_command_dynamic.$(OBJEXT): \ src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) -src/rtorrent_Test_Src-test_command_local.$(OBJEXT): \ +src/rtorrent_Test_Src-test_command_system.$(OBJEXT): \ src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) src/rtorrent_Test_Src-test_command_path.$(OBJEXT): \ src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) @@ -846,9 +846,9 @@ @AMDEP_TRUE@@am__include@ @am__quote@rpc/$(DEPDIR)/rtorrent_Test_Rpc-test_parse_options.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@rpc/$(DEPDIR)/rtorrent_Test_Rpc-test_xmlrpc.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/rtorrent_Test_Src-test_command_dynamic.Po@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/rtorrent_Test_Src-test_command_local.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/rtorrent_Test_Src-test_command_path.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/rtorrent_Test_Src-test_command_string.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/rtorrent_Test_Src-test_command_system.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/rtorrent_Test_Src-test_watch_ready_queue.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @@ -1203,19 +1203,19 @@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtorrent_Test_Src_CXXFLAGS) $(CXXFLAGS) -c -o src/rtorrent_Test_Src-test_command_dynamic.obj `if test -f 'src/test_command_dynamic.cc'; then $(CYGPATH_W) 'src/test_command_dynamic.cc'; else $(CYGPATH_W) '$(srcdir)/src/test_command_dynamic.cc'; fi` -src/rtorrent_Test_Src-test_command_local.o: src/test_command_local.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtorrent_Test_Src_CXXFLAGS) $(CXXFLAGS) -MT src/rtorrent_Test_Src-test_command_local.o -MD -MP -MF src/$(DEPDIR)/rtorrent_Test_Src-test_command_local.Tpo -c -o src/rtorrent_Test_Src-test_command_local.o `test -f 'src/test_command_local.cc' || echo '$(srcdir)/'`src/test_command_local.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/rtorrent_Test_Src-test_command_local.Tpo src/$(DEPDIR)/rtorrent_Test_Src-test_command_local.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/test_command_local.cc' object='src/rtorrent_Test_Src-test_command_local.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtorrent_Test_Src_CXXFLAGS) $(CXXFLAGS) -c -o src/rtorrent_Test_Src-test_command_local.o `test -f 'src/test_command_local.cc' || echo '$(srcdir)/'`src/test_command_local.cc - -src/rtorrent_Test_Src-test_command_local.obj: src/test_command_local.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtorrent_Test_Src_CXXFLAGS) $(CXXFLAGS) -MT src/rtorrent_Test_Src-test_command_local.obj -MD -MP -MF src/$(DEPDIR)/rtorrent_Test_Src-test_command_local.Tpo -c -o src/rtorrent_Test_Src-test_command_local.obj `if test -f 'src/test_command_local.cc'; then $(CYGPATH_W) 'src/test_command_local.cc'; else $(CYGPATH_W) '$(srcdir)/src/test_command_local.cc'; fi` -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/rtorrent_Test_Src-test_command_local.Tpo src/$(DEPDIR)/rtorrent_Test_Src-test_command_local.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/test_command_local.cc' object='src/rtorrent_Test_Src-test_command_local.obj' libtool=no @AMDEPBACKSLASH@ +src/rtorrent_Test_Src-test_command_system.o: src/test_command_system.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtorrent_Test_Src_CXXFLAGS) $(CXXFLAGS) -MT src/rtorrent_Test_Src-test_command_system.o -MD -MP -MF src/$(DEPDIR)/rtorrent_Test_Src-test_command_system.Tpo -c -o src/rtorrent_Test_Src-test_command_system.o `test -f 'src/test_command_system.cc' || echo '$(srcdir)/'`src/test_command_system.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/rtorrent_Test_Src-test_command_system.Tpo src/$(DEPDIR)/rtorrent_Test_Src-test_command_system.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/test_command_system.cc' object='src/rtorrent_Test_Src-test_command_system.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtorrent_Test_Src_CXXFLAGS) $(CXXFLAGS) -c -o src/rtorrent_Test_Src-test_command_system.o `test -f 'src/test_command_system.cc' || echo '$(srcdir)/'`src/test_command_system.cc + +src/rtorrent_Test_Src-test_command_system.obj: src/test_command_system.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtorrent_Test_Src_CXXFLAGS) $(CXXFLAGS) -MT src/rtorrent_Test_Src-test_command_system.obj -MD -MP -MF src/$(DEPDIR)/rtorrent_Test_Src-test_command_system.Tpo -c -o src/rtorrent_Test_Src-test_command_system.obj `if test -f 'src/test_command_system.cc'; then $(CYGPATH_W) 'src/test_command_system.cc'; else $(CYGPATH_W) '$(srcdir)/src/test_command_system.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/rtorrent_Test_Src-test_command_system.Tpo src/$(DEPDIR)/rtorrent_Test_Src-test_command_system.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/test_command_system.cc' object='src/rtorrent_Test_Src-test_command_system.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtorrent_Test_Src_CXXFLAGS) $(CXXFLAGS) -c -o src/rtorrent_Test_Src-test_command_local.obj `if test -f 'src/test_command_local.cc'; then $(CYGPATH_W) 'src/test_command_local.cc'; else $(CYGPATH_W) '$(srcdir)/src/test_command_local.cc'; fi` +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtorrent_Test_Src_CXXFLAGS) $(CXXFLAGS) -c -o src/rtorrent_Test_Src-test_command_system.obj `if test -f 'src/test_command_system.cc'; then $(CYGPATH_W) 'src/test_command_system.cc'; else $(CYGPATH_W) '$(srcdir)/src/test_command_system.cc'; fi` src/rtorrent_Test_Src-test_command_path.o: src/test_command_path.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtorrent_Test_Src_CXXFLAGS) $(CXXFLAGS) -MT src/rtorrent_Test_Src-test_command_path.o -MD -MP -MF src/$(DEPDIR)/rtorrent_Test_Src-test_command_path.Tpo -c -o src/rtorrent_Test_Src-test_command_path.o `test -f 'src/test_command_path.cc' || echo '$(srcdir)/'`src/test_command_path.cc @@ -1618,9 +1618,9 @@ -rm -f rpc/$(DEPDIR)/rtorrent_Test_Rpc-test_parse_options.Po -rm -f rpc/$(DEPDIR)/rtorrent_Test_Rpc-test_xmlrpc.Po -rm -f src/$(DEPDIR)/rtorrent_Test_Src-test_command_dynamic.Po - -rm -f src/$(DEPDIR)/rtorrent_Test_Src-test_command_local.Po -rm -f src/$(DEPDIR)/rtorrent_Test_Src-test_command_path.Po -rm -f src/$(DEPDIR)/rtorrent_Test_Src-test_command_string.Po + -rm -f src/$(DEPDIR)/rtorrent_Test_Src-test_command_system.Po -rm -f src/$(DEPDIR)/rtorrent_Test_Src-test_watch_ready_queue.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ @@ -1690,9 +1690,9 @@ -rm -f rpc/$(DEPDIR)/rtorrent_Test_Rpc-test_parse_options.Po -rm -f rpc/$(DEPDIR)/rtorrent_Test_Rpc-test_xmlrpc.Po -rm -f src/$(DEPDIR)/rtorrent_Test_Src-test_command_dynamic.Po - -rm -f src/$(DEPDIR)/rtorrent_Test_Src-test_command_local.Po -rm -f src/$(DEPDIR)/rtorrent_Test_Src-test_command_path.Po -rm -f src/$(DEPDIR)/rtorrent_Test_Src-test_command_string.Po + -rm -f src/$(DEPDIR)/rtorrent_Test_Src-test_command_system.Po -rm -f src/$(DEPDIR)/rtorrent_Test_Src-test_watch_ready_queue.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rtorrent-0.16.21/test/src/test_command_local.cc new/rtorrent-0.16.22/test/src/test_command_local.cc --- old/rtorrent-0.16.21/test/src/test_command_local.cc 2026-08-26 09:17:45.000000000 +0200 +++ new/rtorrent-0.16.22/test/src/test_command_local.cc 1970-01-01 01:00:00.000000000 +0100 @@ -1,54 +0,0 @@ -#include "config.h" - -#include "test/src/test_command_local.h" - -#include <torrent/torrent.h> -#include <torrent/runtime/socket_manager.h> -#include <torrent/utils/option_strings.h> - -#include "control.h" -#include "globals.h" -#include "rpc/parse_commands.h" - -CPPUNIT_TEST_SUITE_REGISTRATION(TestCommandLocal); - -void initialize_command_local(); - -void -TestCommandLocal::setUp() { - torrent::initialize_main_thread(); - torrent::initialize(); - - if (control == nullptr) - control = new Control; - - if (!rpc::commands.has("system.sockets.size")) - initialize_command_local(); -} - -void -TestCommandLocal::tearDown() { - torrent::cleanup(); -} - -void -TestCommandLocal::test_socket_category_commands() { - for (uint32_t i = 0; i < torrent::runtime::SocketManager::category_count; ++i) { - auto category = static_cast<torrent::runtime::socket_manager_category_t>(i); - auto name = "system.sockets." + torrent::option_to_str_or_throw(torrent::OPTION_SOCKET_CATEGORY, i); - - for (const auto suffix : {".size", ".max_size", ".min_alloc", ".max_alloc"}) - if (rpc::commands.has(name + suffix)) - CPPUNIT_ASSERT_NO_THROW(rpc::commands.call(name + suffix)); - - const bool has_allocation = category != torrent::runtime::category_generic; - - CPPUNIT_ASSERT(rpc::commands.has(name + ".size")); - CPPUNIT_ASSERT(rpc::commands.has(name + ".max_size")); - CPPUNIT_ASSERT(rpc::commands.has(name + ".min_alloc")); - - CPPUNIT_ASSERT_EQUAL(has_allocation, rpc::commands.has(name + ".max_alloc")); - CPPUNIT_ASSERT_EQUAL(has_allocation, rpc::commands.has(name + ".min_alloc.set")); - CPPUNIT_ASSERT_EQUAL(has_allocation, rpc::commands.has(name + ".max_alloc.set")); - } -} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rtorrent-0.16.21/test/src/test_command_local.h new/rtorrent-0.16.22/test/src/test_command_local.h --- old/rtorrent-0.16.21/test/src/test_command_local.h 2026-08-26 09:17:45.000000000 +0200 +++ new/rtorrent-0.16.22/test/src/test_command_local.h 1970-01-01 01:00:00.000000000 +0100 @@ -1,15 +0,0 @@ -#include "test/helpers/test_fixture.h" - -class TestCommandLocal : public test_fixture { - CPPUNIT_TEST_SUITE(TestCommandLocal); - - CPPUNIT_TEST(test_socket_category_commands); - - CPPUNIT_TEST_SUITE_END(); - -public: - void setUp(); - void tearDown(); - - void test_socket_category_commands(); -}; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rtorrent-0.16.21/test/src/test_command_system.cc new/rtorrent-0.16.22/test/src/test_command_system.cc --- old/rtorrent-0.16.21/test/src/test_command_system.cc 1970-01-01 01:00:00.000000000 +0100 +++ new/rtorrent-0.16.22/test/src/test_command_system.cc 2026-09-02 10:22:23.000000000 +0200 @@ -0,0 +1,54 @@ +#include "config.h" + +#include "test/src/test_command_system.h" + +#include <torrent/torrent.h> +#include <torrent/runtime/socket_manager.h> +#include <torrent/utils/option_strings.h> + +#include "control.h" +#include "globals.h" +#include "rpc/parse_commands.h" + +CPPUNIT_TEST_SUITE_REGISTRATION(TestCommandSystem); + +void initialize_command_system(); + +void +TestCommandSystem::setUp() { + torrent::initialize_main_thread(); + torrent::initialize(); + + if (control == nullptr) + control = new Control; + + if (!rpc::commands.has("system.sockets.size")) + initialize_command_system(); +} + +void +TestCommandSystem::tearDown() { + torrent::cleanup(); +} + +void +TestCommandSystem::test_socket_category_commands() { + for (uint32_t i = 0; i < torrent::runtime::SocketManager::category_count; ++i) { + auto category = static_cast<torrent::runtime::socket_manager_category_t>(i); + auto name = "system.sockets." + torrent::option_to_str_or_throw(torrent::OPTION_SOCKET_CATEGORY, i); + + for (const auto suffix : {".size", ".max_size", ".min_alloc", ".max_alloc"}) + if (rpc::commands.has(name + suffix)) + CPPUNIT_ASSERT_NO_THROW(rpc::commands.call(name + suffix)); + + const bool has_allocation = category != torrent::runtime::category_generic; + + CPPUNIT_ASSERT(rpc::commands.has(name + ".size")); + CPPUNIT_ASSERT(rpc::commands.has(name + ".max_size")); + CPPUNIT_ASSERT(rpc::commands.has(name + ".min_alloc")); + + CPPUNIT_ASSERT_EQUAL(has_allocation, rpc::commands.has(name + ".max_alloc")); + CPPUNIT_ASSERT_EQUAL(has_allocation, rpc::commands.has(name + ".min_alloc.set")); + CPPUNIT_ASSERT_EQUAL(has_allocation, rpc::commands.has(name + ".max_alloc.set")); + } +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rtorrent-0.16.21/test/src/test_command_system.h new/rtorrent-0.16.22/test/src/test_command_system.h --- old/rtorrent-0.16.21/test/src/test_command_system.h 1970-01-01 01:00:00.000000000 +0100 +++ new/rtorrent-0.16.22/test/src/test_command_system.h 2026-09-02 10:22:23.000000000 +0200 @@ -0,0 +1,15 @@ +#include "test/helpers/test_fixture.h" + +class TestCommandSystem : public test_fixture { + CPPUNIT_TEST_SUITE(TestCommandSystem); + + CPPUNIT_TEST(test_socket_category_commands); + + CPPUNIT_TEST_SUITE_END(); + +public: + void setUp(); + void tearDown(); + + void test_socket_category_commands(); +};
