Added AAAA resource records in the DNS query.
authorGuilherme Maciel Ferreira <guilherme.maciel.ferreira@gmail.com>
Sun, 4 Mar 2012 23:55:34 +0000 (20:55 -0300)
committerGuilherme Maciel Ferreira <guilherme.maciel.ferreira@gmail.com>
Sun, 4 Mar 2012 23:55:34 +0000 (20:55 -0300)
- DNS resolve to IPv6 addresses.

src/dns/dnsresolver.cpp
src/dns/dnsresolver.h

index 40aaaae..21f7f31 100644 (file)
@@ -36,6 +36,7 @@ using namespace std;
 using boost::asio::io_service;
 using boost::asio::ip::address;
 using boost::net::dns::a_resource;
+using boost::net::dns::a6_resource;
 using boost::net::dns::resource_base_t;
 using boost::net::dns::message;
 using boost::net::dns::rr_list_t;
@@ -52,14 +53,18 @@ using I2n::Logger::GlobalLogger;
  *
  * @param dns_address The DNS address to resolve.
  * @param nameserver The server to consult about name resolution.
+ * @param address_resource_record_type 'A' resource records for the IPv4 addresses, or 'AAAA'
+ * resource records for the IPv6 addresses
  */
 DnsResolver::DnsResolver(
         const string &dns_address,
-        const string &nameserver
+        const string &nameserver,
+        const type_t address_resource_record_type
 ) :
     ResolvedHostAddressList(),
     HostDnsAddress( dns_address ),
-    NameServer( nameserver )
+    NameServer( nameserver ),
+    AddressResourceRecord( address_resource_record_type )
 {
 }
 
@@ -90,13 +95,11 @@ bool DnsResolver::resolve()
 
     try
     {
-        rr_list_t answers_list = fill_answers_list( HostDnsAddress, NameServer, boost::net::dns::type_a );
-
+        rr_list_t answers_list = get_answers_list( HostDnsAddress, NameServer, AddressResourceRecord );
         size_t resolved_ip_count = answers_list.size();
         if ( resolved_ip_count < 1 )
         {
-            GlobalLogger.error() << "Error: host "
-                    << HostDnsAddress << " could not be resolved." << endl;
+            GlobalLogger.error() << "Error: IP host " << HostDnsAddress << " could not be resolved." << endl;
             return false;
         }
 
@@ -191,8 +194,7 @@ bool DnsResolver::handle_ip_address()
 
     try
     {
-        // Convert string to IP address
-        // Work with both IPv4 and IPv6
+        // Convert string to IP address, to work with both IPv4 and IPv6
         address addr = address::from_string( HostDnsAddress );
 
         if ( addr.is_v4() || addr.is_v6() )
@@ -218,7 +220,7 @@ bool DnsResolver::handle_ip_address()
     return false;
 }
 
-rr_list_t DnsResolver::fill_answers_list(
+rr_list_t DnsResolver::get_answers_list(
         const string &host_dns_address,
         const string &name_server,
         const type_t message_type
@@ -256,6 +258,10 @@ void DnsResolver::fill_resolved_ip_list(
                     // 'A' resource records carry IPv4 addresses
                     append_resolved_ipv4( resource_record, resolved_host_address_list );
                     break;
+                case boost::net::dns::type_a6:
+                    // 'AAAA' resource records carry IPv6 addresses
+                    append_resolved_ipv6( resource_record, resolved_host_address_list );
+                    break;
                 default:
                     // other types of resource records
                     break;
@@ -289,3 +295,23 @@ void DnsResolver::append_resolved_ipv4(
         GlobalLogger.info() << "- " << current_ip << " [" << current_ttl << "s]" << endl;
     }
 }
+
+void DnsResolver::append_resolved_ipv6(
+        const shared_ptr<resource_base_t> resource_record,
+        HostAddressList *resolved_host_address_list
+) const
+{
+    BOOST_ASSERT( resource_record->rtype() == boost::net::dns::type_a6 );
+
+    a6_resource *a6_rr = dynamic_cast<a6_resource *> ( resource_record.get() );
+    if ( a6_rr != NULL )
+    {
+        string current_ip = a6_rr->address().to_string();
+        uint32_t current_ttl = a6_rr->ttl();
+
+        HostAddress resolved_host( current_ip, current_ttl );
+        resolved_host_address_list->push_back( resolved_host );
+
+        GlobalLogger.info() << "- " << current_ip << " [" << current_ttl << "s]" << endl;
+    }
+}
index b24cb2c..74f1b70 100644 (file)
@@ -23,6 +23,7 @@ on this file might be covered by the GNU General Public License.
 #include <string>
 
 #include <boost/net/dns.hpp>
+#include <boost/shared_ptr.hpp>
 
 #include "dns/hostaddress.h"
 
@@ -38,11 +39,13 @@ class DnsResolver
 public:
     DnsResolver(
             const std::string &dns_address,
-            const std::string &nameserver
+            const std::string &nameserver,
+            const boost::net::dns::type_t address_resource_record_type
     );
     ~DnsResolver();
 
     bool resolve();
+
     int get_resolved_ip_count() const;
     std::string get_next_ip();
     bool expired_resolved_ip() const;
@@ -50,7 +53,7 @@ public:
 private:
     bool handle_ip_address();
 
-    boost::net::dns::rr_list_t fill_answers_list(
+    boost::net::dns::rr_list_t get_answers_list(
             const std::string &host_dns_address,
             const std::string &name_server,
             const boost::net::dns::type_t message_type
@@ -63,6 +66,10 @@ private:
             const shared_ptr<boost::net::dns::resource_base_t> resource_record,
             std::list<HostAddress> *resolved_host_address_list
     ) const;
+    void append_resolved_ipv6(
+            const shared_ptr<boost::net::dns::resource_base_t> resource_record,
+            std::list<HostAddress> *resolved_host_address_list
+    ) const;
 
 private:
     /// The list of IPs available to the host DNS.
@@ -71,7 +78,15 @@ private:
     const std::string HostDnsAddress;
     /// The address of the server which can resolve the host address.
     const std::string NameServer;
+    /// 'A' resource records for the IPv4 addresses, or 'AAAA' resource records for the IPv6 addresses
+    boost::net::dns::type_t AddressResourceRecord;
 
 };
 
+//-----------------------------------------------------------------------------
+// DnsResolverItem
+//-----------------------------------------------------------------------------
+
+typedef boost::shared_ptr<DnsResolver> DnsResolverItem;
+
 #endif // DNS_RESOLVER_H