]> granicus.if.org Git - pdns/commitdiff
Implement directBackendCmd in pipe backend
authorAki Tuomi <cmouse@cmouse.fi>
Tue, 30 Jun 2015 05:54:46 +0000 (08:54 +0300)
committerPeter van Dijk <peter.van.dijk@netherlabs.nl>
Tue, 30 Jun 2015 10:37:43 +0000 (12:37 +0200)
modules/pipebackend/pipebackend.cc
modules/pipebackend/pipebackend.hh

index 2d6e9b78f55ff8453485522f62e3102aaf20b47f..974c588e5ccd5b8c44bfaa002cbfbe7339864f30 100644 (file)
@@ -173,6 +173,33 @@ bool PipeBackend::list(const string &target, int inZoneId, bool include_disabled
    return true;
 }
 
+string PipeBackend::directBackendCmd(const string &query) {
+  if (d_abiVersion < 5)
+    return "not supported on ABI version " + boost::lexical_cast<string>(d_abiVersion) + "(use ABI version 5 or later)\n";
+
+  ostringstream oss;
+
+  try {
+      ostringstream oss;
+      oss<<"CMD\t"<<query;
+      d_coproc->send(oss.str());
+   }
+   catch(PDNSException &ae) {
+      L<<Logger::Error<<kBackendId<<" Error from coprocess: "<<ae.reason<<endl;
+      throw;
+   }
+   oss.str("");
+
+   while(true) {
+     string line;
+     d_coproc->receive(line);
+     if (line == "END") break;
+     oss << line << std::endl;
+   };
+
+   return oss.str();
+}
+
 //! For the dynamic loader
 DNSBackend *PipeBackend::maker()
 {
index fe51bfc35e7defe3cd0d3e7c264ceac5d9e44d5b..e1b1edf31cad0f3aa05bf7b7c98f34c5dec17d23 100644 (file)
@@ -40,7 +40,7 @@ public:
   void lookup(const QType &, const string &qdomain, DNSPacket *p=0, int zoneId=-1);
   bool list(const string &target, int domain_id, bool include_disabled=false);
   bool get(DNSResourceRecord &r);
-  
+  string directBackendCmd(const string &query);
   static DNSBackend *maker();
   
 private: