BIND 10 trac1130, updated. efea6557fd364ee42c84c08df28efa9797f1c9c8 [trac1130] Finish the basic function of NAPTR rrtype support

BIND 10 source code commits bind10-changes at lists.isc.org
Fri Aug 5 06:46:44 UTC 2011


The branch, trac1130 has been updated
       via  efea6557fd364ee42c84c08df28efa9797f1c9c8 (commit)
      from  f17363ea38564867df555b6be9138d2eff28daa0 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit efea6557fd364ee42c84c08df28efa9797f1c9c8
Author: Ocean Wang <wanghaidong at cnnic.cn>
Date:   Fri Aug 5 14:45:41 2011 +0800

    [trac1130] Finish the basic function of NAPTR rrtype support

-----------------------------------------------------------------------

Summary of changes:
 src/lib/dns/rdata/in_1/naptr_35.cc           |  163 ++++++++++++++++++++++----
 src/lib/dns/rdata/in_1/naptr_35.h            |   21 +++-
 src/lib/dns/tests/rdata_in_naptr_unittest.cc |   74 +++++++++++-
 3 files changed, 231 insertions(+), 27 deletions(-)

-----------------------------------------------------------------------
diff --git a/src/lib/dns/rdata/in_1/naptr_35.cc b/src/lib/dns/rdata/in_1/naptr_35.cc
index 5fd5ae8..72a191e 100644
--- a/src/lib/dns/rdata/in_1/naptr_35.cc
+++ b/src/lib/dns/rdata/in_1/naptr_35.cc
@@ -20,7 +20,6 @@
 
 #include <exceptions/exceptions.h>
 
-#include <util/buffer.h>
 #include <dns/name.h>
 #include <dns/messagerenderer.h>
 #include <dns/rdata.h>
@@ -36,6 +35,13 @@ using namespace isc::util;
 NAPTR::NAPTR(InputBuffer& buffer, size_t len):
     replacement_(".")
 {
+    order_ = buffer.readUint16();
+    preference_ = buffer.readUint16();
+
+    flags_ = getNextCharacterString(buffer, len);
+    services_ = getNextCharacterString(buffer, len);
+    regexp_ = getNextCharacterString(buffer, len);
+    replacement_ = Name(buffer);
 }
 
 NAPTR::NAPTR(const std::string& naptr_str):
@@ -56,76 +62,162 @@ NAPTR::NAPTR(const std::string& naptr_str):
 
     string::const_iterator input_iterator = naptr_str.begin() + iss.tellg();
     flags_ = getNextCharacterString(naptr_str, input_iterator);
+
+    services_ = getNextCharacterString(naptr_str, input_iterator);
+
+    regexp_ = getNextCharacterString(naptr_str, input_iterator);
+
+    skipLeftSpaces(naptr_str, input_iterator);
+
+    if (input_iterator < naptr_str.end()) {
+        string replacementStr(input_iterator, naptr_str.end());
+
+        replacement_ = Name(replacementStr);
+    } else {
+        isc_throw(InvalidRdataText, "Invalid NAPTR text format");
+    }
 }
 
 NAPTR::NAPTR(const NAPTR& naptr):
-    replacement_(".")
+    Rdata(), order_(naptr.order_), preference_(naptr.preference_),
+    flags_(naptr.flags_), services_(naptr.services_), regexp_(naptr.regexp_),
+    replacement_(naptr.replacement_)
 {
 }
 
 void
 NAPTR::toWire(OutputBuffer& buffer) const {
+    buffer.writeUint16(order_);
+    buffer.writeUint16(preference_);
+
+    buffer.writeUint8(flags_.size());
+    buffer.writeData(flags_.c_str(), flags_.size());
+
+    buffer.writeUint8(services_.size());
+    buffer.writeData(services_.c_str(), services_.size());
+
+    buffer.writeUint8(regexp_.size());
+    buffer.writeData(regexp_.c_str(), regexp_.size());
+
+    replacement_.toWire(buffer);
 }
 
 void
 NAPTR::toWire(AbstractMessageRenderer& renderer) const {
+    renderer.writeUint16(order_);
+    renderer.writeUint16(preference_);
+
+    renderer.writeUint8(flags_.size());
+    renderer.writeData(flags_.c_str(), flags_.size());
+
+    renderer.writeUint8(services_.size());
+    renderer.writeData(services_.c_str(), services_.size());
+
+    renderer.writeUint8(regexp_.size());
+    renderer.writeData(regexp_.c_str(), regexp_.size());
+
+    replacement_.toWire(renderer);
 }
 
 string
 NAPTR::toText() const {
-    return "";
+    string result;
+    result += lexical_cast<string>(order_);
+    result += " ";
+    result += lexical_cast<string>(preference_);
+    result += " \"";
+    result += flags_;
+    result += "\" \"";
+    result += services_;
+    result += "\" \"";
+    result += regexp_;
+    result += "\" ";
+    result += replacement_.toText();
+    return (result);
 }
 
 int
 NAPTR::compare(const Rdata& other) const {
-    return 0;
+    const NAPTR other_naptr = dynamic_cast<const NAPTR&>(other);
+
+    if (order_ < other_naptr.order_) {
+        return (-1);
+    } else if (order_ > other_naptr.order_) {
+        return (1);
+    }
+
+    if (preference_ < other_naptr.preference_) {
+        return (-1);
+    } else if (preference_ > other_naptr.preference_) {
+        return (1);
+    }
+
+    if (flags_ < other_naptr.flags_) {
+        return (-1);
+    } else if (flags_ > other_naptr.flags_) {
+        return (1);
+    }
+
+    if (services_ < other_naptr.services_) {
+        return (-1);
+    } else if (services_ > other_naptr.services_) {
+        return (1);
+    }
+
+    if (regexp_ < other_naptr.regexp_) {
+        return (-1);
+    } else if (regexp_ > other_naptr.regexp_) {
+        return (1);
+    }
+
+    return (compareNames(replacement_, other_naptr.replacement_));
 }
 
 uint16_t
 NAPTR::getOrder() const {
-    return order_;
+    return (order_);
 }
 
 uint16_t
 NAPTR::getPreference() const {
-    return preference_;
+    return (preference_);
 }
 
 const std::string&
 NAPTR::getFlags() const {
-    return flags_;
+    return (flags_);
 }
 
 const std::string&
 NAPTR::getServices() const {
-    return services_;
+    return (services_);
 }
 
 const std::string&
 NAPTR::getRegexp() const {
-    return regexp_;
+    return (regexp_);
 }
 
 const Name&
 NAPTR::getReplacement() const {
-    return replacement_;
+    return (replacement_);
 }
 
 std::string
-NAPTR::getNextCharacterString(const std::string& input_str, std::string::const_iterator& input_iterator){
+NAPTR::getNextCharacterString(const std::string& input_str,
+                              std::string::const_iterator& input_iterator)
+{
     string result;
 
-    // Skip white spaces
-    while (input_iterator < input_str.end() && isspace(*input_iterator)) {
-        ++input_iterator;
-    }
+    skipLeftSpaces(input_str, input_iterator);
 
-    // If the input string only contains white-spaces, it is an invalid <character-string>
+    // If the input string only contains white-spaces, it is an invalid
+    // <character-string>
     if (input_iterator >= input_str.end()) {
         isc_throw(InvalidRdataText, "Invalid NAPTR text format");
     }
 
-    // Whether the <character-string> is seperated with doulble quotes symbol (")
+    // Whether the <character-string> is seperated with doulble quotes symbol(")
     bool quotes_seperated = (*input_iterator == '"');
 
     if (quotes_seperated) {
@@ -134,14 +226,17 @@ NAPTR::getNextCharacterString(const std::string& input_str, std::string::const_i
 
     while(input_iterator < input_str.end()){
         if (quotes_seperated) {
-            // If the <character-string> is seperated with quotes symbol and another
-            // quotes symbol is encountered, it is the end of the <character-string>
+            // If the <character-string> is seperated with quotes symbol and
+            // another quotes symbol is encountered, it is the end of the
+            // <character-string>
             if (*input_iterator == '"') {
+                ++input_iterator;
                 break;
             }
         } else if (*input_iterator == ' ') {
-            // If the <character-string> is not seperated with quotes symbol, it is 
-            // seperated with <space> char
+            // If the <character-string> is not seperated with quotes symbol,
+            // it is seperated with <space> char
+            ++input_iterator;
             break;
         }
 
@@ -150,7 +245,31 @@ NAPTR::getNextCharacterString(const std::string& input_str, std::string::const_i
         ++input_iterator;
     }
 
-    return result;
+    return (result);
+}
+
+std::string
+NAPTR::getNextCharacterString(InputBuffer& buffer, size_t len) {
+    uint8_t str_len = buffer.readUint8();
+
+    size_t pos = buffer.getPosition();
+    if (len - pos < str_len) {
+        isc_throw(InvalidRdataLength, "Invalid NAPTR string length");
+    }
+
+    uint8_t buf[MAX_CHARSTRING_LEN];
+    buffer.readData(buf, str_len);
+    return (string(buf, buf + str_len));
+}
+
+void
+NAPTR::skipLeftSpaces(const std::string& input_str,
+                    std::string::const_iterator& input_iterator)
+{
+    // Skip white spaces
+    while (input_iterator < input_str.end() && isspace(*input_iterator)) {
+        ++input_iterator;
+    }
 }
 
 // END_RDATA_NAMESPACE
diff --git a/src/lib/dns/rdata/in_1/naptr_35.h b/src/lib/dns/rdata/in_1/naptr_35.h
index 2921771..fa93c14 100644
--- a/src/lib/dns/rdata/in_1/naptr_35.h
+++ b/src/lib/dns/rdata/in_1/naptr_35.h
@@ -18,6 +18,7 @@
 
 #include <dns/name.h>
 #include <dns/rdata.h>
+#include <util/buffer.h>
 
 // BEGIN_ISC_NAMESPACE
 
@@ -39,13 +40,27 @@ public:
     const std::string& getRegexp() const;
     const Name& getReplacement() const;
 private:
-    /// Extract a <character-string> from a string
+    /// Get a <character-string> from a string
     ///
     /// \param input_str The input string
-    /// \param input_iterator The iterator from which to start extracting
-    /// \return a std::string that contains the extracted <character-string>
+    /// \param input_iterator The iterator from which to start extracting, the iterator will be updated
+    ///        to new position after the function is returned
+    /// \return A std::string that contains the extracted <character-string>
     std::string getNextCharacterString(const std::string& input_str, std::string::const_iterator& input_iterator);
 
+    /// Get a <character-string> from a input buffer
+    ///
+    /// \param buffer The input buffer
+    /// \param len The input buffer total length
+    /// \return A std::string that contains the extracted <character-string>
+    std::string getNextCharacterString(util::InputBuffer& buffer, size_t len);
+
+    /// Skip the left whitespaces of the input string
+    ///
+    /// \param input_str The input string
+    /// \param input_iterator From which the skipping started
+    void skipLeftSpaces(const std::string& input_str, std::string::const_iterator& input_iterator);
+
     uint16_t order_;
     uint16_t preference_;
     std::string flags_;
diff --git a/src/lib/dns/tests/rdata_in_naptr_unittest.cc b/src/lib/dns/tests/rdata_in_naptr_unittest.cc
index f687182..aae80eb 100644
--- a/src/lib/dns/tests/rdata_in_naptr_unittest.cc
+++ b/src/lib/dns/tests/rdata_in_naptr_unittest.cc
@@ -37,19 +37,89 @@ class Rdata_IN_NAPTR_Test : public RdataTest {
 };
 
 // 10 100 "S" "SIP+D2U" "" _sip._udp.example.com.
-static uint8_t naptr_rdata[] = {0x00,0x0a,0x00,0x64,0x01,0x53,0x07,0x53,0x49,0x50,0x2b,0x44,0x32,0x55,0x00,0x04,0x5f,0x73,0x69,0x70,
-    0x04,0x5f,0x75,0x64,0x70,0x07,0x65,0x78,0x61,0x6d,0x70,0x6c,0x65,0x03,0x63,0x6f,0x6d,0x00};
+static uint8_t naptr_rdata[] = {0x00,0x0a,0x00,0x64,0x01,0x53,0x07,0x53,0x49,
+    0x50,0x2b,0x44,0x32,0x55,0x00,0x04,0x5f,0x73,0x69,0x70,0x04,0x5f,0x75,0x64,
+    0x70,0x07,0x65,0x78,0x61,0x6d,0x70,0x6c,0x65,0x03,0x63,0x6f,0x6d,0x00};
 
 static const char *naptr_str = "10 100 \"S\" \"SIP+D2U\" \"\" _sip._udp.example.com.";
+static const char *naptr_str_small1 = "9 100 \"S\" \"SIP+D2U\" \"\" _sip._udp.example.com.";
+static const char *naptr_str_small2 = "10 90 \"S\" \"SIP+D2U\" \"\" _sip._udp.example.com.";
+static const char *naptr_str_small3 = "10 100 \"R\" \"SIP+D2U\" \"\" _sip._udp.example.com.";
+static const char *naptr_str_small4 = "10 100 \"S\" \"SIP+C2U\" \"\" _sip._udp.example.com.";
+static const char *naptr_str_small5 = "10 100 \"S\" \"SIP+D2U\" \"\" _rip._udp.example.com.";
+
+static const char *naptr_str_large1 = "11 100 \"S\" \"SIP+D2U\" \"\" _sip._udp.example.com.";
+static const char *naptr_str_large2 = "10 110 \"S\" \"SIP+D2U\" \"\" _sip._udp.example.com.";
+static const char *naptr_str_large3 = "10 100 \"T\" \"SIP+D2U\" \"\" _sip._udp.example.com.";
+static const char *naptr_str_large4 = "10 100 \"S\" \"SIP+E2U\" \"\" _sip._udp.example.com.";
+static const char *naptr_str_large5 = "10 100 \"S\" \"SIP+D2U\" \"\" _tip._udp.example.com.";
 
 TEST_F(Rdata_IN_NAPTR_Test, createFromText) {
     NAPTR naptr(naptr_str);
     EXPECT_EQ(10, naptr.getOrder());
     EXPECT_EQ(100, naptr.getPreference());
     EXPECT_EQ(string("S"), naptr.getFlags());
+    EXPECT_EQ(string("SIP+D2U"), naptr.getServices());
+    EXPECT_EQ(string(""), naptr.getRegexp());
+    EXPECT_EQ(Name("_sip._udp.example.com."), naptr.getReplacement());
 }
 
 TEST_F(Rdata_IN_NAPTR_Test, createFromWire) {
+    InputBuffer input_buffer(naptr_rdata, sizeof(naptr_rdata));
+    NAPTR naptr(input_buffer, sizeof(naptr_rdata));
+    EXPECT_EQ(10, naptr.getOrder());
+    EXPECT_EQ(100, naptr.getPreference());
+    EXPECT_EQ(string("S"), naptr.getFlags());
+    EXPECT_EQ(string("SIP+D2U"), naptr.getServices());
+    EXPECT_EQ(string(""), naptr.getRegexp());
+    EXPECT_EQ(Name("_sip._udp.example.com."), naptr.getReplacement());
+}
+
+TEST_F(Rdata_IN_NAPTR_Test, toWire) {
+    NAPTR naptr(naptr_str);
+    naptr.toWire(obuffer);
+
+    EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData, obuffer.getData(),
+                        obuffer.getLength(), naptr_rdata, sizeof(naptr_rdata));
+}
+
+TEST_F(Rdata_IN_NAPTR_Test, toWireRenderer) {
+    NAPTR naptr(naptr_str);
+
+    naptr.toWire(renderer);
+    EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData, obuffer.getData(),
+                        obuffer.getLength(), naptr_rdata, sizeof(naptr_rdata));
+}
+
+TEST_F(Rdata_IN_NAPTR_Test, toText) {
+    NAPTR naptr(naptr_str);
+    EXPECT_EQ(naptr_str, naptr.toText());
+}
+
+TEST_F(Rdata_IN_NAPTR_Test, compare) {
+    NAPTR naptr(naptr_str);
+    NAPTR naptr_small1(naptr_str_small1);
+    NAPTR naptr_small2(naptr_str_small2);
+    NAPTR naptr_small3(naptr_str_small3);
+    NAPTR naptr_small4(naptr_str_small4);
+    NAPTR naptr_small5(naptr_str_small5);
+    NAPTR naptr_large1(naptr_str_large1);
+    NAPTR naptr_large2(naptr_str_large2);
+    NAPTR naptr_large3(naptr_str_large3);
+    NAPTR naptr_large4(naptr_str_large4);
+    NAPTR naptr_large5(naptr_str_large5);
+
+    EXPECT_EQ(0, naptr.compare(NAPTR(naptr_str)));
+    EXPECT_EQ(1, naptr.compare(NAPTR(naptr_str_small1)));
+    EXPECT_EQ(1, naptr.compare(NAPTR(naptr_str_small2)));
+    EXPECT_EQ(1, naptr.compare(NAPTR(naptr_str_small3)));
+    EXPECT_EQ(1, naptr.compare(NAPTR(naptr_str_small4)));
+    EXPECT_EQ(1, naptr.compare(NAPTR(naptr_str_small5)));
+    EXPECT_EQ(-1, naptr.compare(NAPTR(naptr_str_large1)));
+    EXPECT_EQ(-1, naptr.compare(NAPTR(naptr_str_large2)));
+    EXPECT_EQ(-1, naptr.compare(NAPTR(naptr_str_large3)));
+    EXPECT_EQ(-1, naptr.compare(NAPTR(naptr_str_large4)));
+    EXPECT_EQ(-1, naptr.compare(NAPTR(naptr_str_large5)));
 }
 
 }




More information about the bind10-changes mailing list