diff --git a/docs/gen_reference_doc.py b/docs/gen_reference_doc.py index fb267250e..3a1ee9eee 100644 --- a/docs/gen_reference_doc.py +++ b/docs/gen_reference_doc.py @@ -100,6 +100,7 @@ category_mapping = { 'ip_filter.hpp': 'Filter', 'session_settings.hpp': 'Settings', 'settings_pack.hpp': 'Settings', + 'operations.hpp': 'Alerts', } category_fun_mapping = { diff --git a/examples/client_test.cpp b/examples/client_test.cpp index 57c9258cc..f26b66ef3 100644 --- a/examples/client_test.cpp +++ b/examples/client_test.cpp @@ -972,6 +972,19 @@ bool handle_alert(libtorrent::session& ses, libtorrent::alert* a } #endif + // don't log every peer we try to connect to + if (alert_cast(a)) return true; + + if (peer_disconnected_alert* pd = alert_cast(a)) + { + // ignore failures to connect and peers not responding with a + // handshake. The peers that we successfully connect to and then + // disconnect is more interesting. + if (pd->operation == op_connect + || pd->error == error_code(errors::timed_out_no_handshake + , get_libtorrent_category())) + return true; + } if (metadata_received_alert* p = alert_cast(a)) { @@ -1299,7 +1312,6 @@ int main(int argc, char* argv[]) , alert::all_categories & ~(alert::dht_notification + alert::progress_notification - + alert::debug_notification + alert::stats_notification + alert::session_log_notification + alert::torrent_log_notification diff --git a/examples/torrent_view.cpp b/examples/torrent_view.cpp index 033b67d27..9c5c1455a 100644 --- a/examples/torrent_view.cpp +++ b/examples/torrent_view.cpp @@ -276,7 +276,7 @@ void torrent_view::print_headers() // print title bar for torrent list pos = snprintf(str, sizeof(str) - , " %-3s %-50s %-35s %-17s %-17s %-11s %-6s %-6s %-4s\x1bK" + , " %-3s %-50s %-35s %-17s %-17s %-11s %-6s %-6s %-4s\x1b[K" , "#", "Name", "Progress", "Download", "Upload", "Peers (D:S)" , "Down", "Up", "Flags"); diff --git a/include/libtorrent/Makefile.am b/include/libtorrent/Makefile.am index b47fb6c5d..cf1212055 100644 --- a/include/libtorrent/Makefile.am +++ b/include/libtorrent/Makefile.am @@ -77,6 +77,7 @@ nobase_include_HEADERS = \ max.hpp \ natpmp.hpp \ network_thread_pool.hpp \ + operations.hpp \ packet_buffer.hpp \ parse_url.hpp \ part_file.hpp \ diff --git a/include/libtorrent/alert_types.hpp b/include/libtorrent/alert_types.hpp index a85fe752f..7d6b2e9b8 100644 --- a/include/libtorrent/alert_types.hpp +++ b/include/libtorrent/alert_types.hpp @@ -42,6 +42,7 @@ POSSIBILITY OF SUCH DAMAGE. #include "libtorrent/address.hpp" #include "libtorrent/stat.hpp" #include "libtorrent/rss.hpp" // for feed_handle +#include "libtorrent/operations.hpp" // for operation_t enum namespace libtorrent { @@ -702,8 +703,9 @@ namespace libtorrent { // internal peer_disconnected_alert(torrent_handle const& h, tcp::endpoint const& ep - , peer_id const& peer_id, int op, error_code const& e) + , peer_id const& peer_id, operation_t op, int type, error_code const& e) : peer_alert(h, ep, peer_id) + , socket_type(type) , operation(op) , error(e) { @@ -717,9 +719,12 @@ namespace libtorrent const static int static_category = alert::debug_notification; virtual std::string message() const; - // a NULL-terminated string of the low-level operation that failed, or NULL if - // there was no low level disk operation. - int operation; + // the kind of socket this peer was connected over + int socket_type; + + // the operation or level where the error occurred. Specified as an + // value from the operation_t enum. Defined in operations.hpp. + operation_t operation; // tells you what error caused peer to disconnect. error_code error; diff --git a/include/libtorrent/http_seed_connection.hpp b/include/libtorrent/http_seed_connection.hpp index ece144957..73cd65851 100644 --- a/include/libtorrent/http_seed_connection.hpp +++ b/include/libtorrent/http_seed_connection.hpp @@ -94,7 +94,7 @@ namespace libtorrent std::string const& url() const { return m_url; } virtual void get_specific_peer_info(peer_info& p) const; - virtual void disconnect(error_code const& ec, peer_connection_interface::operation_t op, int error = 0); + virtual void disconnect(error_code const& ec, operation_t op, int error = 0); void write_request(peer_request const& r); diff --git a/include/libtorrent/operations.hpp b/include/libtorrent/operations.hpp new file mode 100644 index 000000000..841147b71 --- /dev/null +++ b/include/libtorrent/operations.hpp @@ -0,0 +1,105 @@ +/* + +Copyright (c) 2015, Arvid Norberg +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the distribution. + * Neither the name of the author nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*/ + + +#ifndef TORRENT_OPERATIONS_HPP_INCLUDED +#define TORRENT_OPERATIONS_HPP_INCLUDED + +namespace libtorrent +{ + // these constants are used to identify the operation that failed, causing a + // peer to disconnect + enum operation_t + { + // this is used when the bittorrent logic + // determines to disconnect + op_bittorrent = 0, + + // a call to iocontrol failed + op_iocontrol, + + // a call to getpeername failed (querying the remote IP of a + // connection) + op_getpeername, + + // a call to getname failed (querying the local IP of a + // connection) + op_getname, + + // an attempt to allocate a receive buffer failed + op_alloc_recvbuf, + + // an attempt to allocate a send buffer failed + op_alloc_sndbuf, + + // writing to a file failed + op_file_write, + + // reading from a file failed + op_file_read, + + // a non-read and non-write file operation failed + op_file, + + // a socket write operation failed + op_sock_write, + + // a socket read operation failed + op_sock_read, + + // a call to open(), to create a socket socket failed + op_sock_open, + + // a call to bind() on a socket failed + op_sock_bind, + + // an attempt to query the number of bytes available to read from a socket + // failed + op_available, + + // a call related to bittorrent protocol encryption failed + op_encryption, + + // an attempt to connect a socket failed + op_connect, + + // establishing an SSL connection failed + op_ssl_handshake, + + // a connection failed to satisfy the bind interface setting + op_get_interface, + }; + +} + +#endif // TORRENT_OPERATIONS_HPP_INCLUDED + diff --git a/include/libtorrent/peer_connection.hpp b/include/libtorrent/peer_connection.hpp index 56ec5175b..cc17bb338 100644 --- a/include/libtorrent/peer_connection.hpp +++ b/include/libtorrent/peer_connection.hpp @@ -484,7 +484,7 @@ namespace libtorrent // this will cause this peer_connection to be disconnected. virtual void disconnect(error_code const& ec - , peer_connection_interface::operation_t op, int error = 0); + , operation_t op, int error = 0); // called when a connect attempt fails (not when an // established connection fails) diff --git a/include/libtorrent/peer_connection_interface.hpp b/include/libtorrent/peer_connection_interface.hpp index 440f23967..6d17420b5 100644 --- a/include/libtorrent/peer_connection_interface.hpp +++ b/include/libtorrent/peer_connection_interface.hpp @@ -35,6 +35,8 @@ POSSIBILITY OF SUCH DAMAGE. #include "libtorrent/socket.hpp" #include "libtorrent/error_code.hpp" +#include "libtorrent/alert_types.hpp" +#include "libtorrent/operations.hpp" // for operation_t enum namespace libtorrent { @@ -45,35 +47,10 @@ namespace libtorrent // TODO: make this interface smaller! struct peer_connection_interface { - // these constants are used to identify the operation - // that failed, causing a peer to disconnect - enum operation_t - { - // this is used when the bittorrent logic - // determines to disconnect - op_bittorrent = 0, - op_iocontrol, - op_getpeername, - op_getname, - op_alloc_recvbuf, - op_alloc_sndbuf, - op_file_write, - op_file_read, - op_file, - op_sock_write, - op_sock_read, - op_sock_open, - op_sock_bind, - op_available, - op_encryption, - op_connect, - op_ssl_handshake, - op_get_interface, - }; - virtual tcp::endpoint const& remote() const = 0; virtual tcp::endpoint local_endpoint() const = 0; - virtual void disconnect(error_code const& ec, operation_t op, int error = 0) = 0; + virtual void disconnect(error_code const& ec + , operation_t op, int error = 0) = 0; virtual peer_id const& pid() const = 0; virtual void set_holepunch_mode() = 0; virtual torrent_peer* peer_info_struct() const = 0; diff --git a/include/libtorrent/torrent.hpp b/include/libtorrent/torrent.hpp index 5e80e1cc2..808f0a748 100644 --- a/include/libtorrent/torrent.hpp +++ b/include/libtorrent/torrent.hpp @@ -616,7 +616,7 @@ namespace libtorrent void retry_web_seed(peer_connection* p, int retry = 0); void remove_web_seed(peer_connection* p, error_code const& ec - , peer_connection_interface::operation_t op, int error = 0); + , operation_t op, int error = 0); std::set web_seeds(web_seed_entry::type_t type) const; @@ -843,7 +843,7 @@ namespace libtorrent int block_size() const { TORRENT_ASSERT(m_block_size_shift > 0); return 1 << m_block_size_shift; } peer_request to_req(piece_block const& p) const; - void disconnect_all(error_code const& ec, peer_connection_interface::operation_t op); + void disconnect_all(error_code const& ec, operation_t op); int disconnect_peers(int num, error_code const& ec); // called every time a block is marked as finished in the diff --git a/include/libtorrent/web_peer_connection.hpp b/include/libtorrent/web_peer_connection.hpp index c66bdf856..d463b42cf 100644 --- a/include/libtorrent/web_peer_connection.hpp +++ b/include/libtorrent/web_peer_connection.hpp @@ -60,6 +60,7 @@ POSSIBILITY OF SUCH DAMAGE. #include "libtorrent/torrent.hpp" #include "libtorrent/piece_block_progress.hpp" #include "libtorrent/http_parser.hpp" +#include "libtorrent/operations.hpp" // for operation_t enum namespace libtorrent { @@ -90,7 +91,7 @@ namespace libtorrent virtual void get_specific_peer_info(peer_info& p) const; virtual void disconnect(error_code const& ec - , peer_connection_interface::operation_t op, int error = 0); + , operation_t op, int error = 0); virtual void write_request(peer_request const& r); diff --git a/src/alert.cpp b/src/alert.cpp index 459a80f1d..ba2fc3095 100644 --- a/src/alert.cpp +++ b/src/alert.cpp @@ -288,6 +288,29 @@ namespace libtorrent { return ret; } + namespace + { + static char const* const sock_type_str[] = + { + "TCP", "TCP/SSL", "UDP", "I2P", "Socks5", "uTP/SSL" + }; + + static char const* const nat_type_str[] = {"NAT-PMP", "UPnP"}; + + static char const* const socket_type_str[] = { + "null", + "TCP", + "Socks5/TCP", + "HTTP", + "uTP", + "i2p", + "SSL/TCP", + "SSL/Socks5", + "HTTPS", + "SSL/uTP" + }; + } + std::string listen_failed_alert::message() const { static char const* op_str[] = @@ -299,52 +322,41 @@ namespace libtorrent { "get_peer_name", "accept" }; - static char const* type_str[] = - { - "TCP", "TCP/SSL", "UDP", "I2P", "Socks5", "uTP/SSL" - }; char ret[300]; snprintf(ret, sizeof(ret), "listening on %s failed: [%s] [%s] %s" , interface.c_str() , op_str[operation] - , type_str[sock_type] + , sock_type_str[sock_type] , convert_from_native(error.message()).c_str()); return ret; } std::string listen_succeeded_alert::message() const { - static char const* type_str[] = - { - "TCP", "TCP/SSL", "UDP", "uTP/SSL" - }; char ret[200]; snprintf(ret, sizeof(ret), "successfully listening on [%s] %s" - , type_str[sock_type], print_endpoint(endpoint).c_str()); + , sock_type_str[sock_type], print_endpoint(endpoint).c_str()); return ret; } std::string portmap_error_alert::message() const { - static char const* type_str[] = {"NAT-PMP", "UPnP"}; - return std::string("could not map port using ") + type_str[map_type] + return std::string("could not map port using ") + nat_type_str[map_type] + ": " + convert_from_native(error.message()); } std::string portmap_alert::message() const { - static char const* type_str[] = {"NAT-PMP", "UPnP"}; char ret[200]; snprintf(ret, sizeof(ret), "successfully mapped port using %s. external port: %u" - , type_str[map_type], external_port); + , nat_type_str[map_type], external_port); return ret; } std::string portmap_log_alert::message() const { - static char const* type_str[] = {"NAT-PMP", "UPnP"}; char ret[600]; - snprintf(ret, sizeof(ret), "%s: %s", type_str[map_type], msg.c_str()); + snprintf(ret, sizeof(ret), "%s: %s", nat_type_str[map_type], msg.c_str()); return ret; } @@ -501,25 +513,12 @@ namespace libtorrent { return torrent_alert::message() + " needs SSL certificate"; } - static char const* type_str[] = { - "null", - "TCP", - "Socks5/TCP", - "HTTP", - "uTP", - "i2p", - "SSL/TCP", - "SSL/Socks5", - "HTTPS", - "SSL/uTP" - }; - std::string incoming_connection_alert::message() const { char msg[600]; error_code ec; snprintf(msg, sizeof(msg), "incoming connection from %s (%s)" - , print_endpoint(ip).c_str(), type_str[socket_type]); + , print_endpoint(ip).c_str(), socket_type_str[socket_type]); return msg; } @@ -528,7 +527,7 @@ namespace libtorrent { char msg[600]; error_code ec; snprintf(msg, sizeof(msg), "%s connecting to peer (%s)" - , peer_alert::message().c_str(), type_str[socket_type]); + , peer_alert::message().c_str(), socket_type_str[socket_type]); return msg; } @@ -634,8 +633,11 @@ namespace libtorrent { std::string peer_disconnected_alert::message() const { char msg[600]; - snprintf(msg, sizeof(msg), "%s disconnecting [%s] [%s]: %s", peer_alert::message().c_str() - , operation_name(operation), error.category().name(), convert_from_native(error.message()).c_str()); + snprintf(msg, sizeof(msg), "%s disconnecting (%s) [%s] [%s]: %s" + , peer_alert::message().c_str() + , socket_type_str[socket_type] + , operation_name(operation), error.category().name() + , convert_from_native(error.message()).c_str()); return msg; } diff --git a/src/http_seed_connection.cpp b/src/http_seed_connection.cpp index 9afa8fc50..cce2aa805 100644 --- a/src/http_seed_connection.cpp +++ b/src/http_seed_connection.cpp @@ -83,13 +83,11 @@ namespace libtorrent } void http_seed_connection::disconnect(error_code const& ec - , peer_connection_interface::operation_t op, int error) + , operation_t op, int error) { if (is_disconnecting()) return; - if (op == peer_connection_interface::op_connect - && m_web - && !m_web->endpoints.empty()) + if (op == op_connect && m_web && !m_web->endpoints.empty()) { // we failed to connect to this IP. remove it so that the next attempt // uses the next IP in the list. diff --git a/src/lt_trackers.cpp b/src/lt_trackers.cpp index 299e781b3..2204e9cf5 100644 --- a/src/lt_trackers.cpp +++ b/src/lt_trackers.cpp @@ -201,7 +201,7 @@ namespace libtorrent { namespace int ret = lazy_bdecode(body.begin, body.end, msg, ec); if (ret != 0 || msg.type() != lazy_entry::dict_t) { - m_pc.disconnect(errors::invalid_lt_tracker_message, peer_connection_interface::op_bittorrent, 2); + m_pc.disconnect(errors::invalid_lt_tracker_message, op_bittorrent, 2); return true; } diff --git a/src/metadata_transfer.cpp b/src/metadata_transfer.cpp index 65382a233..0cf8a9884 100644 --- a/src/metadata_transfer.cpp +++ b/src/metadata_transfer.cpp @@ -389,7 +389,7 @@ namespace libtorrent { namespace if (length > 500 * 1024) { - m_pc.disconnect(errors::metadata_too_large, peer_connection_interface::op_bittorrent, 2); + m_pc.disconnect(errors::metadata_too_large, op_bittorrent, 2); return true; } @@ -412,7 +412,7 @@ namespace libtorrent { namespace if (length != 3) { // invalid metadata request - m_pc.disconnect(errors::invalid_metadata_request, peer_connection_interface::op_bittorrent, 2); + m_pc.disconnect(errors::invalid_metadata_request, op_bittorrent, 2); return true; } @@ -434,22 +434,22 @@ namespace libtorrent { namespace if (total_size > m_torrent.session().settings().get_int(settings_pack::max_metadata_size)) { - m_pc.disconnect(errors::metadata_too_large, peer_connection_interface::op_bittorrent, 2); + m_pc.disconnect(errors::metadata_too_large, op_bittorrent, 2); return true; } if (total_size <= 0) { - m_pc.disconnect(errors::invalid_metadata_size, peer_connection_interface::op_bittorrent, 2); + m_pc.disconnect(errors::invalid_metadata_size, op_bittorrent, 2); return true; } if (offset > total_size || offset < 0) { - m_pc.disconnect(errors::invalid_metadata_offset, peer_connection_interface::op_bittorrent, 2); + m_pc.disconnect(errors::invalid_metadata_offset, op_bittorrent, 2); return true; } if (offset + data_size > total_size) { - m_pc.disconnect(errors::invalid_metadata_message, peer_connection_interface::op_bittorrent, 2); + m_pc.disconnect(errors::invalid_metadata_message, op_bittorrent, 2); return true; } @@ -476,7 +476,7 @@ namespace libtorrent { namespace break; default: { - m_pc.disconnect(errors::invalid_metadata_message, peer_connection_interface::op_bittorrent, 2); + m_pc.disconnect(errors::invalid_metadata_message, op_bittorrent, 2); } } return true; diff --git a/src/peer_connection.cpp b/src/peer_connection.cpp index 91da47e13..bbbf40a62 100644 --- a/src/peer_connection.cpp +++ b/src/peer_connection.cpp @@ -3898,7 +3898,8 @@ namespace libtorrent // the error argument defaults to 0, which means deliberate disconnect // 1 means unexpected disconnect/error // 2 protocol error (client sent something invalid) - void peer_connection::disconnect(error_code const& ec, operation_t op, int error) + void peer_connection::disconnect(error_code const& ec + , operation_t op, int error) { TORRENT_ASSERT(is_single_thread()); #if TORRENT_USE_ASSERTS @@ -4080,7 +4081,8 @@ namespace libtorrent else if (error <= 1 && t->alerts().should_post()) { t->alerts().post_alert( - peer_disconnected_alert(handle, remote(), pid(), op, ec)); + peer_disconnected_alert(handle, remote(), pid(), op + , m_socket->type(), ec)); } } diff --git a/src/peer_list.cpp b/src/peer_list.cpp index 239bcb377..c0617edf8 100644 --- a/src/peer_list.cpp +++ b/src/peer_list.cpp @@ -179,7 +179,7 @@ namespace libtorrent banned.push_back(p->remote().address()); p->disconnect(errors::banned_by_ip_filter - , peer_connection_interface::op_bittorrent); + , op_bittorrent); // what *i refers to has changed, i.e. cur was deleted if (m_peers.size() < count) @@ -240,7 +240,7 @@ namespace libtorrent banned.push_back(p->remote().address()); - p->disconnect(errors::banned_by_port_filter, peer_connection_interface::op_bittorrent); + p->disconnect(errors::banned_by_port_filter, op_bittorrent); // what *i refers to has changed, i.e. cur was deleted if (int(m_peers.size()) < count) { @@ -623,7 +623,7 @@ namespace libtorrent #endif if (i->banned) { - c.disconnect(errors::peer_banned, peer_connection_interface::op_bittorrent); + c.disconnect(errors::peer_banned, op_bittorrent); return false; } @@ -635,8 +635,8 @@ namespace libtorrent if (self_connection) { - c.disconnect(errors::self_connection, peer_connection_interface::op_bittorrent, 1); - i->connection->disconnect(errors::self_connection, peer_connection_interface::op_bittorrent, 1); + c.disconnect(errors::self_connection, op_bittorrent, 1); + i->connection->disconnect(errors::self_connection, op_bittorrent, 1); TORRENT_ASSERT(i->connection == 0); return false; } @@ -648,7 +648,7 @@ namespace libtorrent { // if the other end connected to us both times, just drop // the second one. Or if we made both connections. - c.disconnect(errors::duplicate_peer_id, peer_connection_interface::op_bittorrent); + c.disconnect(errors::duplicate_peer_id, op_bittorrent); return false; } else @@ -681,12 +681,12 @@ namespace libtorrent // we should keep our outgoing connection if (!outgoing1) { - c.disconnect(errors::duplicate_peer_id, peer_connection_interface::op_bittorrent); + c.disconnect(errors::duplicate_peer_id, op_bittorrent); return false; } TORRENT_ASSERT(m_locked_peer == NULL); m_locked_peer = i; - i->connection->disconnect(errors::duplicate_peer_id, peer_connection_interface::op_bittorrent); + i->connection->disconnect(errors::duplicate_peer_id, op_bittorrent); m_locked_peer = NULL; } else @@ -698,12 +698,12 @@ namespace libtorrent // they should keep their outgoing connection if (outgoing1) { - c.disconnect(errors::duplicate_peer_id, peer_connection_interface::op_bittorrent); + c.disconnect(errors::duplicate_peer_id, op_bittorrent); return false; } TORRENT_ASSERT(m_locked_peer == NULL); m_locked_peer = i; - i->connection->disconnect(errors::duplicate_peer_id, peer_connection_interface::op_bittorrent); + i->connection->disconnect(errors::duplicate_peer_id, op_bittorrent); m_locked_peer = NULL; } } @@ -724,7 +724,7 @@ namespace libtorrent erase_peers(state, force_erase); if (int(m_peers.size()) >= state->max_peerlist_size) { - c.disconnect(errors::too_many_connections, peer_connection_interface::op_bittorrent); + c.disconnect(errors::too_many_connections, op_bittorrent); return false; } // restore it @@ -820,7 +820,7 @@ namespace libtorrent // we need to make sure we don't let it do that, locking i TORRENT_ASSERT(m_locked_peer == NULL); m_locked_peer = p; - p->connection->disconnect(errors::duplicate_peer_id, peer_connection_interface::op_bittorrent); + p->connection->disconnect(errors::duplicate_peer_id, op_bittorrent); m_locked_peer = NULL; erase_peer(p, state); return false; diff --git a/src/session_impl.cpp b/src/session_impl.cpp index 49718e2df..65ab55fc9 100644 --- a/src/session_impl.cpp +++ b/src/session_impl.cpp @@ -1051,7 +1051,7 @@ namespace aux { #if TORRENT_USE_ASSERTS int conn = m_connections.size(); #endif - (*m_connections.begin())->disconnect(errors::stopping_torrent, peer_connection::op_bittorrent); + (*m_connections.begin())->disconnect(errors::stopping_torrent, op_bittorrent); TORRENT_ASSERT_VAL(conn == int(m_connections.size()) + 1, conn); } @@ -2344,7 +2344,7 @@ retry: if (m_alerts.should_post()) { m_alerts.post_alert(peer_error_alert(torrent_handle(), endp - , peer_id(), peer_connection::op_ssl_handshake, ec)); + , peer_id(), op_ssl_handshake, ec)); } return; } @@ -2512,7 +2512,7 @@ retry: { m_alerts.post_alert( peer_disconnected_alert(torrent_handle(), endp, peer_id() - , peer_connection::op_bittorrent + , op_bittorrent, s->type() , error_code(errors::too_many_connections, get_libtorrent_category()))); } #if defined TORRENT_LOGGING @@ -2985,7 +2985,7 @@ retry: // TODO: have a separate list for these connections, instead of having to loop through all of them if (m_last_tick - p->connected_time() > seconds(m_settings.get_int(settings_pack::handshake_timeout))) - p->disconnect(errors::timed_out, peer_connection::op_bittorrent); + p->disconnect(errors::timed_out, op_bittorrent); } // -------------------------------------------------------------- diff --git a/src/smart_ban.cpp b/src/smart_ban.cpp index cfa8526d8..ffa5b0b6f 100644 --- a/src/smart_ban.cpp +++ b/src/smart_ban.cpp @@ -58,6 +58,7 @@ POSSIBILITY OF SUCH DAMAGE. #include "libtorrent/peer_connection.hpp" #include "libtorrent/peer_info.hpp" #include "libtorrent/random.hpp" +#include "libtorrent/operations.hpp" // for operation_t enum //#define TORRENT_LOG_HASH_FAILURES @@ -291,7 +292,7 @@ namespace #endif m_torrent.ban_peer(p); if (p->connection) p->connection->disconnect( - errors::peer_banned, peer_connection_interface::op_bittorrent); + errors::peer_banned, op_bittorrent); } // we already have this exact entry in the map // we don't have to insert it @@ -366,7 +367,7 @@ namespace #endif m_torrent.ban_peer(p); if (p->connection) p->connection->disconnect( - errors::peer_banned, peer_connection_interface::op_bittorrent); + errors::peer_banned, op_bittorrent); } torrent& m_torrent; diff --git a/src/torrent.cpp b/src/torrent.cpp index e5c01ca55..87ceda944 100644 --- a/src/torrent.cpp +++ b/src/torrent.cpp @@ -902,7 +902,7 @@ namespace libtorrent TORRENT_ASSERT(m_abort); TORRENT_ASSERT(m_connections.empty()); if (!m_connections.empty()) - disconnect_all(errors::torrent_aborted, peer_connection_interface::op_bittorrent); + disconnect_all(errors::torrent_aborted, op_bittorrent); } void torrent::read_piece(int piece) @@ -1126,7 +1126,7 @@ namespace libtorrent if (alerts().should_post()) alerts().post_alert(file_error_alert(j->error.ec , resolve_filename(j->error.file), j->error.operation_str(), get_handle())); - if (c) c->disconnect(errors::no_memory, peer_connection_interface::op_file); + if (c) c->disconnect(errors::no_memory, op_file); return; } @@ -2400,7 +2400,7 @@ namespace libtorrent if (!need_loaded()) return; - disconnect_all(errors::stopping_torrent, peer_connection_interface::op_bittorrent); + disconnect_all(errors::stopping_torrent, op_bittorrent); stop_announcing(); m_ses.disk_thread().async_release_files(m_storage.get() @@ -4346,7 +4346,7 @@ namespace libtorrent #if defined TORRENT_LOGGING peer->peer_log("*** BANNING PEER: Too many corrupt pieces"); #endif - peer->disconnect(errors::too_many_corrupt_pieces, peer_connection_interface::op_bittorrent); + peer->disconnect(errors::too_many_corrupt_pieces, op_bittorrent); } } } @@ -4707,7 +4707,7 @@ namespace libtorrent // disconnect all peers and close all // files belonging to the torrents - disconnect_all(errors::torrent_aborted, peer_connection_interface::op_bittorrent); + disconnect_all(errors::torrent_aborted, op_bittorrent); // post a message to the main thread to destruct // the torrent object from there @@ -5898,8 +5898,7 @@ namespace libtorrent // disconnect it and clear its reference to the peer_info object // that's part of the web_seed_t we're about to remove TORRENT_ASSERT(peer->m_in_use == 1337); - peer->disconnect(boost::asio::error::operation_aborted - , peer_connection_interface::op_bittorrent); + peer->disconnect(boost::asio::error::operation_aborted, op_bittorrent); peer->set_peer_info(0); } if (has_picker()) picker().clear_peer(&web->peer_info); @@ -6374,7 +6373,7 @@ namespace libtorrent #if defined TORRENT_LOGGING debug_log("*** PEER_ERROR: %s", e.what()); #endif - c->disconnect(errors::no_error, peer_connection_interface::op_bittorrent, 1); + c->disconnect(errors::no_error, op_bittorrent, 1); } } @@ -7395,7 +7394,7 @@ namespace libtorrent update_want_peers(); update_want_tick(); } - c->disconnect(errors::no_error, peer_connection_interface::op_bittorrent, 1); + c->disconnect(errors::no_error, op_bittorrent, 1); return false; } @@ -7532,14 +7531,14 @@ namespace libtorrent if (ssl_conn == 0) { // don't allow non SSL peers on SSL torrents - p->disconnect(errors::requires_ssl_connection, peer_connection_interface::op_bittorrent); + p->disconnect(errors::requires_ssl_connection, op_bittorrent); return false; } if (!m_ssl_ctx) { // we don't have a valid cert, don't accept any connection! - p->disconnect(errors::invalid_ssl_cert, peer_connection_interface::op_ssl_handshake); + p->disconnect(errors::invalid_ssl_cert, op_ssl_handshake); return false; } @@ -7550,14 +7549,14 @@ namespace libtorrent // connected to one torrent, and the BitTorrent protocol // to a different one. This is probably an attempt to circumvent // access control. Don't allow it. - p->disconnect(errors::invalid_ssl_cert, peer_connection_interface::op_bittorrent); + p->disconnect(errors::invalid_ssl_cert, op_bittorrent); return false; } } #else // BOOST_VERSION if (is_ssl_torrent()) { - p->disconnect(asio::error::operation_not_supported, peer_connection_interface::op_bittorrent); + p->disconnect(asio::error::operation_not_supported, op_bittorrent); return false; } #endif @@ -7566,7 +7565,7 @@ namespace libtorrent { // Don't accidentally allow seeding of SSL torrents, just // because libtorrent wasn't built with SSL support - p->disconnect(errors::requires_ssl_connection, peer_connection_interface::op_ssl_handshake); + p->disconnect(errors::requires_ssl_connection, op_ssl_handshake); return false; } #endif // TORRENT_USE_OPENSSL @@ -7582,7 +7581,7 @@ namespace libtorrent if (m_ses.alerts().should_post()) m_ses.alerts().post_alert(peer_blocked_alert(get_handle() , p->remote().address(), peer_blocked_alert::ip_filter)); - p->disconnect(errors::banned_by_ip_filter, peer_connection_interface::op_bittorrent); + p->disconnect(errors::banned_by_ip_filter, op_bittorrent); return false; } @@ -7590,19 +7589,19 @@ namespace libtorrent || m_state == torrent_status::checking_resume_data) && valid_metadata()) { - p->disconnect(errors::torrent_not_ready, peer_connection_interface::op_bittorrent); + p->disconnect(errors::torrent_not_ready, op_bittorrent); return false; } if (!m_ses.has_connection(p)) { - p->disconnect(errors::peer_not_constructed, peer_connection_interface::op_bittorrent); + p->disconnect(errors::peer_not_constructed, op_bittorrent); return false; } if (m_ses.is_aborted()) { - p->disconnect(errors::session_closing, peer_connection_interface::op_bittorrent); + p->disconnect(errors::session_closing, op_bittorrent); return false; } @@ -7639,10 +7638,10 @@ namespace libtorrent if (i == end() || !(*i)->is_connecting() || (*i)->is_disconnecting()) { // this seems odd, but we might as well handle it - p->disconnect(errors::too_many_connections, peer_connection_interface::op_bittorrent); + p->disconnect(errors::too_many_connections, op_bittorrent); return false; } - (*i)->disconnect(errors::too_many_connections, peer_connection_interface::op_bittorrent); + (*i)->disconnect(errors::too_many_connections, op_bittorrent); // if this peer was let in via connections slack, // it has done its duty of causing the disconnection @@ -7674,7 +7673,7 @@ namespace libtorrent debug_log("CLOSING CONNECTION \"%s\" peer list full" , print_endpoint(p->remote()).c_str()); #endif - p->disconnect(errors::too_many_connections, peer_connection_interface::op_bittorrent); + p->disconnect(errors::too_many_connections, op_bittorrent); return false; } peers_erased(st.erased); @@ -7688,7 +7687,7 @@ namespace libtorrent debug_log("CLOSING CONNECTION \"%s\" caught exception: %s" , print_endpoint(p->remote()).c_str(), e.what()); #endif - p->disconnect(errors::no_error, peer_connection_interface::op_bittorrent); + p->disconnect(errors::no_error, op_bittorrent); return false; } TORRENT_ASSERT(sorted_find(m_connections, p) == m_connections.end()); @@ -7725,12 +7724,12 @@ namespace libtorrent // TODO: 2 if peer is a really good peer, maybe we shouldn't disconnect it if (peer && peer->peer_rank() < p->peer_rank()) { - peer->disconnect(errors::too_many_connections, peer_connection_interface::op_bittorrent); + peer->disconnect(errors::too_many_connections, op_bittorrent); p->peer_disconnected_other(); } else { - p->disconnect(errors::too_many_connections, peer_connection_interface::op_bittorrent); + p->disconnect(errors::too_many_connections, op_bittorrent); // we have to do this here because from the peer's point of // it wasn't really attached to the torrent, but we do need // to let peer_list know we're removing it @@ -7845,7 +7844,7 @@ namespace libtorrent } } - void torrent::disconnect_all(error_code const& ec, peer_connection_interface::operation_t op) + void torrent::disconnect_all(error_code const& ec, operation_t op) { // doesn't work with the !m_allow_peers -> m_num_peers == 0 condition // INVARIANT_CHECK; @@ -7861,7 +7860,7 @@ namespace libtorrent if (p->is_disconnecting()) m_connections.erase(m_connections.begin()); else - p->disconnect(ec, (peer_connection::operation_t)op); + p->disconnect(ec, op); TORRENT_ASSERT(m_connections.size() <= size); } @@ -7932,7 +7931,7 @@ namespace libtorrent #if TORRENT_USE_ASSERTS int num_conns = m_connections.size(); #endif - p->disconnect(ec, peer_connection_interface::op_bittorrent); + p->disconnect(ec, op_bittorrent); TORRENT_ASSERT(int(m_connections.size()) == num_conns - 1); } @@ -7986,7 +7985,7 @@ namespace libtorrent } std::for_each(seeds.begin(), seeds.end() , boost::bind(&peer_connection::disconnect, _1, errors::torrent_finished - , peer_connection_interface::op_bittorrent, 0)); + , op_bittorrent, 0)); } if (m_abort) return; @@ -8709,7 +8708,7 @@ namespace libtorrent log_to_all_peers("DELETING FILES IN TORRENT"); #endif - disconnect_all(errors::torrent_removed, peer_connection_interface::op_bittorrent); + disconnect_all(errors::torrent_removed, op_bittorrent); stop_announcing(); // storage may be NULL during shutdown @@ -9130,7 +9129,7 @@ namespace libtorrent if (alerts().should_post()) alerts().post_alert(torrent_paused_alert(get_handle())); } - disconnect_all(errors::torrent_paused, peer_connection_interface::op_bittorrent); + disconnect_all(errors::torrent_paused, op_bittorrent); return; } @@ -9150,7 +9149,7 @@ namespace libtorrent alerts().post_alert(torrent_paused_alert(get_handle())); } - disconnect_all(errors::torrent_paused, peer_connection_interface::op_bittorrent); + disconnect_all(errors::torrent_paused, op_bittorrent); } else { @@ -9187,7 +9186,7 @@ namespace libtorrent #if defined TORRENT_LOGGING p->peer_log("*** CLOSING CONNECTION: torrent_paused"); #endif - p->disconnect(errors::torrent_paused, peer_connection_interface::op_bittorrent); + p->disconnect(errors::torrent_paused, op_bittorrent); i = j; } if (update_ticks) @@ -9669,7 +9668,7 @@ namespace libtorrent #if defined TORRENT_LOGGING p->peer_log("*** ERROR %s", e.what()); #endif - p->disconnect(errors::no_error, peer_connection_interface::op_bittorrent, 1); + p->disconnect(errors::no_error, op_bittorrent, 1); } if (p->is_disconnecting()) @@ -9820,7 +9819,7 @@ namespace libtorrent TORRENT_ASSERT(to_disconnect <= int(seeds.size())); for (int i = 0; i < to_disconnect; ++i) seeds[i]->disconnect(errors::upload_upload_connection - , peer_connection_interface::op_bittorrent); + , op_bittorrent); } if (num_downloaders == 0) return; @@ -10609,7 +10608,7 @@ namespace libtorrent } void torrent::remove_web_seed(peer_connection* p, error_code const& ec - , peer_connection_interface::operation_t op, int error) + , operation_t op, int error) { std::list::iterator i = std::find_if(m_web_seeds.begin() , m_web_seeds.end() diff --git a/src/ut_metadata.cpp b/src/ut_metadata.cpp index 2f3281ade..e44be8e7f 100644 --- a/src/ut_metadata.cpp +++ b/src/ut_metadata.cpp @@ -284,7 +284,7 @@ namespace libtorrent { namespace m_pc.peer_log("*** UT_METADATA [ invalid piece %d metadata size: %d ]" , piece, int(m_tp.get_metadata_size())); #endif - m_pc.disconnect(errors::invalid_metadata_message, peer_connection_interface::op_bittorrent, 2); + m_pc.disconnect(errors::invalid_metadata_message, op_bittorrent, 2); return; } @@ -333,7 +333,7 @@ namespace libtorrent { namespace #ifdef TORRENT_LOGGING m_pc.peer_log("<== UT_METADATA [ packet too big %d ]", length); #endif - m_pc.disconnect(errors::invalid_metadata_message, peer_connection_interface::op_bittorrent, 2); + m_pc.disconnect(errors::invalid_metadata_message, op_bittorrent, 2); return true; } @@ -346,7 +346,7 @@ namespace libtorrent { namespace #ifdef TORRENT_LOGGING m_pc.peer_log("<== UT_METADATA [ not a dictionary ]"); #endif - m_pc.disconnect(errors::invalid_metadata_message, peer_connection_interface::op_bittorrent, 2); + m_pc.disconnect(errors::invalid_metadata_message, op_bittorrent, 2); return true; } @@ -358,7 +358,7 @@ namespace libtorrent { namespace #ifdef TORRENT_LOGGING m_pc.peer_log("<== UT_METADATA [ missing or invalid keys ]"); #endif - m_pc.disconnect(errors::invalid_metadata_message, peer_connection_interface::op_bittorrent, 2); + m_pc.disconnect(errors::invalid_metadata_message, op_bittorrent, 2); return true; } int type = type_ent->integer(); diff --git a/src/ut_pex.cpp b/src/ut_pex.cpp index a25f4f5ff..6dc72af22 100644 --- a/src/ut_pex.cpp +++ b/src/ut_pex.cpp @@ -280,7 +280,7 @@ namespace libtorrent { namespace if (length > 500 * 1024) { - m_pc.disconnect(errors::pex_message_too_large, peer_connection_interface::op_bittorrent, 2); + m_pc.disconnect(errors::pex_message_too_large, op_bittorrent, 2); return true; } @@ -291,7 +291,7 @@ namespace libtorrent { namespace { // this client appears to be trying to flood us // with pex messages. Don't allow that. - m_pc.disconnect(errors::too_frequent_pex, peer_connection_interface::op_bittorrent); + m_pc.disconnect(errors::too_frequent_pex, op_bittorrent); return true; } @@ -305,7 +305,7 @@ namespace libtorrent { namespace int ret = lazy_bdecode(body.begin, body.end, pex_msg, ec); if (ret != 0 || pex_msg.type() != lazy_entry::dict_t) { - m_pc.disconnect(errors::invalid_pex_message, peer_connection_interface::op_bittorrent, 2); + m_pc.disconnect(errors::invalid_pex_message, op_bittorrent, 2); return true; } diff --git a/src/web_peer_connection.cpp b/src/web_peer_connection.cpp index 12fc5d7b1..4eb449ad0 100644 --- a/src/web_peer_connection.cpp +++ b/src/web_peer_connection.cpp @@ -115,12 +115,11 @@ void web_peer_connection::on_connected() } void web_peer_connection::disconnect(error_code const& ec - , peer_connection_interface::operation_t op, int error) + , operation_t op, int error) { if (is_disconnecting()) return; - if (op == peer_connection_interface::op_sock_write - && ec == boost::system::errc::broken_pipe) + if (op == op_sock_write && ec == boost::system::errc::broken_pipe) { #ifdef TORRENT_LOGGING // a write operation failed with broken-pipe. This typically happens @@ -144,9 +143,7 @@ void web_peer_connection::disconnect(error_code const& ec return; } - if (op == peer_connection_interface::op_connect - && m_web - && !m_web->endpoints.empty()) + if (op == op_connect && m_web && !m_web->endpoints.empty()) { // we failed to connect to this IP. remove it so that the next attempt // uses the next IP in the list.