[svn] commit: r732 - in /branches/jinmei-dnsrdata/src/lib/dns/cpp: ./ rdata/ testdata/

BIND 10 source code commits bind10-changes at lists.isc.org
Fri Feb 5 05:18:25 UTC 2010


Author: jinmei
Date: Fri Feb  5 05:18:24 2010
New Revision: 732

Log:
merged back from parkinglot for local modifications

Added:
    branches/jinmei-dnsrdata/src/lib/dns/cpp/base64.cc
      - copied unchanged from r731, branches/parkinglot/src/lib/dns/cpp/base64.cc
    branches/jinmei-dnsrdata/src/lib/dns/cpp/base64.h
      - copied unchanged from r731, branches/parkinglot/src/lib/dns/cpp/base64.h
    branches/jinmei-dnsrdata/src/lib/dns/cpp/base64_unittest.cc
      - copied unchanged from r731, branches/parkinglot/src/lib/dns/cpp/base64_unittest.cc
    branches/jinmei-dnsrdata/src/lib/dns/cpp/gen-rdatacode.py.in
      - copied unchanged from r731, branches/parkinglot/src/lib/dns/cpp/gen-rdatacode.py.in
    branches/jinmei-dnsrdata/src/lib/dns/cpp/rdata/
      - copied from r731, branches/parkinglot/src/lib/dns/cpp/rdata/
    branches/jinmei-dnsrdata/src/lib/dns/cpp/rrclass-placeholder.h
      - copied unchanged from r731, branches/parkinglot/src/lib/dns/cpp/rrclass-placeholder.h
    branches/jinmei-dnsrdata/src/lib/dns/cpp/rrparamregistry-placeholder.cc
      - copied unchanged from r731, branches/parkinglot/src/lib/dns/cpp/rrparamregistry-placeholder.cc
    branches/jinmei-dnsrdata/src/lib/dns/cpp/rrtype-placeholder.h
      - copied unchanged from r731, branches/parkinglot/src/lib/dns/cpp/rrtype-placeholder.h
    branches/jinmei-dnsrdata/src/lib/dns/cpp/testdata/rdata_cname_fromWire
      - copied unchanged from r731, branches/parkinglot/src/lib/dns/cpp/testdata/rdata_cname_fromWire
Removed:
    branches/jinmei-dnsrdata/src/lib/dns/cpp/rrclass.h
    branches/jinmei-dnsrdata/src/lib/dns/cpp/rrparamregistry.cc
    branches/jinmei-dnsrdata/src/lib/dns/cpp/rrtype.h
Modified:
    branches/jinmei-dnsrdata/src/lib/dns/cpp/   (props changed)
    branches/jinmei-dnsrdata/src/lib/dns/cpp/Makefile.am
    branches/jinmei-dnsrdata/src/lib/dns/cpp/buffer_unittest.cc
    branches/jinmei-dnsrdata/src/lib/dns/cpp/message_unittest.cc
    branches/jinmei-dnsrdata/src/lib/dns/cpp/messagerenderer.cc
    branches/jinmei-dnsrdata/src/lib/dns/cpp/messagerenderer.h
    branches/jinmei-dnsrdata/src/lib/dns/cpp/messagerenderer_unittest.cc
    branches/jinmei-dnsrdata/src/lib/dns/cpp/rdata.cc
    branches/jinmei-dnsrdata/src/lib/dns/cpp/rdata.h
    branches/jinmei-dnsrdata/src/lib/dns/cpp/rdata_unittest.cc
    branches/jinmei-dnsrdata/src/lib/dns/cpp/rrparamregistry.h
    branches/jinmei-dnsrdata/src/lib/dns/cpp/rrparamregistry_unittest.cc
    branches/jinmei-dnsrdata/src/lib/dns/cpp/rrset_unittest.cc
    branches/jinmei-dnsrdata/src/lib/dns/cpp/rrttl.cc
    branches/jinmei-dnsrdata/src/lib/dns/cpp/rrttl.h

Modified: branches/jinmei-dnsrdata/src/lib/dns/cpp/Makefile.am
==============================================================================
--- branches/jinmei-dnsrdata/src/lib/dns/cpp/Makefile.am (original)
+++ branches/jinmei-dnsrdata/src/lib/dns/cpp/Makefile.am Fri Feb  5 05:18:24 2010
@@ -1,15 +1,29 @@
 AM_CPPFLAGS = $(BOOST_INCLUDES)
+AM_CPPFLAGS += -I$(top_srcdir)/ext
 
 CLEANFILES = *.gcno *.gcda
+CLEANFILES += rrclass.h rrtype.h rrparamregistry.cc rdataclass.h rdataclass.cc
+
+# auto-generate by gen-rdatacode.py:
+BUILT_SOURCES = rrclass.h rrtype.h rrparamregistry.cc
 
 lib_LTLIBRARIES = libdns.la
 libdns_la_SOURCES = buffer.h name.cc name.h messagerenderer.h messagerenderer.cc
 libdns_la_SOURCES += rrparamregistry.h rrparamregistry.cc
 libdns_la_SOURCES += rrclass.h rrclass.cc rrtype.h rrtype.cc rrttl.h rrttl.cc
-libdns_la_SOURCES += rdata.h rdata.cc rrset.h rrset.cc
+libdns_la_SOURCES += rdata.h rdata.cc
+libdns_la_SOURCES += rdataclass.h rdataclass.cc
+libdns_la_SOURCES += rrset.h rrset.cc
 libdns_la_SOURCES += question.h question.cc
 libdns_la_SOURCES += message.h message.cc
+libdns_la_SOURCES += base64.h base64.cc
 libdns_la_SOURCES += exceptions.h exceptions.cc
+
+rrclass.h: rrclass-placeholder.h
+rrtype.h: rrtype-placeholder.h
+rrparamregistry.cc: rrparamregistry-placeholder.cc
+rrclass.h rrtype.h rrparamregistry.cc rdataclass.h rdataclass.cc: Makefile
+	./gen-rdatacode.py
 
 TESTS =
 if HAVE_GTEST
@@ -24,6 +38,7 @@
 run_unittests_SOURCES += question_unittest.cc
 run_unittests_SOURCES += rrparamregistry_unittest.cc
 run_unittests_SOURCES += message_unittest.cc
+run_unittests_SOURCES += base64_unittest.cc
 run_unittests_SOURCES += run_unittests.cc
 run_unittests_CPPFLAGS = $(GTEST_INCLUDES)
 run_unittests_LDFLAGS = $(GTEST_LDFLAGS)

Modified: branches/jinmei-dnsrdata/src/lib/dns/cpp/buffer_unittest.cc
==============================================================================
--- branches/jinmei-dnsrdata/src/lib/dns/cpp/buffer_unittest.cc (original)
+++ branches/jinmei-dnsrdata/src/lib/dns/cpp/buffer_unittest.cc Fri Feb  5 05:18:24 2010
@@ -30,6 +30,7 @@
     {
         data16 = (2 << 8) | 3;
         data32 = (4 << 24) | (5 << 16) | (6 << 8) | 7;
+        memset(vdata, 0, sizeof(testdata));
     }
 
     InputBuffer ibuffer;

Modified: branches/jinmei-dnsrdata/src/lib/dns/cpp/message_unittest.cc
==============================================================================
--- branches/jinmei-dnsrdata/src/lib/dns/cpp/message_unittest.cc (original)
+++ branches/jinmei-dnsrdata/src/lib/dns/cpp/message_unittest.cc Fri Feb  5 05:18:24 2010
@@ -18,6 +18,7 @@
 #include "message.h"
 #include "messagerenderer.h"
 #include "question.h"
+#include "rdataclass.h"
 #include "rrclass.h"
 #include "rrttl.h"
 #include "rrtype.h"

Modified: branches/jinmei-dnsrdata/src/lib/dns/cpp/messagerenderer.cc
==============================================================================
--- branches/jinmei-dnsrdata/src/lib/dns/cpp/messagerenderer.cc (original)
+++ branches/jinmei-dnsrdata/src/lib/dns/cpp/messagerenderer.cc Fri Feb  5 05:18:24 2010
@@ -163,6 +163,14 @@
 }
 
 void
+MessageRenderer::clear()
+{
+    impl_->buffer_.clear();
+    impl_->nbuffer_.clear();
+    impl_->nodeset_.clear();
+}
+
+void
 MessageRenderer::writeUint8(uint8_t data)
 {
     impl_->buffer_.writeUint8(data);
@@ -211,7 +219,8 @@
     name.toWire(impl_->nbuffer_);
 
     unsigned int i;
-    std::set<NameCompressNode>::const_iterator n;
+    std::set<NameCompressNode>::const_iterator notfound = impl_->nodeset_.end();
+    std::set<NameCompressNode>::const_iterator n = notfound;
 
     // Find the longest ancestor name in the rendered set that matches the
     // given name.
@@ -223,7 +232,7 @@
         n = impl_->nodeset_.find(NameCompressNode(impl_->nbuffer_, i,
                                                   impl_->nbuffer_.getLength() -
                                                   i));
-        if (n != impl_->nodeset_.end()) {
+        if (n != notfound) {
             break;
         }
     }
@@ -233,7 +242,7 @@
     // Write uncompress part...
     impl_->buffer_.writeData(impl_->nbuffer_.getData(),
                              compress ? i : impl_->nbuffer_.getLength());
-    if (compress && n != impl_->nodeset_.end()) {
+    if (compress && n != notfound) {
         // ...and compression pointer if available.
         uint16_t pointer = (*n).pos_;
         pointer |= Name::COMPRESS_POINTER_MARK16;

Modified: branches/jinmei-dnsrdata/src/lib/dns/cpp/messagerenderer.h
==============================================================================
--- branches/jinmei-dnsrdata/src/lib/dns/cpp/messagerenderer.h (original)
+++ branches/jinmei-dnsrdata/src/lib/dns/cpp/messagerenderer.h Fri Feb  5 05:18:24 2010
@@ -113,6 +113,11 @@
     ///
     /// \param len The length of the gap to be inserted in bytes.
     void skip(size_t len);
+    /// \brief Clear the internal buffer and other internal resources.
+    ///
+    /// This method can be used to re-initialize and reuse the renderer
+    /// without constructing a new one.
+    void clear();
     /// \brief Write an unsigned 8-bit integer into the internal buffer.
     ///
     /// \param data The 8-bit integer to be written into the internal buffer.

Modified: branches/jinmei-dnsrdata/src/lib/dns/cpp/messagerenderer_unittest.cc
==============================================================================
--- branches/jinmei-dnsrdata/src/lib/dns/cpp/messagerenderer_unittest.cc (original)
+++ branches/jinmei-dnsrdata/src/lib/dns/cpp/messagerenderer_unittest.cc Fri Feb  5 05:18:24 2010
@@ -113,4 +113,24 @@
     EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData, buffer.getData(),
                         buffer.getLength(), &data[0], data.size());
 }
+
+TEST_F(MessageRendererTest, writeRootName)
+{
+    // root name is special: it never causes compression or can (reasonably)
+    // be a compression pointer.  So it makes sense to check this case
+    // explicitly.
+    Name example_name = Name("www.example.com");
+
+    OutputBuffer expected(0);
+    expected.writeUint8(0);     // root name
+    example_name.toWire(expected);
+
+    renderer.writeName(Name("."));
+    renderer.writeName(example_name);
+    EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData,
+                        static_cast<const uint8_t*>(buffer.getData()),
+                        buffer.getLength(),
+                        static_cast<const uint8_t*>(expected.getData()),
+                        expected.getLength());
 }
+}

Modified: branches/jinmei-dnsrdata/src/lib/dns/cpp/rdata.cc
==============================================================================
--- branches/jinmei-dnsrdata/src/lib/dns/cpp/rdata.cc (original)
+++ branches/jinmei-dnsrdata/src/lib/dns/cpp/rdata.cc Fri Feb  5 05:18:24 2010
@@ -143,440 +143,12 @@
     }
 }
 
-NS::NS(InputBuffer& buffer, size_t rdata_len) :
-    nsname_(buffer)
-{
-    // we don't need rdata_len for parsing.  if necessary, the caller will
-    // check consistency.
-}
-
-NS::NS(const NS& other) :
-    nsname_(other.nsname_)
-{}
-
-void
-NS::toWire(OutputBuffer& buffer) const
-{
-    nsname_.toWire(buffer);
-}
-
-void
-NS::toWire(MessageRenderer& renderer) const
-{
-    renderer.writeName(nsname_);
-}
-
-string
-NS::toText() const
-{
-    return (nsname_.toText());
-}
-
-int
-NS::compare(const Rdata& other) const
-{
-    const NS& other_ns = dynamic_cast<const NS&>(other);
-
-    return (compareNames(nsname_, other_ns.nsname_));
-}
-
-SOA::SOA(InputBuffer& buffer, size_t rdata_len) :
-    mname_(buffer), rname_(buffer)
-{
-    // we don't need rdata_len for parsing.  if necessary, the caller will
-    // check consistency.
-    buffer.readData(numdata_, sizeof(numdata_));
-}
-
-SOA::SOA(const std::string& soastr) :
-    mname_("."), rname_(".")
-{
-    dns_throw(InvalidRdataText, "Not implemented yet");
-}
-
-SOA::SOA(const Name& mname, const Name& rname, uint32_t serial,
-         uint32_t refresh, uint32_t retry, uint32_t expire, uint32_t minimum) :
-    mname_(mname), rname_(rname)
-{
-    OutputBuffer b(20);
-    b.writeUint32(serial);
-    b.writeUint32(refresh);
-    b.writeUint32(retry);
-    b.writeUint32(expire);
-    b.writeUint32(minimum);
-    assert(b.getLength() == sizeof(numdata_));
-    memcpy(numdata_, b.getData(), sizeof(numdata_));
-}
-
-SOA::SOA(const SOA& other) :
-    mname_(other.mname_), rname_(other.rname_)
-{
-    memcpy(numdata_, other.numdata_, sizeof(numdata_));
-}
-
-void
-SOA::toWire(OutputBuffer& buffer) const
-{
-    mname_.toWire(buffer);
-    rname_.toWire(buffer);
-    buffer.writeData(numdata_, sizeof(numdata_));
-}
-
-void
-SOA::toWire(MessageRenderer& renderer) const
-{
-    renderer.writeName(mname_);
-    renderer.writeName(rname_);
-    renderer.writeData(numdata_, sizeof(numdata_));
-}
-
-string
-SOA::toText() const
-{
-    InputBuffer b(numdata_, sizeof(numdata_));
-    uint32_t serial = b.readUint32();
-    uint32_t refresh = b.readUint32();
-    uint32_t retry = b.readUint32();
-    uint32_t expire = b.readUint32();
-    uint32_t minimum = b.readUint32();
-
-    return (mname_.toText() + " " + rname_.toText() + " " +
-            lexical_cast<string>(serial) + " " +
-            lexical_cast<string>(refresh) + " " +
-            lexical_cast<string>(retry) + " " +
-            lexical_cast<string>(expire) + " " +
-            lexical_cast<string>(minimum));
-}
-
-int
-SOA::compare(const Rdata& other) const
-{
-    const SOA& other_soa = dynamic_cast<const SOA&>(other);
-
-    int order = compareNames(mname_, other_soa.mname_);
-    if (order != 0) {
-        return (order);
-    }
-
-    order = compareNames(rname_, other_soa.rname_);
-    if (order != 0) {
-        return (order);
-    }
-
-    return (memcmp(numdata_, other_soa.numdata_, sizeof(numdata_)));
-}
-
-MX::MX(InputBuffer& buffer, size_t rdata_len) :
-    preference_(buffer.readUint16()), mxname_(buffer)
-{
-    // we don't need rdata_len for parsing.  if necessary, the caller will
-    // check consistency.
-}
-
-MX::MX(const std::string& mxstr) :
-    preference_(0), mxname_(".")
-{
-    dns_throw(InvalidRdataText, "Not implemented yet");
-}
-
-MX::MX(uint16_t preference, const Name& mxname) :
-    preference_(preference), mxname_(mxname)
-{}
-
-MX::MX(const MX& other) :
-    preference_(other.preference_), mxname_(other.mxname_)
-{}
-
-void
-MX::toWire(OutputBuffer& buffer) const
-{
-    buffer.writeUint16(preference_);
-    mxname_.toWire(buffer);
-}
-
-void
-MX::toWire(MessageRenderer& renderer) const
-{
-    renderer.writeUint16(preference_);
-    renderer.writeName(mxname_);
-}
-
-string
-MX::toText() const
-{
-    return (lexical_cast<string>(preference_) + " " + mxname_.toText());
-}
-
-int
-MX::compare(const Rdata& other) const
-{
-    const MX& other_mx = dynamic_cast<const MX&>(other);
-
-    if (preference_ < other_mx.preference_) {
-        return (-1);
-    } else if (preference_ > other_mx.preference_) {
-        return (1);
-    }
-
-    return (compareNames(mxname_, other_mx.mxname_));
-}
-
-TXT::TXT(InputBuffer& buffer, size_t rdata_len)
-{
-    uint8_t len;
-
-    // TBD: this is a simple, incomplete implementation that only supports
-    // a single character-string.
-    len = buffer.readUint8();
-    vector<uint8_t> data(len + 1);
-    data[0] = len;
-    buffer.readData(&data[0] + 1, len);
-    string_list_.push_back(data);
-}
-
-TXT::TXT(const std::string& txtstr)
-{
-    size_t length = txtstr.size();
-    size_t pos_begin = 0;
-
-    if (length > 1 && txtstr[0] == '"' && txtstr[length - 1] == '"') {
-        pos_begin = 1;
-        length -= 2;
-    }
-    if (length > MAX_CHARSTRING_LEN) {
-        dns_throw(CharStringTooLong, "");
-    }
-
-    vector<uint8_t> data;
-    data.reserve(length + 1);
-    data.push_back(length);
-    data.insert(data.end(), txtstr.begin() + pos_begin,
-                txtstr.begin() + pos_begin + length);
-    string_list_.push_back(data);
-}
-
-TXT::TXT(const TXT& other) :
-    string_list_(other.string_list_)
-{}
-
-void
-TXT::toWire(OutputBuffer& buffer) const
-{
-    for (vector<vector<uint8_t> >::const_iterator it = string_list_.begin();
-         it != string_list_.end();
-         ++it)
-    {
-        buffer.writeData(&(*it)[0], (*it).size());
-    }
-}
-
-void
-TXT::toWire(MessageRenderer& renderer) const
-{
-    for (vector<vector<uint8_t> >::const_iterator it = string_list_.begin();
-         it != string_list_.end();
-         ++it)
-    {
-        renderer.writeData(&(*it)[0], (*it).size());
-    }
-}
-
-string
-TXT::toText() const
-{
-    string s;
-
-    // XXX: this implementation is not entirely correct.  for example, it
-    // should escape double-quotes if they appear in the character string.
-    for (vector<vector<uint8_t> >::const_iterator it = string_list_.begin();
-         it != string_list_.end();
-         ++it)
-    {
-        if (!s.empty()) {
-            s.push_back(' ');
-        }
-        s.push_back('"');
-        s.insert(s.end(), (*it).begin() + 1, (*it).end());
-        s.push_back('"');
-    }
-
-    return (s);
-}
-
-int
-TXT::compare(const Rdata& other) const
-{
-    const TXT& other_txt = dynamic_cast<const TXT&>(other);
-
-    // This implementation is not efficient.  Revisit this (TBD).
-    OutputBuffer this_buffer(0);
-    toWire(this_buffer);
-    size_t this_len = this_buffer.getLength();
-
-    OutputBuffer other_buffer(0);
-    other_txt.toWire(other_buffer);
-    size_t other_len = other_buffer.getLength();
-
-    size_t cmplen = min(this_len, other_len);
-    int cmp = memcmp(this_buffer.getData(), other_buffer.getData(), cmplen);
-    if (cmp != 0) {
-        return (cmp);
-    } else {
-        return ((this_len == other_len) ? 0 :
-                (this_len < other_len) ? -1 : 1);
-    }
-}
 } // end of namespace generic
 
 namespace in {
-A::A(const string& addrstr)
-{
-    // RFC1035 states textual representation of IN/A RDATA is
-    // "four decimal numbers separated by dots without any embedded spaces".
-    // This is exactly what inet_pton() accepts for AF_INET.  In particular,
-    // it rejects an abbreviated form such as "10.1" meaning "10.0.0.1".
-    if (inet_pton(AF_INET, addrstr.c_str(), &addr_) != 1) {
-        dns_throw(InvalidRdataText,
-                  "failed to parse IPv4 address for IN/A RDATA");
-    }
-}
-
-A::A(InputBuffer& buffer, size_t rdata_len)
-{
-    if (rdata_len != sizeof(addr_)) {
-        dns_throw(InvalidRdataLength, "Length mismatch for IN/A RDATA");
-    }
-    buffer.readData(&addr_, sizeof(addr_));
-}
-
-A::A(const A& other) :
-    addr_(other.addr_)
-{}
-
-void
-A::toWire(OutputBuffer& buffer) const
-{
-    buffer.writeData(&addr_, sizeof(addr_));
-}
-
-void
-A::toWire(MessageRenderer& renderer) const
-{
-    renderer.writeData(&addr_, sizeof(addr_));
-}
-
-string
-A::toText() const
-{
-    char addr_string[sizeof("255.255.255.255")];
-
-    if (inet_ntop(AF_INET, &addr_, addr_string, sizeof(addr_string)) == NULL) {
-        dns_throw(Unexpected, "inet_ntop failed for an IPv4 address");
-    }
-
-    return (string(addr_string));
-}
-
-int
-A::compare(const Rdata& other) const
-{
-    const A& other_a = dynamic_cast<const A&>(other);
-    return (memcmp(&addr_, &other_a.addr_, sizeof(addr_)));
-}
-
-AAAA::AAAA(const string& addrstr)
-{
-    if (inet_pton(AF_INET6, addrstr.c_str(), &addr_) != 1) {
-        dns_throw(InvalidRdataText,
-                  "failed to parse IPv6 address for IN/AAAA RDATA");
-    }
-}
-
-AAAA::AAAA(InputBuffer& buffer, size_t rdata_len)
-{
-    if (rdata_len != sizeof(addr_)) {
-        dns_throw(InvalidRdataLength, "Length mismatch for IN/AAAA RDATA");
-    }
-    buffer.readData(&addr_, sizeof(addr_));
-}
-
-AAAA::AAAA(const AAAA& other)
-{
-    memcpy(addr_, other.addr_, sizeof(addr_));
-}
-
-void
-AAAA::toWire(OutputBuffer& buffer) const
-{
-    buffer.writeData(&addr_, sizeof(addr_));
-}
-
-void
-AAAA::toWire(MessageRenderer& renderer) const
-{
-    renderer.writeData(&addr_, sizeof(addr_));
-}
-
-string
-AAAA::toText() const
-{
-    char addr_string[sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255")];
-
-    if (inet_ntop(AF_INET6, &addr_, addr_string, sizeof(addr_string)) == NULL) {
-        dns_throw(Unexpected, "inet_ntop failed for an IPv6 address");
-    }
-
-    return (string(addr_string));
-}
-
-int
-AAAA::compare(const Rdata& other) const
-{
-    const AAAA& other_a = dynamic_cast<const AAAA&>(other);
-    return (memcmp(&addr_, &other_a.addr_, sizeof(addr_)));
-}
 } // end of namespace in
 
 namespace ch {
-A::A(const string& addrstr)
-{
-    // TBD
-}
-
-A::A(InputBuffer& buffer, size_t rdata_len)
-{
-    // TBD
-}
-
-A::A(const A& source)
-{
-    // TBD
-}
-
-void
-A::toWire(OutputBuffer& buffer) const
-{
-    // TBD
-}
-
-void
-A::toWire(MessageRenderer& renderer) const
-{
-    // TBD
-}
-
-string
-A::toText() const
-{
-    // TBD
-    dns_throw(InvalidRdataText, "Not implemented yet");
-}
-
-int
-A::compare(const Rdata& other) const
-{
-    return (0);                 // dummy.  TBD
-}
 } // end of namespace ch
 } // end of namespace rdata
 }

Modified: branches/jinmei-dnsrdata/src/lib/dns/cpp/rdata.h
==============================================================================
--- branches/jinmei-dnsrdata/src/lib/dns/cpp/rdata.h (original)
+++ branches/jinmei-dnsrdata/src/lib/dns/cpp/rdata.h Fri Feb  5 05:18:24 2010
@@ -133,129 +133,7 @@
 private:
     std::vector<uint8_t> data_;
 };
-
-class NS : public Rdata {
-public:
-    explicit NS(const std::string& namestr) : nsname_(namestr) {}
-    explicit NS(const Name& nsname) : nsname_(nsname) {}
-    explicit NS(InputBuffer& buffer, size_t rdata_len);
-    NS(const NS& other);
-    virtual ~NS() {}
-    virtual std::string toText() const;
-    virtual void toWire(OutputBuffer& buffer) const;
-    virtual void toWire(MessageRenderer& buffer) const;
-    virtual int compare(const Rdata& other) const;
-private:
-    Name nsname_;
-};
-
-class SOA : public Rdata {
-public:
-    explicit SOA(const std::string& soastr);
-    explicit SOA(InputBuffer& buffer, size_t rdata_len);
-    explicit SOA(const Name& mname, const Name& rname, uint32_t serial,
-                 uint32_t refresh, uint32_t retry, uint32_t expire,
-                 uint32_t minimum);
-    SOA(const SOA& other);
-    virtual ~SOA() {}
-    virtual std::string toText() const;
-    virtual void toWire(OutputBuffer& buffer) const;
-    virtual void toWire(MessageRenderer& buffer) const;
-    virtual int compare(const Rdata& other) const;
-private:
-    /// Note: this is a prototype version; we may reconsider
-    /// this representation later.
-    Name mname_;
-    Name rname_;
-    /// serial, refresh, retry, expire, minimum, stored in network byte order
-    uint8_t numdata_[20];
-};
-
-class MX : public Rdata {
-public:
-    explicit MX(const std::string& mxstr);
-    explicit MX(InputBuffer& buffer, size_t rdata_len);
-    explicit MX(uint16_t preference, const Name& mxname);
-    MX(const MX& other);
-    virtual std::string toText() const;
-    virtual void toWire(OutputBuffer& buffer) const;
-    virtual void toWire(MessageRenderer& buffer) const;
-    virtual int compare(const Rdata& other) const;
-private:
-    /// Note: this is a prototype version; we may reconsider
-    /// this representation later.
-    uint16_t preference_;
-    Name mxname_;
-};
-
-class TXT : public Rdata {
-public:
-    explicit TXT(const std::string& txtstr);
-    explicit TXT(InputBuffer& buffer, size_t rdata_len);
-    TXT(const TXT& other);
-    virtual std::string toText() const;
-    virtual void toWire(OutputBuffer& buffer) const;
-    virtual void toWire(MessageRenderer& buffer) const;
-    virtual int compare(const Rdata& other) const;
-private:
-    /// Note: this is a prototype version; we may reconsider
-    /// this representation later.
-    static const unsigned int MAX_CHARSTRING_LEN = 255;
-    std::vector<std::vector<uint8_t> > string_list_;
-};
 } // end of namespace "generic"
-
-namespace in {
-class A : public Rdata {
-public:
-    /// \brief Constructor from a textual IPv4 address.
-    explicit A(const std::string& addrstr);
-    explicit A(InputBuffer& buffer, size_t rdata_len);
-    A(const A& ohter);
-    virtual std::string toText() const;
-    virtual void toWire(OutputBuffer& buffer) const;
-    virtual void toWire(MessageRenderer& renderer) const;
-    virtual int compare(const Rdata& other) const;
-    //We can use the default destructor.
-    //virtual ~A() {}
-    // notyet:
-    //const struct in_addr& getAddress() const { return (addr_); }
-private:
-    uint32_t addr_;             // raw IPv4 address (network byte order)
-};
-
-class AAAA : public Rdata {
-public:
-    /// \brief Constructor from a textual IPv6 address.
-    explicit AAAA(const std::string& addrstr);
-    explicit AAAA(InputBuffer& buffer, size_t rdata_len);
-    AAAA(const AAAA& ohter);
-    virtual std::string toText() const;
-    virtual void toWire(OutputBuffer& buffer) const;
-    virtual void toWire(MessageRenderer& renderer) const;
-    virtual int compare(const Rdata& other) const;
-    //We can use the default destructor.
-    //virtual ~AAAA() {}
-    // notyet:
-    //const struct in6_addr& getAddress() const { return (addr_); }
-private:
-    uint8_t addr_[16];        // raw IPv6 address (network byte order)
-};
-} // end of namespace "in"
-
-namespace ch {
-class A : public Rdata {
-public:
-    explicit A(const std::string& addrstr);
-    explicit A(InputBuffer& buffer, size_t rdata_len);
-    A(const A& ohter);
-    virtual std::string toText() const;
-    virtual void toWire(OutputBuffer& buffer) const;
-    virtual void toWire(MessageRenderer& renderer) const;
-    virtual int compare(const Rdata& other) const;
-private:
-};
-} // end of namespace "ch"
 
 ///
 /// Non class-member functions related to Rdata

Modified: branches/jinmei-dnsrdata/src/lib/dns/cpp/rdata_unittest.cc
==============================================================================
--- branches/jinmei-dnsrdata/src/lib/dns/cpp/rdata_unittest.cc (original)
+++ branches/jinmei-dnsrdata/src/lib/dns/cpp/rdata_unittest.cc Fri Feb  5 05:18:24 2010
@@ -19,6 +19,7 @@
 #include "buffer.h"
 #include "messagerenderer.h"
 #include "rdata.h"
+#include "rdataclass.h"
 #include "rrclass.h"
 #include "rrtype.h"
 
@@ -47,10 +48,12 @@
     static const uint8_t wiredata_in_aaaa[];
     static const uint8_t wiredata_ns[];
     static const uint8_t wiredata_ns2[];
+    static const uint8_t wiredata_cname[];
+    static const uint8_t wiredata_cname2[];
     static const uint8_t wiredata_txt[];
-    static const generic::NS rdata_ns;
-    static const generic::NS rdata_ns2;
+    static const generic::NS rdata_ns, rdata_ns2;
     static const generic::SOA rdata_soa;
+    static const generic::CNAME rdata_cname, rdata_cname2;
     static const generic::MX rdata_mx;
     static const generic::TXT rdata_txt;
     static const generic::TXT rdata_txt_quoated;
@@ -63,6 +66,8 @@
 const generic::SOA RdataTest::rdata_soa(Name("ns.example.com"),
                                         Name("root.example.com"),
                                         2010012601, 3600, 300, 3600000, 1200);
+const generic::CNAME RdataTest::rdata_cname("cn.example.com");
+const generic::CNAME RdataTest::rdata_cname2("cn2.example.com");
 const generic::MX RdataTest::rdata_mx(10, Name("mx.example.com"));
 const generic::TXT RdataTest::rdata_txt("Test String");
 const generic::TXT RdataTest::rdata_txt_quoated("\"Test String\"");
@@ -81,6 +86,16 @@
     // second name: ns2.example.com.  all labels except the first should be
     // compressed.
     0x03, 0x6e, 0x73, 0x32, 0xc0, 0x03 };
+const uint8_t RdataTest::wiredata_cname[] = {
+    0x02, 0x63, 0x6e, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x03,
+    0x63, 0x6f, 0x6d, 0x00 };
+const uint8_t RdataTest::wiredata_cname2[] = {
+    // first name: cn.example.com.
+    0x02, 0x63, 0x6e, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x03,
+    0x63, 0x6f, 0x6d, 0x00,
+    // second name: cn2.example.com.  all labels except the first should be
+    // compressed.
+    0x03, 0x63, 0x6e, 0x32, 0xc0, 0x03 };
 const uint8_t RdataTest::wiredata_txt[] = {
     sizeof("Test String") - 1,
     'T', 'e', 's', 't', ' ', 'S', 't', 'r', 'i', 'n', 'g'
@@ -243,6 +258,10 @@
     EXPECT_EQ(0, rdata_ns.compare(generic::NS("ns.example.com.")));
     // should be case sensitive.
     EXPECT_EQ(0, rdata_ns.compare(generic::NS("NS.EXAMPLE.COM")));
+    // RDATA of a class-independent type should be recognized for any
+    // "unknown" class.
+    EXPECT_EQ(0, rdata_ns.compare(*createRdata(RRType("NS"), RRClass(65000),
+                                               "ns.example.com")));
 }
 
 TEST_F(RdataTest, createFromWire_NS)
@@ -304,6 +323,11 @@
     EXPECT_GT(0, small.compare(large));
 }
 
+TEST_F(RdataTest, getNSName)
+{
+    EXPECT_EQ(Name("ns.example.com"), rdata_ns.getNSName());
+}
+
 TEST_F(RdataTest, createFromText_SOA)
 {
     //TBD
@@ -411,4 +435,96 @@
     EXPECT_EQ("\"Test String\"", rdata_txt.toText());
 }
 
-}
+TEST_F(RdataTest, createFromText_CNAME)
+{
+    EXPECT_EQ(0, rdata_cname.compare(generic::CNAME("cn.example.com")));
+    // explicitly add a trailing dot.  should be the same RDATA.
+    EXPECT_EQ(0, rdata_cname.compare(generic::CNAME("cn.example.com.")));
+    // should be case sensitive.
+    EXPECT_EQ(0, rdata_cname.compare(generic::CNAME("CN.EXAMPLE.COM")));
+    // RDATA of a class-independent type should be recognized for any
+    // "unknown" class.
+    EXPECT_EQ(0, rdata_cname.compare(*createRdata(RRType("CNAME"),
+                                                  RRClass(65000),
+                                                  "cn.example.com")));
+}
+
+TEST_F(RdataTest, createFromWire_CNAME)
+{
+    EXPECT_EQ(0, rdata_cname.compare(
+                  *rdataFactoryFromFile(RRType("CNAME"), RRClass("IN"),
+                                        "testdata/rdata_cname_fromWire")));
+    // RDLENGTH is too short
+    EXPECT_THROW(rdataFactoryFromFile(RRType("CNAME"), RRClass("IN"),
+                                      "testdata/rdata_cname_fromWire", 18),
+                 InvalidRdataLength);
+    // RDLENGTH is too long
+    EXPECT_THROW(rdataFactoryFromFile(RRType("CNAME"), RRClass("IN"),
+                                      "testdata/rdata_cname_fromWire", 36),
+                 InvalidRdataLength);
+    // incomplete name.  the error should be detected in the name constructor
+    EXPECT_THROW(rdataFactoryFromFile(RRType("CNAME"), RRClass("IN"),
+                                      "testdata/rdata_cname_fromWire", 71),
+                 IncompleteName);
+
+    EXPECT_EQ(0, generic::CNAME("cn2.example.com").compare(
+                  *rdataFactoryFromFile(RRType("CNAME"), RRClass("IN"),
+                                        "testdata/rdata_cname_fromWire", 55)));
+    EXPECT_THROW(*rdataFactoryFromFile(RRType("CNAME"), RRClass("IN"),
+                                       "testdata/rdata_cname_fromWire", 63),
+                 InvalidRdataLength);
+}
+
+TEST_F(RdataTest, toWireBuffer_CNAME)
+{
+    rdata_cname.toWire(obuffer);
+    EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData,
+                        obuffer.getData(), obuffer.getLength(),
+                        wiredata_cname, sizeof(wiredata_cname));
+}
+
+TEST_F(RdataTest, toWireRenderer_CNAME)
+{
+    rdata_cname.toWire(renderer);
+    EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData,
+                        obuffer.getData(), obuffer.getLength(),
+                        wiredata_cname, sizeof(wiredata_cname));
+    rdata_cname2.toWire(renderer);
+    EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData,
+                        obuffer.getData(), obuffer.getLength(),
+                        wiredata_cname2, sizeof(wiredata_cname2));
+}
+
+TEST_F(RdataTest, toText_CNAME)
+{
+    EXPECT_EQ("cn.example.com.", rdata_cname.toText());
+}
+
+TEST_F(RdataTest, getCname_CNAME)
+{
+    EXPECT_EQ(Name("cn.example.com."), rdata_cname.getCname());
+}
+
+TEST_F(RdataTest, fromText_RRSIG)
+{
+    string rrsig_txt("A 5 4 43200 1264801134 191145710 8496 isc.org. "
+                     "evxhlGx13mpKLVkKsjpGzycS5twtIoxOmlN14w9t5AgzGBmz"
+                     "diGdLIrFabqr72af2rUq+UDBKMWXujwZTZUTws32sVldDPk/"
+                     "NbuacJM25fQXfv5mO3Af7TOoow3AjMaVG9icjCW0V55WcWQU"
+                     "f49t+sXKPzbipN9g+s1ZPiIyofc=");
+    generic::RRSIG rdata_rrsig(rrsig_txt);
+    EXPECT_EQ(rrsig_txt, rdata_rrsig.toText());
+}
+
+TEST_F(RdataTest, toWireRenderer_RRSIG)
+{
+    string rrsig_txt("A 5 4 43200 1264801134 191145710 8496 isc.org. "
+                     "evxhlGx13mpKLVkKsjpGzycS5twtIoxOmlN14w9t5AgzGBmz"
+                     "diGdLIrFabqr72af2rUq+UDBKMWXujwZTZUTws32sVldDPk/"
+                     "NbuacJM25fQXfv5mO3Af7TOoow3AjMaVG9icjCW0V55WcWQU"
+                     "f49t+sXKPzbipN9g+s1ZPiIyofc=");
+    generic::RRSIG rdata_rrsig(rrsig_txt);
+    rdata_rrsig.toWire(renderer);
+}
+
+}

Modified: branches/jinmei-dnsrdata/src/lib/dns/cpp/rrparamregistry.h
==============================================================================
--- branches/jinmei-dnsrdata/src/lib/dns/cpp/rrparamregistry.h (original)
+++ branches/jinmei-dnsrdata/src/lib/dns/cpp/rrparamregistry.h Fri Feb  5 05:18:24 2010
@@ -179,6 +179,10 @@
              const std::string& class_string, uint16_t class_code,
              rdata::RdataFactoryPtr rdata_factory);
 
+    /// TBD
+    void add(const std::string& type_string, uint16_t type_code,
+             rdata::RdataFactoryPtr rdata_factory);
+
     /// \brief Add mappings between RR type code and textual representation.
     ///
     /// This method adds a mapping from the type code of an RR to its textual

Modified: branches/jinmei-dnsrdata/src/lib/dns/cpp/rrparamregistry_unittest.cc
==============================================================================
--- branches/jinmei-dnsrdata/src/lib/dns/cpp/rrparamregistry_unittest.cc (original)
+++ branches/jinmei-dnsrdata/src/lib/dns/cpp/rrparamregistry_unittest.cc Fri Feb  5 05:18:24 2010
@@ -31,7 +31,8 @@
 namespace {
 class RRParamRegistryTest : public ::testing::Test {
 protected:
-    virtual void SetUp() {
+    RRParamRegistryTest()
+    {
         ostringstream oss1;
         oss1 << test_class_code;
         test_class_unknown_str = "CLASS" + oss1.str();

Modified: branches/jinmei-dnsrdata/src/lib/dns/cpp/rrset_unittest.cc
==============================================================================
--- branches/jinmei-dnsrdata/src/lib/dns/cpp/rrset_unittest.cc (original)
+++ branches/jinmei-dnsrdata/src/lib/dns/cpp/rrset_unittest.cc Fri Feb  5 05:18:24 2010
@@ -18,6 +18,7 @@
 #include "messagerenderer.h"
 #include "name.h"
 #include "rdata.h"
+#include "rdataclass.h"
 #include "rrclass.h"
 #include "rrtype.h"
 #include "rrttl.h"

Modified: branches/jinmei-dnsrdata/src/lib/dns/cpp/rrttl.cc
==============================================================================
--- branches/jinmei-dnsrdata/src/lib/dns/cpp/rrttl.cc (original)
+++ branches/jinmei-dnsrdata/src/lib/dns/cpp/rrttl.cc Fri Feb  5 05:18:24 2010
@@ -22,6 +22,7 @@
 #include "messagerenderer.h"
 #include "rrttl.h"
 
+#include <iostream>
 using namespace std;
 using namespace isc::dns;
 
@@ -30,12 +31,15 @@
 
 RRTTL::RRTTL(const string& ttlstr)
 {
-    uint32_t val;
+    // Some systems (at least gcc-4.4) flow negative values over into
+    // unsigned integer, where older systems failed to parse. We want
+    // that failure here, so we extract into int64 and check the value
+    uint64_t val;
 
     istringstream iss(ttlstr);
     iss >> dec >> val;
-    if (iss.rdstate() == ios::eofbit) {
-        ttlval_ = val;
+    if (iss.rdstate() == ios::eofbit && val >= 0 && val <= 0xffffffff) {
+        ttlval_ = static_cast<uint32_t>(val);
     } else {
         dns_throw(InvalidRRTTL, "invalid TTL");
     }

Modified: branches/jinmei-dnsrdata/src/lib/dns/cpp/rrttl.h
==============================================================================
--- branches/jinmei-dnsrdata/src/lib/dns/cpp/rrttl.h (original)
+++ branches/jinmei-dnsrdata/src/lib/dns/cpp/rrttl.h Fri Feb  5 05:18:24 2010
@@ -17,6 +17,8 @@
 #ifndef __RRTTL_H
 #define __RRTTL_H 1
 
+#include <stdint.h>
+
 #include "exceptions.h"
 
 namespace isc {




More information about the bind10-changes mailing list