]> granicus.if.org Git - pdns/commitdiff
improved support for multiline records in zones, plus accept @ as part of queries
authorBert Hubert <bert.hubert@netherlabs.nl>
Sat, 7 Apr 2007 15:54:30 +0000 (15:54 +0000)
committerBert Hubert <bert.hubert@netherlabs.nl>
Sat, 7 Apr 2007 15:54:30 +0000 (15:54 +0000)
git-svn-id: svn://svn.powerdns.com/pdns/trunk/pdns@1014 d19b8d6e-7fed-0310-83ef-9ca221ded41b

pdns/packethandler.cc
pdns/zoneparser-tng.cc
regression-tests/test.com

index 3ee3fe44ff62ba444f915fb3d697663e4b26cfc5..ca000dfc798ab8dff26d08e9b4b69e4be45ee890 100644 (file)
@@ -547,7 +547,7 @@ bool validDNSName(const string &name)
     if(!((c >= 'a' && c <= 'z') ||
         (c >= 'A' && c <= 'Z') ||
         (c >= '0' && c <= '9') ||
-        c =='-' || c == '_' || c=='*' || c=='.' || c=='/'))
+        c =='-' || c == '_' || c=='*' || c=='.' || c=='/' || c=='@'))
       return false;
   }
   return true;
index 85a8741ea2d25cdec2d1bb64700ee6b29d61615f..588a85ffe8d2b0c232f657fa172b82a87f7c9518 100644 (file)
@@ -178,6 +178,26 @@ void chopComment(string& line)
     line.resize(pos);
 }
 
+bool findAndElide(string& line, char c)
+{
+  string::size_type pos, len = line.length();
+  bool inQuote=false;
+  for(pos = 0 ; pos < len; ++pos) {
+    if(line[pos]=='\\') 
+      pos++;
+    else if(line[pos]=='"') 
+      inQuote=!inQuote;
+    else if(line[pos]==c && !inQuote)
+      break;
+  }
+  if(pos != len) {
+    line.erase(pos, 1);
+    return true;
+  }
+  return false;
+}
+
+
 bool ZoneParserTNG::get(DNSResourceRecord& rr) 
 {
  retry:;
@@ -289,27 +309,22 @@ bool ZoneParserTNG::get(DNSResourceRecord& rr)
   rr.content=d_line.substr(range.first);
 
   chopComment(rr.content);
-  string::size_type pos;
-
-  if(rr.qtype.getCode()!=QType::TXT && (pos=rr.content.find('('))!=string::npos) {
-    rr.content.resize(pos); // chop off (
-    trim(rr.content);
-    while(getLine()) {
-      chomp(d_line,"\r\n ");
-      chopComment(d_line);
-
-      trim(d_line);
-      
-      pos=d_line.find(')');
-      if(pos!=string::npos) {
-       d_line.resize(pos);
+  //  cerr<<"rr.content before possible elide: '"<<rr.content<<"'\n";
+  if(findAndElide(rr.content, '(')) {      // have found a ( and elided it
+    if(!findAndElide(rr.content, ')')) {
+      while(getLine()) {
+       chomp(d_line,"\r\n ");
+       chopComment(d_line);
        trim(d_line);
+       
+       bool ended = findAndElide(d_line, ')');
        rr.content+=" "+d_line;
-       break;
+       if(ended)
+         break;
       }
-      rr.content+=" "+d_line;
     }
   }
+
   vector<string> soaparts;
   switch(rr.qtype.getCode()) {
   case QType::MX:
@@ -356,20 +371,3 @@ bool ZoneParserTNG::getLine()
   }
   return false;
 }
-
-
-#if 0
-int main(int argc, char** argv)
-try
-{
-  reportAllTypes();
-  ZoneParserTNG zpt(argv[1]);
-  DNSResourceRecord rr;
-  while(zpt.get(rr)) {
-  }
-  
-
-}
-catch(...)
-{}
-#endif
index ea14d5818c58dfa9d29dd16bdaef125099237242..debd8fd34bfe02e4abdbf06cf3bd44060dd097aa 100644 (file)
@@ -1,7 +1,6 @@
 $TTL 3600
 $ORIGIN test.com.
-@              IN      SOA     ns1.test.com.   ahu.example.com. (
-                       2005092501
+@              IN      SOA     ns1.test.com.   ahu.example.com. (  2005092501
                        8H ; refresh
                        2H ; retry
                        1W ; expire