Parcourir la source

[2390] Add MX implementation

Mukund Sivaraman il y a 12 ans
Parent
commit
adb9e821ff

+ 1 - 0
src/lib/dns/gen-rdatacode.py.in

@@ -35,6 +35,7 @@ import sys
 new_rdata_factory_users = [('aaaa', 'in'),
                            ('hinfo', 'generic'),
                            ('naptr', 'generic'),
+                           ('mx', 'generic'),
                            ('soa', 'generic'),
                            ('spf', 'generic'),
                            ('txt', 'generic')

+ 13 - 0
src/lib/dns/rdata/generic/mx_15.cc

@@ -57,6 +57,19 @@ MX::MX(const std::string& mx_str) :
     mxname_ = Name(mxname);
 }
 
+MX::MX(MasterLexer& lexer, const Name*, MasterLoader::Options,
+       MasterLoaderCallbacks&) :
+    preference_(0), mxname_(".")
+{
+    uint32_t num = lexer.getNextToken(MasterToken::NUMBER).getNumber();
+    if (num > 65535) {
+        isc_throw(InvalidRdataText, "Invalid MX preference");
+    }
+
+    preference_ = static_cast<uint16_t>(num);
+    mxname_ = Name(lexer.getNextToken(MasterToken::QSTRING).getString());
+}
+
 MX::MX(uint16_t preference, const Name& mxname) :
     preference_(preference), mxname_(mxname)
 {}

+ 4 - 0
src/lib/dns/tests/rdata_mx_unittest.cc

@@ -70,6 +70,10 @@ TEST_F(Rdata_MX_Test, createFromLexer) {
     // Exceptions cause NULL to be returned.
     EXPECT_FALSE(test::createRdataUsingLexer(RRType::MX(), RRClass::IN(),
                                              "10 mx. example.com"));
+
+    // 65536 is larger than maximum possible preference
+    EXPECT_FALSE(test::createRdataUsingLexer(RRType::MX(), RRClass::IN(),
+                                             "65536 mx.example.com"));
 }
 
 TEST_F(Rdata_MX_Test, toWireRenderer) {