]> granicus.if.org Git - pdns/commitdiff
zoneparser: more dnsnamification
authorKees Monshouwer <mind04@monshouwer.org>
Fri, 5 Jun 2015 18:12:36 +0000 (20:12 +0200)
committermind04 <mind04@monshouwer.org>
Tue, 30 Jun 2015 06:12:47 +0000 (08:12 +0200)
pdns/misc.hh
pdns/zoneparser-tng.cc

index 63c3032312747aeb214b472bba2cda2809ae0e20..955b971efb6263a1f4f06723897ad9a8f29fc7d4 100644 (file)
@@ -487,32 +487,20 @@ inline size_t pdns_ci_find(const string& haystack, const string& needle)
 
 pair<string, string> splitField(const string& inp, char sepa);
 
-inline bool isCanonical(const string& dom)
+inline bool isCanonical(const string& qname)
 {
-  if(dom.empty())
+  if(qname.empty())
     return false;
-  return dom[dom.size()-1]=='.';
+  return qname[qname.size()-1]=='.';
 }
 
-// get rid of this?
-inline string toCanonic(const DNSName& zone, const string& domain)
+inline DNSName toCanonic(const DNSName& zone, const string& qname)
 {
-  return toCanonic(zone.toString(), domain);
-}
-
-// and this?
-inline string toCanonic(const string& zone, const string& domain)
-{
-  if(domain.length()==1 && domain[0]=='@')
-    return zone;
-
-  if(isCanonical(domain))
-    return domain;
-  string ret=domain;
-  ret.append(1,'.');
-  if(!zone.empty() && zone[0]!='.')
-    ret.append(zone);
-  return ret;
+  if(qname.size()==1 && qname[0]=='@')
+    return zone.toString();
+  if(isCanonical(qname))
+    return DNSName(qname).toString();
+  return DNSName(qname) += zone;
 }
 
 string stripDot(const string& dom);
index 3952d5fb956e9a3e120baa5cff391abafee67720..5f9d6702dad54c8498377630639ab3702673b041 100644 (file)
@@ -278,7 +278,7 @@ bool ZoneParserTNG::get(DNSResourceRecord& rr, std::string* comment)
       stackFile(fname);
     }
     else if(pdns_iequals(command, "$ORIGIN") && parts.size() > 1) {
-      d_zonename = DNSName(toCanonic(string(""), makeString(d_line, parts[1])));
+      d_zonename = DNSName(makeString(d_line, parts[1]));
     }
     else if(pdns_iequals(command, "$GENERATE") && parts.size() > 2) {
       // $GENERATE 1-127 $ CNAME $.0
@@ -298,18 +298,20 @@ bool ZoneParserTNG::get(DNSResourceRecord& rr, std::string* comment)
     goto retry;
   }
 
+  bool prevqname=false;
   string qname = makeString(d_line, parts[0]); // Don't use DNSName here!
-  if(isspace(d_line[0]))
+  if(isspace(d_line[0])) {
     rr.qname=d_prevqname;
-  else {
+    prevqname=true;
+  }else {
     rr.qname=qname;
     parts.pop_front();
-    if(!rr.qname.countLabels() || rr.qname.toString()[0]==';')
+    if(qname.empty() || qname[0]==';')
       goto retry;
   }
   if(qname=="@")
     rr.qname=d_zonename;
-  else if(!isCanonical(qname))
+  else if(!prevqname && !isCanonical(qname))
     rr.qname += d_zonename;
   d_prevqname=rr.qname;
 
@@ -369,7 +371,7 @@ bool ZoneParserTNG::get(DNSResourceRecord& rr, std::string* comment)
   trim(rr.content);
 
   if(equals(rr.content, "@"))
-    rr.content=d_zonename.toString();
+    rr.content=d_zonename.toStringNoDot();
 
   if(findAndElide(rr.content, '(')) {      // have found a ( and elided it
     if(!findAndElide(rr.content, ')')) {
@@ -392,7 +394,7 @@ bool ZoneParserTNG::get(DNSResourceRecord& rr, std::string* comment)
     stringtok(recparts, rr.content);
     if(recparts.size()==2) {
       if (recparts[1]!=".")
-        recparts[1] = stripDot(toCanonic(d_zonename.toString(), recparts[1]));
+        recparts[1] = toCanonic(d_zonename, recparts[1]).toStringNoDot();
       rr.content=recparts[0]+" "+recparts[1];
     }
     break;
@@ -400,8 +402,8 @@ bool ZoneParserTNG::get(DNSResourceRecord& rr, std::string* comment)
   case QType::RP:
     stringtok(recparts, rr.content);
     if(recparts.size()==2) {
-      recparts[0] = stripDot(toCanonic(d_zonename.toString(), recparts[0]));
-      recparts[1] = stripDot(toCanonic(d_zonename.toString(), recparts[1]));
+      recparts[0] = toCanonic(d_zonename, recparts[0]).toStringNoDot();
+      recparts[1] = toCanonic(d_zonename, recparts[1]).toStringNoDot();
       rr.content=recparts[0]+" "+recparts[1];
     }
     break;
@@ -410,7 +412,7 @@ bool ZoneParserTNG::get(DNSResourceRecord& rr, std::string* comment)
     stringtok(recparts, rr.content);
     if(recparts.size()==4) {
       if(recparts[3]!=".")
-        recparts[3] = stripDot(toCanonic(d_zonename.toString(), recparts[3]));
+        recparts[3] = toCanonic(d_zonename, recparts[3]).toStringNoDot();
       rr.content=recparts[0]+" "+recparts[1]+" "+recparts[2]+" "+recparts[3];
     }
     break;
@@ -421,14 +423,14 @@ bool ZoneParserTNG::get(DNSResourceRecord& rr, std::string* comment)
   case QType::DNAME:
   case QType::PTR:
   case QType::AFSDB:
-    rr.content=stripDot(toCanonic(d_zonename.toString(), rr.content));
+    rr.content=toCanonic(d_zonename, rr.content).toStringNoDot();
     break;
 
   case QType::SOA:
     stringtok(recparts, rr.content);
     if(recparts.size() > 1) {
-      recparts[0]=toCanonic(d_zonename.toString(), recparts[0]);
-      recparts[1]=toCanonic(d_zonename.toString(), recparts[1]);
+      recparts[0]=toCanonic(d_zonename, recparts[0]).toStringNoDot();
+      recparts[1]=toCanonic(d_zonename, recparts[1]).toStringNoDot();
     }
     rr.content.clear();
     for(string::size_type n = 0; n < recparts.size(); ++n) {