From c8b41d5e350354881caa933ab363a2e90f991524 Mon Sep 17 00:00:00 2001 From: Florent Le Coz Date: Sat, 8 Feb 2014 07:52:22 +0100 Subject: Be verbose about IRC server connection failures, and handle them properly --- src/irc/irc_client.cpp | 7 ++++++- src/network/socket_handler.cpp | 19 +++++++++++-------- src/network/socket_handler.hpp | 3 ++- src/xmpp/xmpp_component.cpp | 2 +- 4 files changed, 20 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/irc/irc_client.cpp b/src/irc/irc_client.cpp index 644351e..a84f96e 100644 --- a/src/irc/irc_client.cpp +++ b/src/irc/irc_client.cpp @@ -27,7 +27,12 @@ IrcClient::~IrcClient() void IrcClient::start() { - this->connect(this->hostname, "6667"); + this->bridge->send_xmpp_message(this->hostname, "", std::string("Connecting to ") + + this->hostname + ":" + "6667"); + std::pair res = this->connect(this->hostname, "6667"); + if (!res.first) + this->bridge->send_xmpp_message(this->hostname, "", + std::string("Connection failed: ") + res.second); } void IrcClient::on_connected() diff --git a/src/network/socket_handler.cpp b/src/network/socket_handler.cpp index 67adacd..ea674d1 100644 --- a/src/network/socket_handler.cpp +++ b/src/network/socket_handler.cpp @@ -23,7 +23,7 @@ SocketHandler::SocketHandler(): throw std::runtime_error("Could not create socket"); } -bool SocketHandler::connect(const std::string& address, const std::string& port) +std::pair SocketHandler::connect(const std::string& address, const std::string& port) { log_info("Trying to connect to " << address << ":" << port); struct addrinfo hints; @@ -35,15 +35,18 @@ bool SocketHandler::connect(const std::string& address, const std::string& port) struct addrinfo* addr_res; const int res = ::getaddrinfo(address.c_str(), port.c_str(), &hints, &addr_res); - // Make sure the alloced structure is always freed at the end of the - // function - utils::ScopeGuard sg([&addr_res](){ freeaddrinfo(addr_res); }); if (res != 0) { - perror("getaddrinfo"); - throw std::runtime_error("getaddrinfo failed"); + log_warning(std::string("getaddrinfo failed: ") + gai_strerror(res)); + this->close(); + return std::make_pair(false, gai_strerror(res)); } + + // Make sure the alloced structure is always freed at the end of the + // function + utils::ScopeGuard sg([&addr_res](){ freeaddrinfo(addr_res); }); + for (struct addrinfo* rp = addr_res; rp; rp = rp->ai_next) { if (::connect(this->socket, rp->ai_addr, rp->ai_addrlen) == 0) @@ -51,14 +54,14 @@ bool SocketHandler::connect(const std::string& address, const std::string& port) log_info("Connection success."); this->connected = true; this->on_connected(); - return true; + return std::make_pair(true, ""); } log_info("Connection failed:"); perror("connect"); } log_error("All connection attempts failed."); this->close(); - return false; + return std::make_pair(false, ""); } void SocketHandler::set_poller(Poller* poller) diff --git a/src/network/socket_handler.hpp b/src/network/socket_handler.hpp index ec63ea7..c27d44c 100644 --- a/src/network/socket_handler.hpp +++ b/src/network/socket_handler.hpp @@ -2,6 +2,7 @@ # define SOCKET_HANDLER_INCLUDED #include +#include typedef int socket_t; @@ -21,7 +22,7 @@ public: /** * Connect to the remote server, and call on_connected() if this succeeds */ - bool connect(const std::string& address, const std::string& port); + std::pair connect(const std::string& address, const std::string& port); /** * Set the pointer to the given Poller, to communicate with it. */ diff --git a/src/xmpp/xmpp_component.cpp b/src/xmpp/xmpp_component.cpp index 6fec72c..92c614c 100644 --- a/src/xmpp/xmpp_component.cpp +++ b/src/xmpp/xmpp_component.cpp @@ -49,7 +49,7 @@ XmppComponent::~XmppComponent() bool XmppComponent::start() { - return this->connect("127.0.0.1", "5347"); + return this->connect("127.0.0.1", "5347").first; } bool XmppComponent::is_document_open() const -- cgit v1.2.3