changed how dns deals with cnames and recursion: remember cnames and implement recurs...
[pingcheck] / src / dns / dnsresolver.h
index a75ea7f..7069610 100644 (file)
 #include <boost/asio/ip/address.hpp>
 #include <boost/system/error_code.hpp>
 #include <boost/net/network_array.hpp>   // dns_buffer_t
+#include <boost/uuid/uuid_generators.hpp>
 
 #include "dns/resolverbase.h"
 #include "dns/dnsmaster.h"
 #include "dns/dnscache.h"
 
 
+typedef std::pair<std::string, std::string> string_pair;
+
+
 class DnsResolver : public ResolverBase
 {
 public:
@@ -71,17 +75,26 @@ private:
     void handle_unavailable();
     void handle_ips(const HostAddressVec &ips);
     void handle_cname(const std::string &canonical_name);
+    void handle_recurse(const HostAddress &name_server);
     void cname_resolve_callback(const std::string &canonical_name,
                                 const bool was_success,
-                                const int cname_count);
-    void finalize_resolve(const bool success, const int cname_count=0);
+                                const int recursion_count);
+    void recursive_resolve_callback(const uint32_t min_ttl,
+                                    const bool was_success,
+                                    const int recursion_count);
+    void finalize_resolve(const bool success, const int recursion_count=0);
     void stop_trying();
     void wait_timer_timeout_handler(const boost::system::error_code &error);
+    void gather_results( const boost::net::dns::rr_list_t *answers,
+                         HostAddressVec *result_ips,
+                         std::vector<string_pair> *result_cnames,
+                         std::vector<string_pair> *result_nameservers ) const;
 
 // variables
 private:
     boost::asio::ip::udp::socket Socket;
     boost::net::dns_buffer_t ReceiveBuffer;
+    boost::net::dns_buffer_t RequestBuffer;
     DnsIpProtocol Protocol;
     boost::asio::ip::udp::endpoint NameServer;
     boost::asio::deadline_timer ResolveTimeoutTimer;
@@ -91,6 +104,9 @@ private:
     int RetryCount;
     bool IsResolving;
     std::string LogPrefix;
+    boost::uuids::random_generator RandomIdGenerator;
+    uint16_t RequestId;
+    ResolverItem Recursor;
 };
 
 #endif