]> granicus.if.org Git - pdns/commitdiff
teach zoneparser-tng about $INCLUDE and partially implement $GENERATE
authorBert Hubert <bert.hubert@netherlabs.nl>
Fri, 16 Feb 2007 23:06:12 +0000 (23:06 +0000)
committerBert Hubert <bert.hubert@netherlabs.nl>
Fri, 16 Feb 2007 23:06:12 +0000 (23:06 +0000)
git-svn-id: svn://svn.powerdns.com/pdns/trunk/pdns@951 d19b8d6e-7fed-0310-83ef-9ca221ded41b

pdns/zoneparser-tng.cc
pdns/zoneparser-tng.hh

index 9e6f522dd5f64fd7ecec4bea9edc198ede8a07d3..42b2e2ad270bec8b0b57ecfaf29281a1966f478c 100644 (file)
 
 ZoneParserTNG::ZoneParserTNG(const string& fname, const string& zname) : d_zonename(zname), d_defaultttl(3600)
 {
-  d_fp=fopen(fname.c_str(), "r");
-  if(!d_fp)
+  stackFile(fname);
+}
+
+void ZoneParserTNG::stackFile(const std::string& fname)
+{
+  FILE *fp=fopen(fname.c_str(), "r");
+  if(!fp)
     throw runtime_error("Unable to open file '"+fname+"': "+stringerror());
+  d_fps.push(fp);
 }
 
 ZoneParserTNG::~ZoneParserTNG()
 {
-  fclose(d_fp);
+  while(!d_fps.empty()) {
+    fclose(d_fps.top());
+    d_fps.pop();
+  }
 }
 
 static string makeString(const string& line, const pair<string::size_type, string::size_type>& range)
@@ -90,8 +99,21 @@ bool ZoneParserTNG::get(DNSResourceRecord& rr)
     goto retry;
 
   if(d_line[0]=='$') { 
-    if(makeString(d_line, parts[0])=="$TTL" && parts.size() > 1)
+    string command=makeString(d_line, parts[0]);
+    if(command=="$TTL" && parts.size() > 1)
       d_defaultttl=makeTTLFromZone(makeString(d_line,parts[1]));
+    else if(command=="$INCLUDE" && parts.size() > 1) {
+      stackFile(unquotify(makeString(d_line, parts[1])));
+    }
+#if 0
+    else if(command=="$GENERATE" && parts.size() > 2) {
+      // $GENERATE 1-127 $ CNAME $.0
+      string range=makeString(d_line, parts[1]);
+      int start, stop, step=0;
+      int ret=sscanf(range.c_str(),"%d-%d/%d", &start, & stop, &step);
+      cerr<<"ret="<<ret<<", start="<<start<<", stop="<<stop<<", step="<<step<<endl;
+    }
+#endif
     else
       throw exception("Can't parse zone line '"+d_line+"'");
     goto retry;
@@ -222,10 +244,14 @@ bool ZoneParserTNG::get(DNSResourceRecord& rr)
 
 bool ZoneParserTNG::getLine()
 {
-  char buffer[1024];
-  if(fgets(buffer, 1024, d_fp)) {
-    d_line=buffer;
-    return true;
+  while(!d_fps.empty()) {
+    char buffer[1024];
+    if(fgets(buffer, 1024, d_fps.top())) {
+      d_line=buffer;
+      return true;
+    }
+    fclose(d_fps.top());
+    d_fps.pop();
   }
   return false;
 }
index b22384a6299890a30b2b0f1d00e78ed1b1c274a8..e17e7b8a72379df54d250315ef3a7ceee2795b10 100644 (file)
@@ -21,6 +21,7 @@
 #include <string>
 #include <cstdio>
 #include <stdexcept>
+#include <stack>
 
 using namespace std;
 
@@ -35,8 +36,8 @@ public:
   typedef runtime_error exception;
 private:
   bool getLine();
-
-  FILE *d_fp;
+  void stackFile(const std::string& fname);
+  stack<FILE *> d_fps;
   string d_line;
   string d_prevqname;
   string d_zonename;