Git-Url: http://git.frugalware.org/gitweb/gitweb.cgi?p=bmf.git;a=commitdiff;h=42f9cfcb3569b97ede3c57695f70d99b94f421cc
commit 42f9cfcb3569b97ede3c57695f70d99b94f421cc Author: Miklos Vajna <[EMAIL PROTECTED]> Date: Tue Dec 4 18:11:55 2007 +0100 rtorrent-0.7.9.1013-1bmf1-i686 update to newer snapshot dht patch is now in upstream diff --git a/source/network-extra/rtorrent/FrugalBuild b/source/network-extra/rtorrent/FrugalBuild index 870125e..605c21b 100644 --- a/source/network-extra/rtorrent/FrugalBuild +++ b/source/network-extra/rtorrent/FrugalBuild @@ -2,22 +2,21 @@ # Maintainer: voroskoi <[EMAIL PROTECTED]> pkgname=rtorrent -pkgver=svn975 +pkgver=0.7.9.1013 pkgrel=1bmf1 pkgdesc="The ncurses client for libtorrent." url="http://libtorrent.rakshasa.no/" -depends=('ncurses' 'libtorrent>=svn975' 'xmlrpc-c>=1.11.00') +depends=('ncurses' 'libtorrent>=0.7.9.1013' 'xmlrpc-c>=1.11.00') groups=('network-extra') archs=('i686' 'x86_64') Fconfopts="$Fconfopts --with-xmlrpc-c" up2date="lynx -dump $url |grep rtorrent.*.tar |sed -ne 's/.*t-\(.*\).t.*/\1/;1p'" -source=(curl_segfault_dirty_hack.diff dht.diff) -sha1sums=('583dadf10d30956ec796ec9f3c2c4d5dfff64c79' \ - 'dcf3adce965952263179f814e468c155613e9493') +source=(curl_segfault_dirty_hack.diff) +sha1sums=('583dadf10d30956ec796ec9f3c2c4d5dfff64c79') _F_scm_type="subversion" _F_scm_url="svn://rakshasa.no/libtorrent/trunk/rtorrent" -_F_scm_tag="975" +_F_scm_tag="1013" Finclude scm build() diff --git a/source/network-extra/rtorrent/dht.diff b/source/network-extra/rtorrent/dht.diff deleted file mode 100644 index 160763e..0000000 --- a/source/network-extra/rtorrent/dht.diff +++ /dev/null @@ -1,708 +0,0 @@ -Index: rtorrent/doc/rtorrent.rc -=================================================================== ---- rtorrent/doc/rtorrent.rc (revision 975) -+++ rtorrent/doc/rtorrent.rc (working copy) -@@ -74,6 +74,17 @@ - # - # encryption = allow_incoming,enable_retry,prefer_plaintext - -+# Enable DHT support for trackerless torrents or when all trackers are down. -+# May be set to "disable" (completely disable DHT), "off" (do not start DHT), -+# "auto" (start and stop DHT as needed), or "on" (start DHT immediately). -+# The default is "off". For DHT to work, a session directory must be defined. -+# -+# dht = auto -+ -+# UDP port to use for DHT. -+# -+# dht_port = 6881 -+ - # Enable peer exchange (for torrents not marked private) - # - # peer_exchange = yes -Index: rtorrent/doc/rtorrent.1.xml -=================================================================== ---- rtorrent/doc/rtorrent.1.xml (revision 975) -+++ rtorrent/doc/rtorrent.1.xml (working copy) -@@ -1,4 +1,5 @@ --<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook V4.1//EN"> -+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook V4.1//EN" -+ "http://oasis-open.org/docbook/xml/4.1/docbookx.dtd"> - - <refentry id="rtorrent"> - -@@ -705,7 +706,39 @@ - </para></listitem> - </varlistentry> - -+ <varlistentry> -+ <term>dht = <replaceable>disabled|off|auto|on</replaceable></term> -+ <listitem><para> -+Support for querying the distributed hash table (DHT) to find peers for trackerless -+torrents or when all trackers are down. Set to <emphasis>disable</emphasis> to completely -+disable DHT, <emphasis>off</emphasis> (default) to enable DHT but to not start the -+DHT server, <emphasis>auto</emphasis> to automatically start and stop the DHT server -+as needed or <emphasis>on</emphasis> for permanently keeping the DHT server running. -+When set to automatic, the DHT server will start up when the first non-private torrent -+is started, and will stop 15-30 minutes after the last non-private torrent is -+stopped (or when rTorrent quits). For DHT to work, a session directory must be set (for -+saving the DHT cache). -+ </para></listitem> -+ </varlistentry> -+ - <varlistentry> -+ <term>dht_port = <replaceable>number</replaceable></term> -+ <listitem><para> -+Set the UDP listen port for DHT. Defaults to 6881. -+ </para></listitem> -+ </varlistentry> -+ -+ <varlistentry> -+ <term>dht_add_node = <replaceable>host[:port]</replaceable></term> -+ <listitem><para> -+Not intended for use in the configuration file but as one-time option in the -+client or on the command line to bootstrap an empty DHT node table. Contacts -+the given node and attempts to bootstrap from it if it replies. -+The port is optional, with port 6881 being used by default. -+ </para></listitem> -+ </varlistentry> -+ -+ <varlistentry> - <term>http_capath = <replaceable>path</replaceable></term> - <term>http_cacert = <replaceable>filename</replaceable></term> - <listitem><para> -Index: rtorrent/src/core/download_list.cc -=================================================================== ---- rtorrent/src/core/download_list.cc (revision 975) -+++ rtorrent/src/core/download_list.cc (working copy) -@@ -55,6 +55,7 @@ - #include "globals.h" - #include "manager.h" - -+#include "dht_manager.h" - #include "download.h" - #include "download_list.h" - #include "download_store.h" -@@ -94,6 +95,8 @@ - void - DownloadList::session_save() { - std::for_each(begin(), end(), std::bind1st(std::mem_fun(&DownloadStore::save), control->core()->download_store())); -+ -+ control->dht_manager()->save_dht_cache(); - } - - DownloadList::iterator -@@ -388,6 +391,9 @@ - torrent::resume_save_progress(*download->download(), download->download()->bencode()->get_key("libtorrent_resume"), true); - } - -+ // If the DHT server is set to auto, start it now. -+ control->dht_manager()->auto_start(); -+ - // Update the priority to ensure it has the correct - // seeding/unfinished modifiers. - download->set_priority(download->priority()); -Index: rtorrent/src/core/dht_manager.cc -=================================================================== ---- rtorrent/src/core/dht_manager.cc (revision 0) -+++ rtorrent/src/core/dht_manager.cc (revision 0) -@@ -0,0 +1,302 @@ -+// rTorrent - BitTorrent client -+// Copyright (C) 2005-2007, Jari Sundell -+// -+// This program is free software; you can redistribute it and/or modify -+// it under the terms of the GNU General Public License as published by -+// the Free Software Foundation; either version 2 of the License, or -+// (at your option) any later version. -+// -+// This program is distributed in the hope that it will be useful, -+// but WITHOUT ANY WARRANTY; without even the implied warranty of -+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+// GNU General Public License for more details. -+// -+// You should have received a copy of the GNU General Public License -+// along with this program; if not, write to the Free Software -+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -+// -+// In addition, as a special exception, the copyright holders give -+// permission to link the code of portions of this program with the -+// OpenSSL library under certain conditions as described in each -+// individual source file, and distribute linked combinations -+// including the two. -+// -+// You must obey the GNU General Public License in all respects for -+// all of the code used other than OpenSSL. If you modify file(s) -+// with this exception, you may extend this exception to your version -+// of the file(s), but you are not obligated to do so. If you do not -+// wish to do so, delete this exception statement from your version. -+// If you delete this exception statement from all source files in the -+// program, then also delete it here. -+// -+// Contact: Jari Sundell <[EMAIL PROTECTED]> -+// -+// Skomakerveien 33 -+// 3185 Skoppum, NORWAY -+ -+#include "config.h" -+ -+#include <fstream> -+#include <sstream> -+#include <torrent/object.h> -+#include <torrent/dht_manager.h> -+#include <torrent/object_stream.h> -+#include <torrent/rate.h> -+ -+#include "rpc/parse_commands.h" -+ -+#include "globals.h" -+ -+#include "control.h" -+#include "dht_manager.h" -+#include "download.h" -+#include "download_store.h" -+#include "manager.h" -+ -+namespace core { -+ -+const char* DhtManager::dht_settings[dht_settings_num] = { "disable", "off", "auto", "on" }; -+ -+DhtManager::~DhtManager() { -+ priority_queue_erase(&taskScheduler, &m_updateTimeout); -+ priority_queue_erase(&taskScheduler, &m_stopTimeout); -+} -+ -+void -+DhtManager::load_dht_cache() { -+ if (m_start == dht_disable || !control->core()->download_store()->is_enabled()) -+ return; -+ -+ torrent::Object cache(torrent::Object::TYPE_MAP); -+ std::fstream cache_file((control->core()->download_store()->path() + "rtorrent.dht_cache").c_str(), std::ios::in | std::ios::binary); -+ -+ if (cache_file.is_open()) { -+ cache_file >> cache; -+ -+ if (cache_file.fail()) -+ throw torrent::input_error("Invalid DHT cache."); -+ } -+ -+ try { -+ torrent::dht_manager()->initialize(cache); -+ -+ if (m_start == dht_on) -+ start_dht(); -+ -+ } catch (torrent::local_error& e) { -+ control->core()->push_log((std::string("DHT error: ") + e.what()).c_str()); -+ } -+} -+ -+void -+DhtManager::start_dht() { -+ priority_queue_erase(&taskScheduler, &m_stopTimeout); -+ -+ if (torrent::dht_manager()->is_active() || !torrent::dht_manager()->is_valid()) -+ return; -+ -+ int port = rpc::call_command_value("get_dht_port"); -+ if (port <= 0) -+ return; -+ -+ char msg[128]; -+ snprintf(msg, sizeof(msg), "Starting DHT server on port %d.", port); -+ control->core()->push_log(msg); -+ -+ try { -+ torrent::dht_manager()->start(port); -+ -+ m_updateTimeout.set_slot(rak::mem_fn(this, &DhtManager::update)); -+ priority_queue_insert(&taskScheduler, &m_updateTimeout, (cachedTime + rak::timer::from_seconds(60)).round_seconds()); -+ -+ m_dhtPrevCycle = 0; -+ m_dhtPrevQueriesSent = 0; -+ m_dhtPrevRepliesReceived = 0; -+ m_dhtPrevQueriesReceived = 0; -+ m_dhtPrevBytesUp = 0; -+ m_dhtPrevBytesDown = 0; -+ -+ } catch (torrent::local_error& e) { -+ control->core()->push_log((std::string("DHT error: ") + e.what()).c_str()); -+ m_start = dht_off; -+ } -+} -+ -+void -+DhtManager::stop_dht() { -+ priority_queue_erase(&taskScheduler, &m_updateTimeout); -+ priority_queue_erase(&taskScheduler, &m_stopTimeout); -+ if (m_stopTimeout.is_queued()) -+ priority_queue_erase(&taskScheduler, &m_stopTimeout); -+ -+ if (torrent::dht_manager()->is_active()) { -+ log_statistics(true); -+ control->core()->push_log("Stopping DHT server."); -+ torrent::dht_manager()->stop(); -+ } -+} -+ -+void -+DhtManager::save_dht_cache() { -+ if (!control->core()->download_store()->is_enabled() || !torrent::dht_manager()->is_active()) -+ return; -+ -+ std::string filename = control->core()->download_store()->path() + "rtorrent.dht_cache"; -+ std::string filename_tmp = filename + ".new"; -+ std::fstream cache_file(filename_tmp.c_str(), std::ios::out | std::ios::trunc); -+ -+ if (!cache_file.is_open()) -+ return; -+ -+ torrent::Object cache(torrent::Object::TYPE_MAP); -+ cache_file << *torrent::dht_manager()->store_cache(&cache); -+ -+ if (!cache_file.good()) -+ return; -+ -+ cache_file.close(); -+ -+ ::rename(filename_tmp.c_str(), filename.c_str()); -+} -+ -+void -+DhtManager::set_start(const std::string& arg) { -+ int i; -+ for (i = 0; i < dht_settings_num; i++) { -+ if (arg == dht_settings[i]) { -+ m_start = i; -+ break; -+ } -+ } -+ -+ if (i == dht_settings_num) -+ throw torrent::input_error("Invalid argument."); -+ -+ if (m_start == dht_off) -+ stop_dht(); -+ else if (m_start == dht_on) -+ start_dht(); -+} -+ -+void -+DhtManager::update() { -+ if (!torrent::dht_manager()->is_active()) -+ throw torrent::internal_error("DhtManager::update called with DHT inactive."); -+ -+ if (m_start == dht_auto && !m_stopTimeout.is_queued()) { -+ DownloadList::const_iterator itr = std::find_if(control->core()->download_list()->begin(), control->core()->download_list()->end(), std::mem_fun(&Download::is_active)); -+ if (itr == control->core()->download_list()->end()) { -+ m_stopTimeout.set_slot(rak::mem_fn(this, &DhtManager::stop_dht)); -+ priority_queue_insert(&taskScheduler, &m_stopTimeout, (cachedTime + rak::timer::from_seconds(15 * 60)).round_seconds()); -+ } -+ } -+ -+ // While bootstrapping (log_statistics returns true), check every minute if it completed, otherwise update every 15 minutes. -+ if (log_statistics(false)) -+ priority_queue_insert(&taskScheduler, &m_updateTimeout, (cachedTime + rak::timer::from_seconds(60)).round_seconds()); -+ else -+ priority_queue_insert(&taskScheduler, &m_updateTimeout, (cachedTime + rak::timer::from_seconds(15 * 60)).round_seconds()); -+} -+ -+bool -+DhtManager::log_statistics(bool force) { -+ torrent::DhtManager::statistics_type stats = torrent::dht_manager()->get_statistics(); -+ -+ // Check for firewall problems. -+ -+ if (stats.cycle > 2 && stats.queries_sent - m_dhtPrevQueriesSent > 100 && stats.queries_received == m_dhtPrevQueriesReceived) { -+ // We should have had clients ping us at least but have received -+ // nothing, that means the UDP port is probably unreachable. -+ if (torrent::dht_manager()->can_receive_queries()) -+ control->core()->push_log("Warning: DHT port appears to be unreachable, no queries received."); -+ -+ torrent::dht_manager()->set_can_receive(false); -+ } -+ -+ if (stats.queries_sent - m_dhtPrevQueriesSent > stats.num_nodes * 2 + 20 && stats.replies_received == m_dhtPrevRepliesReceived) { -+ // No replies to over 20 queries plus two per node we have. Probably firewalled. -+ if (!m_warned) -+ control->core()->push_log("Warning: DHT port appears to be firewalled, no replies received."); -+ -+ m_warned = true; -+ return false; -+ } -+ -+ m_warned = false; -+ -+ if (stats.queries_received > m_dhtPrevQueriesReceived) -+ torrent::dht_manager()->set_can_receive(true); -+ -+ // Nothing to log while bootstrapping, but check again every minute. -+ if (stats.cycle <= 1) { -+ m_dhtPrevCycle = stats.cycle; -+ return true; -+ } -+ -+ // If bootstrap completed between now and the previous check, notify user. -+ if (m_dhtPrevCycle == 1) { -+ char buffer[128]; -+ snprintf(buffer, sizeof(buffer), "DHT bootstrap complete, have %d nodes in %d buckets.", stats.num_nodes, stats.num_buckets); -+ control->core()->get_log_complete().push_front(buffer); -+ m_dhtPrevCycle = stats.cycle; -+ return false; -+ }; -+ -+ // Standard DHT statistics on first real cycle, and every 8th cycle -+ // afterwards (i.e. every 2 hours), or when forced. -+ if ((force && stats.cycle != m_dhtPrevCycle) || stats.cycle == 3 || stats.cycle > m_dhtPrevCycle + 7) { -+ char buffer[256]; -+ snprintf(buffer, sizeof(buffer), -+ "DHT statistics: %d queries in, %d queries out, %d replies received, %lld bytes read, %lld bytes sent, " -+ "%d known nodes in %d buckets, %d peers (highest: %d) tracked in %d torrents.", -+ stats.queries_received - m_dhtPrevQueriesReceived, -+ stats.queries_sent - m_dhtPrevQueriesSent, -+ stats.replies_received - m_dhtPrevRepliesReceived, -+ stats.down_rate.total() - m_dhtPrevBytesDown, -+ stats.up_rate.total() - m_dhtPrevBytesUp, -+ stats.num_nodes, -+ stats.num_buckets, -+ stats.num_peers, -+ stats.max_peers, -+ stats.num_trackers); -+ -+ control->core()->get_log_complete().push_front(buffer); -+ -+ m_dhtPrevCycle = stats.cycle; -+ m_dhtPrevQueriesSent = stats.queries_sent; -+ m_dhtPrevRepliesReceived = stats.replies_received; -+ m_dhtPrevQueriesReceived = stats.queries_received; -+ m_dhtPrevBytesUp = stats.up_rate.total(); -+ m_dhtPrevBytesDown = stats.down_rate.total(); -+ } -+ -+ return false; -+} -+ -+torrent::Object -+DhtManager::dht_statistics() { -+ torrent::Object dhtStats(torrent::Object::TYPE_MAP); -+ -+ dhtStats.insert_key("dht", dht_settings[m_start]); -+ dhtStats.insert_key("active", torrent::dht_manager()->is_active()); -+ -+ if (torrent::dht_manager()->is_active()) { -+ torrent::DhtManager::statistics_type stats = torrent::dht_manager()->get_statistics(); -+ -+ dhtStats.insert_key("cycle", stats.cycle); -+ dhtStats.insert_key("queries_received", stats.queries_received); -+ dhtStats.insert_key("queries_sent", stats.queries_sent); -+ dhtStats.insert_key("replies_received", stats.replies_received); -+ dhtStats.insert_key("bytes_read", stats.down_rate.total()); -+ dhtStats.insert_key("bytes_written", stats.up_rate.total()); -+ dhtStats.insert_key("nodes", stats.num_nodes); -+ dhtStats.insert_key("buckets", stats.num_buckets); -+ dhtStats.insert_key("peers", stats.num_peers); -+ dhtStats.insert_key("peers_max", stats.max_peers); -+ dhtStats.insert_key("torrents", stats.num_trackers); -+ } -+ -+ return dhtStats; -+} -+ -+} -Index: rtorrent/src/core/dht_manager.h -=================================================================== ---- rtorrent/src/core/dht_manager.h (revision 0) -+++ rtorrent/src/core/dht_manager.h (revision 0) -@@ -0,0 +1,89 @@ -+// rTorrent - BitTorrent client -+// Copyright (C) 2005-2007, Jari Sundell -+// -+// This program is free software; you can redistribute it and/or modify -+// it under the terms of the GNU General Public License as published by -+// the Free Software Foundation; either version 2 of the License, or -+// (at your option) any later version. -+// -+// This program is distributed in the hope that it will be useful, -+// but WITHOUT ANY WARRANTY; without even the implied warranty of -+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+// GNU General Public License for more details. -+// -+// You should have received a copy of the GNU General Public License -+// along with this program; if not, write to the Free Software -+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -+// -+// In addition, as a special exception, the copyright holders give -+// permission to link the code of portions of this program with the -+// OpenSSL library under certain conditions as described in each -+// individual source file, and distribute linked combinations -+// including the two. -+// -+// You must obey the GNU General Public License in all respects for -+// all of the code used other than OpenSSL. If you modify file(s) -+// with this exception, you may extend this exception to your version -+// of the file(s), but you are not obligated to do so. If you do not -+// wish to do so, delete this exception statement from your version. -+// If you delete this exception statement from all source files in the -+// program, then also delete it here. -+// -+// Contact: Jari Sundell <[EMAIL PROTECTED]> -+// -+// Skomakerveien 33 -+// 3185 Skoppum, NORWAY -+ -+#ifndef RTORRENT_CORE_DHT_MANAGER_H -+#define RTORRENT_CORE_DHT_MANAGER_H -+ -+#include <rak/priority_queue_default.h> -+ -+#include <torrent/object.h> -+ -+namespace core { -+ -+class DhtManager { -+public: -+ DhtManager() : m_warned(false), m_start(dht_off) { } -+ ~DhtManager(); -+ -+ void load_dht_cache(); -+ void save_dht_cache(); -+ torrent::Object dht_statistics(); -+ -+ void start_dht(); -+ void stop_dht(); -+ void auto_start() { if (m_start == dht_auto) start_dht(); } -+ -+ void set_start(const std::string& arg); -+ -+private: -+ static const int dht_disable = 0; -+ static const int dht_off = 1; -+ static const int dht_auto = 2; -+ static const int dht_on = 3; -+ -+ static const int dht_settings_num = 4; -+ static const char* dht_settings[dht_settings_num]; -+ -+ void update(); -+ bool log_statistics(bool force); -+ -+ unsigned int m_dhtPrevCycle; -+ unsigned int m_dhtPrevQueriesSent; -+ unsigned int m_dhtPrevRepliesReceived; -+ unsigned int m_dhtPrevQueriesReceived; -+ uint64_t m_dhtPrevBytesUp; -+ uint64_t m_dhtPrevBytesDown; -+ -+ rak::priority_item m_updateTimeout; -+ rak::priority_item m_stopTimeout; -+ bool m_warned; -+ -+ int m_start; -+}; -+ -+} -+ -+#endif -Index: rtorrent/src/core/manager.cc -=================================================================== ---- rtorrent/src/core/manager.cc (revision 975) -+++ rtorrent/src/core/manager.cc (working copy) -@@ -242,6 +242,9 @@ - - m_downloadList->clear(); - -+ // When we implement asynchronous DNS lookups, we need to cancel them -+ // here before the torrent::* objects are deleted. -+ - torrent::cleanup(); - CurlStack::global_cleanup(); - -Index: rtorrent/src/core/Makefile.am -=================================================================== ---- rtorrent/src/core/Makefile.am (revision 975) -+++ rtorrent/src/core/Makefile.am (working copy) -@@ -5,6 +5,8 @@ - curl_get.h \ - curl_stack.cc \ - curl_stack.h \ -+ dht_manager.cc \ -+ dht_manager.h \ - download.cc \ - download.h \ - download_factory.cc \ -Index: rtorrent/src/control.cc -=================================================================== ---- rtorrent/src/control.cc (revision 975) -+++ rtorrent/src/control.cc (working copy) -@@ -44,6 +44,7 @@ - #include "core/download_store.h" - #include "core/view_manager.h" - #include "core/scheduler.h" -+#include "core/dht_manager.h" - - #include "display/canvas.h" - #include "display/window.h" -@@ -75,6 +76,7 @@ - m_core = new core::Manager(); - m_viewManager = new core::ViewManager(m_core->download_list()); - m_scheduler = new core::Scheduler(m_core->download_list()); -+ m_dhtManager = new core::DhtManager(); - - m_inputStdin->slot_pressed(sigc::mem_fun(m_input, &input::Manager::pressed)); - -@@ -95,6 +97,7 @@ - delete m_display; - delete m_core; - delete m_scheduler; -+ delete m_dhtManager; - } - - void -Index: rtorrent/src/display/utils.cc -=================================================================== ---- rtorrent/src/display/utils.cc (revision 975) -+++ rtorrent/src/display/utils.cc (working copy) -@@ -191,8 +191,8 @@ - } else if (d->tracker_list()->is_busy() && d->tracker_list()->focus() < d->tracker_list()->size()) { - torrent::TrackerList* tl = d->tracker_list(); - -- first = print_buffer(first, last, "Tracker[%i:%i]: Connecting to %s", -- tl->get(tl->focus()).group(), tl->focus(), tl->get(tl->focus()).url().c_str()); -+ first = print_buffer(first, last, "Tracker[%i:%i]: Connecting to %s %s", -+ tl->get(tl->focus()).group(), tl->focus(), tl->get(tl->focus()).url().c_str(), tl->get(tl->focus()).status().c_str()); - - } else if (!d->message().empty()) { - first = print_buffer(first, last, "%s", d->message().c_str()); -Index: rtorrent/src/display/window_tracker_list.cc -=================================================================== ---- rtorrent/src/display/window_tracker_list.cc (revision 975) -+++ rtorrent/src/display/window_tracker_list.cc (working copy) -@@ -91,7 +91,7 @@ - m_canvas->print(4, pos++, "Id: %s Focus: %s Enabled: %s Open: %s S/L: %u/%u", - rak::copy_escape_html(tracker.tracker_id()).c_str(), - range.first == tl->focus() ? "yes" : " no", -- tracker.is_enabled() ? "yes" : " no", -+ tracker.is_usable() ? "yes" : tracker.is_enabled() ? "off" : " no", - tracker.is_open() ? "yes" : " no", - tracker.scrape_complete(), - tracker.scrape_incomplete()); -Index: rtorrent/src/control.h -=================================================================== ---- rtorrent/src/control.h (revision 975) -+++ rtorrent/src/control.h (working copy) -@@ -51,6 +51,7 @@ - class Manager; - class ViewManager; - class Scheduler; -+ class DhtManager; - } - - namespace display { -@@ -89,6 +90,7 @@ - core::Manager* core() { return m_core; } - core::ViewManager* view_manager() { return m_viewManager; } - core::Scheduler* scheduler() { return m_scheduler; } -+ core::DhtManager* dht_manager() { return m_dhtManager; } - - torrent::Poll* poll(); - -@@ -118,6 +120,7 @@ - core::Manager* m_core; - core::ViewManager* m_viewManager; - core::Scheduler* m_scheduler; -+ core::DhtManager* m_dhtManager; - - ui::Root* m_ui; - display::Manager* m_display; -Index: rtorrent/src/main.cc -=================================================================== ---- rtorrent/src/main.cc (revision 975) -+++ rtorrent/src/main.cc (working copy) -@@ -49,6 +49,7 @@ - #include <execinfo.h> - #endif - -+#include "core/dht_manager.h" - #include "core/download.h" - #include "core/download_factory.h" - #include "core/download_store.h" -@@ -244,6 +245,7 @@ - - // Load session torrents and perform scheduled tasks to ensure - // session torrents are loaded before arg torrents. -+ control->dht_manager()->load_dht_cache(); - load_session_torrents(control); - rak::priority_queue_perform(&taskScheduler, cachedTime); - -Index: rtorrent/src/command_network.cc -=================================================================== ---- rtorrent/src/command_network.cc (revision 975) -+++ rtorrent/src/command_network.cc (working copy) -@@ -41,10 +41,12 @@ - #include <rak/file_stat.h> - #include <rak/path.h> - #include <torrent/connection_manager.h> -+#include <torrent/dht_manager.h> - #include <torrent/tracker.h> - #include <torrent/tracker_list.h> - #include <torrent/torrent.h> - -+#include "core/dht_manager.h" - #include "core/download.h" - #include "core/manager.h" - #include "rpc/scgi.h" -@@ -119,7 +121,42 @@ - void apply_hash_interval(int arg) { torrent::set_hash_interval(arg * 1000); } - void apply_encoding_list(const std::string& arg) { torrent::encoding_list()->push_back(arg); } - -+struct call_add_node_t { -+ call_add_node_t(int port) : m_port(port) { } -+ -+ void operator() (const sockaddr* sa, int err) { -+ if (sa == NULL) -+ control->core()->push_log("Could not resolve host."); -+ else -+ torrent::dht_manager()->add_node(sa, m_port, false); -+ } -+ -+ int m_port; -+}; -+ - void -+apply_dht_add_node(const std::string& arg) { -+ if (!torrent::dht_manager()->is_valid()) -+ throw torrent::input_error("DHT not enabled."); -+ -+ int port, ret; -+ char dummy; -+ char host[1024]; -+ -+ ret = std::sscanf(arg.c_str(), "%1023[^:]:%i%c", host, &port, &dummy); -+ -+ if (ret == 1) -+ port = 6881; -+ else if (ret != 2) -+ throw torrent::input_error("Could not parse host."); -+ -+ if (port < 1 || port > 65535) -+ throw torrent::input_error("Invalid port number."); -+ -+ torrent::connection_manager()->resolver()(host, (int)rak::socket_address::pf_inet, SOCK_DGRAM, call_add_node_t(port)); -+} -+ -+void - apply_enable_trackers(int64_t arg) { - for (core::Manager::DListItr itr = control->core()->download_list()->begin(), last = control->core()->download_list()->end(); itr != last; ++itr) { - torrent::TrackerList tl = (*itr)->download()->tracker_list(); -@@ -324,6 +361,11 @@ - ADD_COMMAND_VALUE_UN("enable_trackers", std::ptr_fun(&apply_enable_trackers)); - ADD_COMMAND_STRING_UN("encoding_list", std::ptr_fun(&apply_encoding_list)); - -+ ADD_VARIABLE_VALUE("dht_port", 6881); -+ ADD_COMMAND_STRING_UN("dht", rak::make_mem_fun(control->dht_manager(), &core::DhtManager::set_start)); -+ ADD_COMMAND_STRING_UN("dht_add_node", std::ptr_fun(&apply_dht_add_node)); -+ ADD_COMMAND_VOID("dht_statistics", rak::make_mem_fun(control->dht_manager(), &core::DhtManager::dht_statistics)); -+ - ADD_VARIABLE_BOOL("peer_exchange", false); - - // Not really network stuff: _______________________________________________ Frugalware-git mailing list [email protected] http://frugalware.org/mailman/listinfo/frugalware-git
