]> granicus.if.org Git - pdns/commitdiff
Added xfrIP6 implementation
authorAki Tuomi <cmouse@desteem.org>
Mon, 13 May 2013 13:22:58 +0000 (16:22 +0300)
committerAki Tuomi <cmouse@desteem.org>
Mon, 13 May 2013 19:05:05 +0000 (22:05 +0300)
pdns/dnsparser.cc
pdns/dnsparser.hh
pdns/dnswriter.hh
pdns/rcpgenerator.cc
pdns/rcpgenerator.hh

index 7889aa95993602ac6347e2525c6ae4ab1942e828..095454ac7957fa0859e17c8c5fdc6fb6f567eabe 100644 (file)
@@ -377,7 +377,6 @@ uint8_t PacketReader::get8BitInt()
   return d_content.at(d_pos++);
 }
 
-
 string PacketReader::getLabel(unsigned int recurs)
 {
   string ret;
index 0d6b2447733bdd958b0e1c16573b777edbbfd38d..414c73e9810fbacc4975329a5c84fab97fb18ee5 100644 (file)
@@ -86,6 +86,10 @@ public:
     val=htonl(val);
   }
 
+  void xfrIP6(std::string &val) {
+    xfrBlob(val, 16);
+  }
+
   void xfrTime(uint32_t& val)
   {
     xfr32BitInt(val);
index b0219775d3b0b49c9bf97bad0d9a1d445f0dcd16..69bd88e5385b4702487c83c5357346e7547c8e14 100644 (file)
@@ -77,6 +77,10 @@ public:
   {
     xfr32BitInt(htonl(val));
   }
+  void xfrIP6(const std::string& val) 
+  {
+    xfrBlob(val,16);
+  }
   void xfrTime(const uint32_t& val)
   {
     xfr32BitInt(val);
index b4946550ddaaf467959bc43f3b2737ca361ddd4e..269967110716e6c1ee5694e59cd5f12e8f3dc852 100644 (file)
@@ -124,6 +124,31 @@ void RecordTextReader::xfrIP(uint32_t &val)
 }
 
 
+void RecordTextReader::xfrIP6(std::string &val)
+{
+  char addrbuf[40];
+  struct in6_addr tmpbuf;
+
+  skipSpaces();
+  if(!isxdigit(d_string.at(d_pos)))
+    throw RecordTextException("while parsing IPv6 address, expected xdigits at position "+lexical_cast<string>(d_pos)+" in '"+d_string+"'");
+  
+  size_t len;
+  // lookup end of value
+  for(len=0; len < sizeof(addrbuf) && d_pos+len < d_string.length() && (isxdigit(d_string.at(d_pos+len)) || d_string.at(d_pos+len) == ':');len++);
+
+  // end of value is here, try parse as IPv6
+  d_string.copy(addrbuf, len, d_pos);
+
+  if (inet_pton(AF_INET6, addrbuf, &tmpbuf) != 1) {
+    throw RecordTextException("while parsing IPv6 address: '" + std::string(addrbuf) + "' is invalid");
+  }
+
+  val = std::string((char*)tmpbuf.s6_addr, 16);
+
+  d_pos += len;
+}
+
 bool RecordTextReader::eof()
 {
   return d_pos==d_end;
@@ -400,6 +425,21 @@ void RecordTextWriter::xfrIP(const uint32_t& val)
   d_string.append(tmp, pos);
 }
 
+void RecordTextWriter::xfrIP6(const std::string& val)
+{
+  char tmpbuf[16];
+  char addrbuf[40];
+
+  if(!d_string.empty())
+   d_string.append(1,' ');
+  
+  val.copy(tmpbuf,16);
+
+  if (inet_ntop(AF_INET6, tmpbuf, addrbuf, sizeof addrbuf) == NULL)
+    throw RecordTextException("Unable to convert to ipv6 address");
+  
+  d_string += std::string(addrbuf);
+}
 
 void RecordTextWriter::xfrTime(const uint32_t& val)
 {
index 174b70a675ccaf55bc1b909f6ebb76c5e15f900e..02e211ab725547a15d7d800d48115f04204ff6b3 100644 (file)
@@ -49,6 +49,7 @@ public:
 
   void xfrType(uint16_t& val);
   void xfrIP(uint32_t& val);
+  void xfrIP6(std::string& val);
   void xfrTime(uint32_t& val);
 
   void xfrLabel(string& val, bool compress=false);
@@ -76,6 +77,7 @@ public:
   void xfr16BitInt(const uint16_t& val);
   void xfr8BitInt(const uint8_t& val);
   void xfrIP(const uint32_t& val);
+  void xfrIP6(const std::string& val);
   void xfrTime(const uint32_t& val);
   void xfrBase32HexBlob(const string& val);