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-03-16 14:18:06 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/rtorrent (Old) and /work/SRC/openSUSE:Factory/.rtorrent.new.8177 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "rtorrent" Mon Mar 16 14:18:06 2026 rev:27 rq:1339300 version:0.16.8 Changes: -------- --- /work/SRC/openSUSE:Factory/rtorrent/rtorrent.changes 2026-03-04 21:11:07.791099785 +0100 +++ /work/SRC/openSUSE:Factory/.rtorrent.new.8177/rtorrent.changes 2026-03-16 14:21:23.411405589 +0100 @@ -1,0 +2,6 @@ +Mon Mar 16 07:13:29 UTC 2026 - Jan Engelhardt <[email protected]> + +- Update to release 0.16.8 + * Fixed various SCGI issues. + +------------------------------------------------------------------- Old: ---- rtorrent-0.16.7.tar.gz New: ---- rtorrent-0.16.8.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ rtorrent.spec ++++++ --- /var/tmp/diff_new_pack.8oDT5M/_old 2026-03-16 14:21:23.883425216 +0100 +++ /var/tmp/diff_new_pack.8oDT5M/_new 2026-03-16 14:21:23.883425216 +0100 @@ -17,7 +17,7 @@ Name: rtorrent -Version: 0.16.7 +Version: 0.16.8 Release: 0 Summary: Console-based BitTorrent client License: SUSE-GPL-2.0+-with-openssl-exception ++++++ _scmsync.obsinfo ++++++ --- /var/tmp/diff_new_pack.8oDT5M/_old 2026-03-16 14:21:23.915426547 +0100 +++ /var/tmp/diff_new_pack.8oDT5M/_new 2026-03-16 14:21:23.919426714 +0100 @@ -1,5 +1,5 @@ -mtime: 1772630835 -commit: e17dda0be227aafafa6122dc91f777bb2bbf4bbb3ccd1a79ea497bc7b29a46c4 +mtime: 1773653033 +commit: 327ebbbfdc243b23a33c29682bee8a4bb249dfd98cf37832edc02d065bce5495 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-03-16 10:24:02.000000000 +0100 @@ -0,0 +1 @@ +.osc ++++++ rtorrent-0.16.7.tar.gz -> rtorrent-0.16.8.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rtorrent-0.16.7/configure new/rtorrent-0.16.8/configure --- old/rtorrent-0.16.7/configure 2026-03-04 11:49:24.000000000 +0100 +++ new/rtorrent-0.16.8/configure 2026-03-15 18:07:03.000000000 +0100 @@ -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.7. +# Generated by GNU Autoconf 2.72 for rtorrent 0.16.8. # # Report bugs to <[email protected]>. # @@ -614,8 +614,8 @@ # Identity of this package. PACKAGE_NAME='rtorrent' PACKAGE_TARNAME='rtorrent' -PACKAGE_VERSION='0.16.7' -PACKAGE_STRING='rtorrent 0.16.7' +PACKAGE_VERSION='0.16.8' +PACKAGE_STRING='rtorrent 0.16.8' PACKAGE_BUGREPORT='[email protected]' PACKAGE_URL='' @@ -1410,7 +1410,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.7 to adapt to many kinds of systems. +'configure' configures rtorrent 0.16.8 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1481,7 +1481,7 @@ if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of rtorrent 0.16.7:";; + short | recursive ) echo "Configuration of rtorrent 0.16.8:";; esac cat <<\_ACEOF @@ -1628,7 +1628,7 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -rtorrent configure 0.16.7 +rtorrent configure 0.16.8 generated by GNU Autoconf 2.72 Copyright (C) 2023 Free Software Foundation, Inc. @@ -2257,7 +2257,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.7, which was +It was created by rtorrent $as_me 0.16.8, which was generated by GNU Autoconf 2.72. Invocation command line was $ $0$ac_configure_args_raw @@ -3950,7 +3950,7 @@ # Define the identity of the package. PACKAGE='rtorrent' - VERSION='0.16.7' + VERSION='0.16.8' printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h @@ -21553,19 +21553,19 @@ fi pkg_failed=no -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libtorrent >= 0.16.7" >&5 -printf %s "checking for libtorrent >= 0.16.7... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libtorrent >= 0.16.8" >&5 +printf %s "checking for libtorrent >= 0.16.8... " >&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.7\""; } >&5 - ($PKG_CONFIG --exists --print-errors "libtorrent >= 0.16.7") 2>&5 + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libtorrent >= 0.16.8\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libtorrent >= 0.16.8") 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.7" 2>/dev/null` + pkg_cv_DEPENDENCIES_CFLAGS=`$PKG_CONFIG --cflags "libtorrent >= 0.16.8" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes @@ -21577,12 +21577,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.7\""; } >&5 - ($PKG_CONFIG --exists --print-errors "libtorrent >= 0.16.7") 2>&5 + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libtorrent >= 0.16.8\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libtorrent >= 0.16.8") 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.7" 2>/dev/null` + pkg_cv_DEPENDENCIES_LIBS=`$PKG_CONFIG --libs "libtorrent >= 0.16.8" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes @@ -21603,14 +21603,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.7" 2>&1` + DEPENDENCIES_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libtorrent >= 0.16.8" 2>&1` else - DEPENDENCIES_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libtorrent >= 0.16.7" 2>&1` + DEPENDENCIES_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libtorrent >= 0.16.8" 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.7) were not met: + as_fn_error $? "Package requirements (libtorrent >= 0.16.8) were not met: $DEPENDENCIES_PKG_ERRORS @@ -23202,7 +23202,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.7, which was +This file was extended by rtorrent $as_me 0.16.8, which was generated by GNU Autoconf 2.72. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -23270,7 +23270,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ -rtorrent config.status 0.16.7 +rtorrent config.status 0.16.8 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.7/configure.ac new/rtorrent-0.16.8/configure.ac --- old/rtorrent-0.16.7/configure.ac 2026-03-04 11:39:56.000000000 +0100 +++ new/rtorrent-0.16.8/configure.ac 2026-03-15 17:58:09.000000000 +0100 @@ -1,6 +1,6 @@ m4_pattern_allow([PKG_CHECK_EXISTS]) -AC_INIT([rtorrent],[0.16.7],[[email protected]]) +AC_INIT([rtorrent],[0.16.8],[[email protected]]) AC_CONFIG_HEADERS([config.h]) AC_CONFIG_MACRO_DIRS([scripts]) @@ -48,7 +48,7 @@ fi PKG_CHECK_MODULES([CPPUNIT], [cppunit],, [no_cppunit="yes"]) -PKG_CHECK_MODULES([DEPENDENCIES], [libtorrent >= 0.16.7]) +PKG_CHECK_MODULES([DEPENDENCIES], [libtorrent >= 0.16.8]) AC_LANG_PUSH(C++) TORRENT_WITH_XMLRPC_C diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rtorrent-0.16.7/src/rpc/scgi.cc new/rtorrent-0.16.8/src/rpc/scgi.cc --- old/rtorrent-0.16.7/src/rpc/scgi.cc 2026-03-04 11:39:56.000000000 +0100 +++ new/rtorrent-0.16.8/src/rpc/scgi.cc 2026-03-15 17:58:09.000000000 +0100 @@ -1,5 +1,6 @@ #include "config.h" +#include <algorithm> #include <cassert> #include <unistd.h> #include <sys/un.h> @@ -20,6 +21,12 @@ namespace rpc { +SCgi::SCgi() { + std::generate(m_tasks.begin(), m_tasks.end(), []() { return std::make_unique<SCgiTask>(); }); + + m_current = m_tasks.begin(); +} + SCgi::~SCgi() { assert(!is_open() && "SCgi::~SCgi() called while open"); } @@ -106,9 +113,10 @@ if (!is_open()) return; - for (SCgiTask* itr = m_task, *last = m_task + max_tasks; itr != last; ++itr) + for (auto& itr : m_tasks) { if (itr->is_open()) itr->close(); + } torrent::runtime::socket_manager()->close_event_or_throw(this, [this]() { torrent::this_thread::poll()->remove_and_close(this); @@ -125,10 +133,19 @@ void SCgi::event_read() { + if (m_current < m_tasks.begin() || m_current >= m_tasks.end()) + throw torrent::internal_error("SCgi::event_read() m_current is out of bounds"); + while (true) { - auto* task = std::find_if(m_task, m_task + max_tasks, std::mem_fn(&SCgiTask::is_available)); + // TODO: Optimize this by keeping track of count. + auto prev = m_current; - if (task == m_task + max_tasks) { + m_current = std::find_if(m_current + 1, m_tasks.end(), [](const auto& task) { return !task->is_open(); }); + + if (m_current == m_tasks.end()) + m_current = std::find_if(m_tasks.begin(), prev, [](const auto& task) { return !task->is_open(); }); + + if (m_current == prev) { // TODO: Currently just close, although we should remove ourselves from read. int fd = torrent::fd_accept(file_descriptor()); @@ -138,11 +155,15 @@ continue; } - auto open_func = [this, task]() { + auto open_func = [this, task = m_current->get()]() { int fd = torrent::fd_accept(file_descriptor()); if (fd == -1) { - if (errno == EAGAIN || errno == EWOULDBLOCK) + if (errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR) + return; + + // Force a new event_read() call just to be sure we don't enter an infinite loop. + if (errno == ECONNABORTED) return; throw torrent::resource_error("Listener port accept() failed: " + std::string(std::strerror(errno))); @@ -151,11 +172,11 @@ task->open(this, fd); }; - auto cleanup_func = [task]() { + auto cleanup_func = [task = m_current->get()]() { task->cancel_open(); }; - bool result = torrent::runtime::socket_manager()->open_event_or_cleanup(task, open_func, cleanup_func); + bool result = torrent::runtime::socket_manager()->open_event_or_cleanup(m_current->get(), open_func, cleanup_func); if (!result) break; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rtorrent-0.16.7/src/rpc/scgi.h new/rtorrent-0.16.8/src/rpc/scgi.h --- old/rtorrent-0.16.7/src/rpc/scgi.h 2026-03-04 11:39:56.000000000 +0100 +++ new/rtorrent-0.16.8/src/rpc/scgi.h 2026-03-15 17:58:09.000000000 +0100 @@ -1,7 +1,9 @@ #ifndef RTORRENT_RPC_SCGI_H #define RTORRENT_RPC_SCGI_H +#include <array> #include <functional> +#include <memory> #include <torrent/event.h> #include "rpc/scgi_task.h" @@ -12,6 +14,7 @@ public: static const int max_tasks = 100; + SCgi(); ~SCgi() override; const char* type_name() const override { return "scgi"; } @@ -33,11 +36,15 @@ void event_error() override; private: + using task_list = std::array<std::unique_ptr<SCgiTask>, max_tasks>; + void open(sockaddr* sa, unsigned int length); std::string m_path; int m_logFd{-1}; - SCgiTask m_task[max_tasks]; + + task_list m_tasks; + task_list::iterator m_current; }; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rtorrent-0.16.7/src/rpc/scgi_task.cc new/rtorrent-0.16.8/src/rpc/scgi_task.cc --- old/rtorrent-0.16.7/src/rpc/scgi_task.cc 2026-03-04 11:39:56.000000000 +0100 +++ new/rtorrent-0.16.8/src/rpc/scgi_task.cc 2026-03-15 17:58:09.000000000 +0100 @@ -43,12 +43,10 @@ if (!is_open()) return; - torrent::runtime::socket_manager()->close_event_or_throw(this, [this]() { - torrent::this_thread::poll()->remove_and_close(this); + torrent::this_thread::poll()->remove_and_close(this); - torrent::fd_close(file_descriptor()); - set_file_descriptor(-1); - }); + torrent::fd_close(file_descriptor()); + set_file_descriptor(-1); }; void
