[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