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();
+};

Reply via email to