diff --git a/lib/base/tcpsocket.cpp b/lib/base/tcpsocket.cpp index 1ad0e23a8..d66e66b2b 100644 --- a/lib/base/tcpsocket.cpp +++ b/lib/base/tcpsocket.cpp @@ -213,14 +213,18 @@ void TcpSocket::Connect(const String& node, const String& service) } } -void icinga::Connect(AsioTcpSocket& socket, const String& node, const String& service, boost::asio::yield_context* yc) -{ - using boost::asio::ip::tcp; +using boost::asio::ip::tcp; +AsioDnsResponse icinga::Resolve(const String& node, const String& service, boost::asio::yield_context* yc) +{ tcp::resolver resolver (IoEngine::Get().GetIoContext()); tcp::resolver::query query (node, service); - auto result (yc ? resolver.async_resolve(query, *yc) : resolver.resolve(query)); - auto current (result.begin()); + return yc ? resolver.async_resolve(query, *yc) : resolver.resolve(query); +} + +void icinga::Connect(AsioTcpSocket& socket, const AsioDnsResponse& to, boost::asio::yield_context* yc) +{ + auto current (to.begin()); for (;;) { try { @@ -237,7 +241,7 @@ void icinga::Connect(AsioTcpSocket& socket, const String& node, const String& se } catch (const std::exception& ex) { auto se (dynamic_cast(&ex)); - if (se && se->code() == boost::asio::error::operation_aborted || ++current == result.end()) { + if (se && se->code() == boost::asio::error::operation_aborted || ++current == to.end()) { throw; } diff --git a/lib/base/tcpsocket.hpp b/lib/base/tcpsocket.hpp index 13c19ee91..a2c08d3a6 100644 --- a/lib/base/tcpsocket.hpp +++ b/lib/base/tcpsocket.hpp @@ -28,22 +28,45 @@ public: }; typedef boost::asio::ip::tcp::socket::lowest_layer_type AsioTcpSocket; +typedef boost::asio::ip::tcp::resolver::results_type AsioDnsResponse; + +AsioDnsResponse Resolve(const String& node, const String& service, boost::asio::yield_context* yc); + +inline AsioDnsResponse Resolve(const String& node, const String& service) +{ + return Resolve(node, service, nullptr); +} + +inline AsioDnsResponse Resolve(const String& node, const String& service, boost::asio::yield_context yc) +{ + return Resolve(node, service, &yc); +} /** * TCP Connect based on Boost ASIO. * * @ingroup base */ -void Connect(AsioTcpSocket& socket, const String& node, const String& service, boost::asio::yield_context* yc); +void Connect(AsioTcpSocket& socket, const AsioDnsResponse& to, boost::asio::yield_context* yc); inline void Connect(AsioTcpSocket& socket, const String& node, const String& service) { - Connect(socket, node, service, nullptr); + Connect(socket, Resolve(node, service, nullptr), nullptr); } inline void Connect(AsioTcpSocket& socket, const String& node, const String& service, boost::asio::yield_context yc) { - Connect(socket, node, service, &yc); + Connect(socket, Resolve(node, service, &yc), &yc); +} + +inline void Connect(AsioTcpSocket& socket, const AsioDnsResponse& to) +{ + Connect(socket, to, nullptr); +} + +inline void Connect(AsioTcpSocket& socket, const AsioDnsResponse& to, boost::asio::yield_context yc) +{ + Connect(socket, to, &yc); } }