]> granicus.if.org Git - pdns/commitdiff
Add support for searchRecords to bind backend
authorAki Tuomi <cmouse@desteem.org>
Fri, 31 Jul 2015 20:28:44 +0000 (23:28 +0300)
committerAki Tuomi <cmouse@cmouse.fi>
Wed, 5 Aug 2015 19:25:53 +0000 (22:25 +0300)
modules/bindbackend/bindbackend2.cc
modules/bindbackend/bindbackend2.hh

index 39abbd30c7d5d3272f63c6890b8b0ce6e09f1fcf..9c072ce49a914415556450dddd83ac031c502a96 100644 (file)
@@ -1321,6 +1321,40 @@ bool Bind2Backend::createSlaveDomain(const string &ip, const string &domain, con
   return true;
 }
 
+bool Bind2Backend::searchRecords(const string &pattern, int maxResults, vector<DNSResourceRecord>& result)
+{
+  SimpleMatch sm(pattern,true);
+  static bool mustlog=::arg().mustDo("query-logging");
+  if(mustlog)
+    L<<Logger::Warning<<"Search for pattern '"<<pattern<<"'"<<endl;
+
+  {
+    ReadLock rl(&s_state_lock);
+
+    for(state_t::const_iterator i = s_state.begin(); i != s_state.end() ; ++i) {
+      BB2DomainInfo h;
+      safeGetBBDomainInfo(i->d_id, &h);
+      shared_ptr<const recordstorage_t> handle = h.d_records.get();
+
+      for(recordstorage_t::const_iterator ri = handle->begin(); result.size() < static_cast<vector<DNSResourceRecord>::size_type>(maxResults) && ri != handle->end(); ri++) {
+        string name = ri->qname.empty() ? i->d_name : (ri->qname+i->d_name);
+        if (sm.match(name) || sm.match(ri->content)) {
+          DNSResourceRecord r;
+          r.qname=name;
+          r.domain_id=i->d_id;
+          r.content=ri->content;
+          r.qtype=ri->qtype;
+          r.ttl=ri->ttl;
+          r.auth = ri->auth;
+          result.push_back(r);
+        }
+      }
+    }
+  }
+
+  return true;
+}
+
 class Bind2Factory : public BackendFactory
 {
    public:
index 8666a702a46ced0fed76aa19f9224c67fe787df5..79d7d8337078feb44fa4d0d6b5783b2c11a05f37 100644 (file)
@@ -201,6 +201,7 @@ public:
   bool commitTransaction();
   bool abortTransaction();
   void alsoNotifies(const string &domain, set<string> *ips);
+  bool searchRecords(const string &pattern, int maxResults, vector<DNSResourceRecord>& result);
 
 // the DNSSEC related (getDomainMetadata has broader uses too)
   virtual bool getAllDomainMetadata(const string& name, std::map<std::string, std::vector<std::string> >& meta);