Changeset 951

Show
Ignore:
Timestamp:
02/17/07 00:06:12 (2 years ago)
Author:
ahu
Message:

teach zoneparser-tng about $INCLUDE and partially implement $GENERATE

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/pdns/pdns/zoneparser-tng.cc

    r802 r951  
    3232ZoneParserTNG::ZoneParserTNG(const string& fname, const string& zname) : d_zonename(zname), d_defaultttl(3600) 
    3333{ 
    34   d_fp=fopen(fname.c_str(), "r"); 
    35   if(!d_fp) 
     34  stackFile(fname); 
     35
     36 
     37void ZoneParserTNG::stackFile(const std::string& fname) 
     38
     39  FILE *fp=fopen(fname.c_str(), "r"); 
     40  if(!fp) 
    3641    throw runtime_error("Unable to open file '"+fname+"': "+stringerror()); 
     42  d_fps.push(fp); 
    3743} 
    3844 
    3945ZoneParserTNG::~ZoneParserTNG() 
    4046{ 
    41   fclose(d_fp); 
     47  while(!d_fps.empty()) { 
     48    fclose(d_fps.top()); 
     49    d_fps.pop(); 
     50  } 
    4251} 
    4352 
     
    91100 
    92101  if(d_line[0]=='$') {  
    93     if(makeString(d_line, parts[0])=="$TTL" && parts.size() > 1) 
     102    string command=makeString(d_line, parts[0]); 
     103    if(command=="$TTL" && parts.size() > 1) 
    94104      d_defaultttl=makeTTLFromZone(makeString(d_line,parts[1])); 
     105    else if(command=="$INCLUDE" && parts.size() > 1) { 
     106      stackFile(unquotify(makeString(d_line, parts[1]))); 
     107    } 
     108#if 0 
     109    else if(command=="$GENERATE" && parts.size() > 2) { 
     110      // $GENERATE 1-127 $ CNAME $.0 
     111      string range=makeString(d_line, parts[1]); 
     112      int start, stop, step=0; 
     113      int ret=sscanf(range.c_str(),"%d-%d/%d", &start, & stop, &step); 
     114      cerr<<"ret="<<ret<<", start="<<start<<", stop="<<stop<<", step="<<step<<endl; 
     115    } 
     116#endif 
    95117    else 
    96118      throw exception("Can't parse zone line '"+d_line+"'"); 
     
    223245bool ZoneParserTNG::getLine() 
    224246{ 
    225   char buffer[1024]; 
    226   if(fgets(buffer, 1024, d_fp)) { 
    227     d_line=buffer; 
    228     return true; 
     247  while(!d_fps.empty()) { 
     248    char buffer[1024]; 
     249    if(fgets(buffer, 1024, d_fps.top())) { 
     250      d_line=buffer; 
     251      return true; 
     252    } 
     253    fclose(d_fps.top()); 
     254    d_fps.pop(); 
    229255  } 
    230256  return false; 
  • trunk/pdns/pdns/zoneparser-tng.hh

    r778 r951  
    2222#include <cstdio> 
    2323#include <stdexcept> 
     24#include <stack> 
    2425 
    2526using namespace std; 
     
    3637private: 
    3738  bool getLine(); 
    38  
    39   FILE *d_fp
     39  void stackFile(const std::string& fname); 
     40  stack<FILE *> d_fps
    4041  string d_line; 
    4142  string d_prevqname;