summaryrefslogtreecommitdiff
path: root/src/network/socket_handler.cpp
diff options
context:
space:
mode:
authorFlorent Le Coz <louiz@louiz.org>2014-02-08 07:52:22 +0100
committerFlorent Le Coz <louiz@louiz.org>2014-02-08 07:52:22 +0100
commitc8b41d5e350354881caa933ab363a2e90f991524 (patch)
tree68f87c18618b63ce1750389b13088d6b1b0f5849 /src/network/socket_handler.cpp
parentde7b3503a47ea7d5a6177359f6c799c2dd5e586e (diff)
downloadbiboumi-c8b41d5e350354881caa933ab363a2e90f991524.tar.gz
biboumi-c8b41d5e350354881caa933ab363a2e90f991524.tar.bz2
biboumi-c8b41d5e350354881caa933ab363a2e90f991524.tar.xz
biboumi-c8b41d5e350354881caa933ab363a2e90f991524.zip
Be verbose about IRC server connection failures, and handle them properly
Diffstat (limited to 'src/network/socket_handler.cpp')
-rw-r--r--src/network/socket_handler.cpp19
1 files changed, 11 insertions, 8 deletions
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<bool, std::string> 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)