Changeset 1014

Show
Ignore:
Timestamp:
04/07/07 17:54:30 (2 years ago)
Author:
ahu
Message:

improved support for multiline records in zones, plus accept @ as part of queries

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/pdns/pdns/packethandler.cc

    r1004 r1014  
    548548         (c >= 'A' && c <= 'Z') || 
    549549         (c >= '0' && c <= '9') || 
    550          c =='-' || c == '_' || c=='*' || c=='.' || c=='/')) 
     550         c =='-' || c == '_' || c=='*' || c=='.' || c=='/' || c=='@')) 
    551551      return false; 
    552552  } 
  • trunk/pdns/pdns/zoneparser-tng.cc

    r996 r1014  
    179179} 
    180180 
     181bool findAndElide(string& line, char c) 
     182{ 
     183  string::size_type pos, len = line.length(); 
     184  bool inQuote=false; 
     185  for(pos = 0 ; pos < len; ++pos) { 
     186    if(line[pos]=='\\')  
     187      pos++; 
     188    else if(line[pos]=='"')  
     189      inQuote=!inQuote; 
     190    else if(line[pos]==c && !inQuote) 
     191      break; 
     192  } 
     193  if(pos != len) { 
     194    line.erase(pos, 1); 
     195    return true; 
     196  } 
     197  return false; 
     198} 
     199 
     200 
    181201bool ZoneParserTNG::get(DNSResourceRecord& rr)  
    182202{ 
     
    290310 
    291311  chopComment(rr.content); 
    292   string::size_type pos; 
    293  
    294   if(rr.qtype.getCode()!=QType::TXT && (pos=rr.content.find('('))!=string::npos) { 
    295     rr.content.resize(pos); // chop off ( 
    296     trim(rr.content); 
    297     while(getLine()) { 
    298       chomp(d_line,"\r\n "); 
    299       chopComment(d_line); 
    300  
    301       trim(d_line); 
    302        
    303       pos=d_line.find(')'); 
    304       if(pos!=string::npos) { 
    305         d_line.resize(pos); 
     312  //  cerr<<"rr.content before possible elide: '"<<rr.content<<"'\n"; 
     313  if(findAndElide(rr.content, '(')) {      // have found a ( and elided it 
     314    if(!findAndElide(rr.content, ')')) { 
     315      while(getLine()) { 
     316        chomp(d_line,"\r\n "); 
     317        chopComment(d_line); 
    306318        trim(d_line); 
     319         
     320        bool ended = findAndElide(d_line, ')'); 
    307321        rr.content+=" "+d_line; 
    308         break; 
     322        if(ended) 
     323          break; 
    309324      } 
    310       rr.content+=" "+d_line; 
    311    
    312   } 
     325    } 
     326 
     327 
    313328  vector<string> soaparts; 
    314329  switch(rr.qtype.getCode()) { 
     
    357372  return false; 
    358373} 
    359  
    360  
    361 #if 0 
    362 int main(int argc, char** argv) 
    363 try 
    364 { 
    365   reportAllTypes(); 
    366   ZoneParserTNG zpt(argv[1]); 
    367   DNSResourceRecord rr; 
    368   while(zpt.get(rr)) { 
    369   } 
    370    
    371  
    372 } 
    373 catch(...) 
    374 {} 
    375 #endif 
  • trunk/pdns/regression-tests/test.com

    r947 r1014  
    11$TTL 3600 
    22$ORIGIN test.com. 
    3 @               IN      SOA     ns1.test.com.   ahu.example.com. ( 
    4                         2005092501 
     3@               IN      SOA     ns1.test.com.   ahu.example.com. (  2005092501 
    54                        8H ; refresh 
    65                        2H ; retry