#pragma once #include #include #include #include #include #include #include #include #ifdef _WIN32 #include #endif namespace llarp::dns { using ReplyFunction = std::function buf)>; using FailFunction = std::function; class UnboundResolver : public std::enable_shared_from_this { private: ub_ctx* unboundContext; std::atomic started; std::unique_ptr runner; ReplyFunction replyFunc; FailFunction failFunc; void Reset(); public: UnboundResolver(std::shared_ptr logic, ReplyFunction replyFunc, FailFunction failFunc); static void Callback(void* data, int err, ub_result* result); // stop resolver thread void Stop(); // upstream resolver IP can be IPv4 or IPv6 bool Init(); bool AddUpstreamResolver(const std::string& upstreamResolverIP); void Lookup(SockAddr to, SockAddr from, Message msg); }; } // namespace llarp::dns