Your message dated Mon, 20 Jul 2009 16:33:38 +0200
with message-id <[email protected]>
and subject line Re: UI-Patch: Please add a multi-index packet cache
has caused the Debian Bug report #510867,
regarding UI-Patch: Please add a multi-index packet cache
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact [email protected]
immediately.)


-- 
510867: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=510867
Debian Bug Tracking System
Contact [email protected] with problems
--- Begin Message ---
Package: pdns
Severity: wishlist
Tags: patch

Hi pdns maintainers,

the attached dpatch

## DP: Allows multi-index packet cache.
## DP:
## DP: Note that this patch also fixes/worksaround some "C++ programmer 
blackouts"
## DP: that should eventually be cleaned up upstream:
## DP: - Works around hilarious "#define L" in header files (effectiveley 
breaking boost template includes in our case).
## DP: - Cleans up some C++ namespace issues with boost (most likely due to 
lame "use namespace"-things for boost)
## DP:   by adding top level namespace "::" where ambigiuous.

is used here (UI) to improve pdns. It applies cleanly to 2.9.21.2-1
after the existing dpatches.

We would be enlightened if you could review it and eventually consider 
adding it to the Debian package.      

Thanks!

Stephan

-- System Information:
Debian Release: 5.0
  APT prefers testing
  APT policy: (500, 'testing')
Architecture: amd64 (x86_64)

Kernel: Linux 2.6.26-1-amd64 (SMP w/2 CPU cores)
Locale: LANG=en_GB.UTF-8, LC_CTYPE=en_GB.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/bash
#! /bin/sh /usr/share/dpatch/dpatch-run
## ui-25_multi_index.dpatch by Stephan Suerken <[email protected]>
##
## All lines beginning with `## DP:' are a description of the patch.
##
## DP: Allows multi-index packet cache.
## DP:
## DP: Note that this patch also fixes/worksaround some "C++ programmer blackouts"
## DP: that should eventually be cleaned up upstream:
## DP: - Works around hilarious "#define L" in header files (effectiveley breaking boost template includes in our case).
## DP: - Cleans up some C++ namespace issues with boost (most likely due to lame "use namespace"-things for boost)
## DP:   by adding top level namespace "::" where ambigiuous.

@DPATCH@
diff -urNad trunk~/pdns/common_startup.cc trunk/pdns/common_startup.cc
--- trunk~/pdns/common_startup.cc	2009-01-05 13:15:46.000000000 +0000
+++ trunk/pdns/common_startup.cc	2009-01-05 13:15:46.000000000 +0000
@@ -105,6 +105,7 @@
   arg().set("negquery-cache-ttl","Seconds to store packets in the PacketCache")="60";
   arg().set("query-cache-ttl","Seconds to store packets in the PacketCache")="20";
   arg().set("soa-minimum-ttl","Default SOA mininum ttl")="3600";
+	arg().set("max-cache-size","Maximum number of queries in PacketCache")="100000";
 
   arg().set("soa-refresh-default","Default SOA refresh")="10800";
   arg().set("soa-retry-default","Default SOA retry")="3600";
diff -urNad trunk~/pdns/communicator.cc trunk/pdns/communicator.cc
--- trunk~/pdns/communicator.cc	2009-01-05 13:15:45.000000000 +0000
+++ trunk/pdns/communicator.cc	2009-01-05 13:15:46.000000000 +0000
@@ -196,7 +196,7 @@
 
 void CommunicatorClass::masterUpdateCheck(PacketHandler *P)
 {
-  if(!arg().mustDo("master"))
+  if(!::arg().mustDo("master"))
     return; 
 
   UeberBackend *B=dynamic_cast<UeberBackend *>(P->getBackend());
@@ -368,7 +368,7 @@
   sin.sin_family = AF_INET;
 
   // Bind to a specific IP (query-local-address) if specified
-  string querylocaladdress(arg()["query-local-address"]);
+  string querylocaladdress(::arg()["query-local-address"]);
   if (querylocaladdress=="") {
     sin.sin_addr.s_addr = INADDR_ANY;
   }
@@ -389,7 +389,7 @@
   for(;n<10;n++) {
     sin.sin_port = htons(10000+(Utility::random()%50000));
     
-    if(bind(d_nsock, (struct sockaddr *)&sin, sizeof(sin)) >= 0) 
+    if(::bind(d_nsock, (struct sockaddr *)&sin, sizeof(sin)) >= 0) 
       break;
   }
   if(n==10) {
@@ -417,7 +417,7 @@
 #endif // WIN32
     L<<Logger::Error<<"Master/slave communicator launching"<<endl;
     PacketHandler P;
-    d_tickinterval=arg().asNum("slave-cycle-interval");
+    d_tickinterval=::arg().asNum("slave-cycle-interval");
     makeNotifySocket();
 
     int rc;
diff -urNad trunk~/pdns/packetcache.cc trunk/pdns/packetcache.cc
--- trunk~/pdns/packetcache.cc	2007-04-21 13:56:36.000000000 +0000
+++ trunk/pdns/packetcache.cc	2009-01-05 13:15:46.000000000 +0000
@@ -72,6 +72,7 @@
 {
   d_ttl=arg().asNum("cache-ttl");
   d_recursivettl=arg().asNum("recursive-cache-ttl");
+  d_maxCacheSize=arg().asNum( "max-cache-size" );
 
   d_doRecursion=arg().mustDo("recursor"); 
 }
@@ -107,6 +108,17 @@
   if(!ttl)
     return;
 
+#if MULTI
+  cvalue_t val(key, time(0)+ttl, packet);
+
+  TryWriteLock l(&d_mut);
+  if(l.gotIt())  
+  {
+    pair<cmap_t::iterator, bool>i(d_map.insert(val));
+    if(i.second==false)
+      d_map.replace(i.first,val);
+  }
+#else
   cvalue_t val;
   val.ttd=time(0)+ttl;
   val.value=packet;
@@ -114,6 +126,7 @@
   TryWriteLock l(&d_mut);
   if(l.gotIt())  
     d_map[key]=val;
+#endif
   else 
     S.inc("deferred-cache-inserts"); 
 }
@@ -153,7 +166,11 @@
   ReadLock l(&d_mut);
 
   for(cmap_t::iterator i=d_map.begin();i!=d_map.end();++i) {
+#if MULTI
+    string::size_type pos=i->key.find(check);
+#else
     string::size_type pos=i->first.find(check);
+#endif
 
     if(!pos || (suffix && pos!=string::npos)) 
       toRemove.push_back(i);
@@ -178,9 +195,15 @@
   // needs to do ttl check here
   cmap_t::const_iterator i=d_map.find(key);
   time_t now=time(0);
+#if MULTI
+  bool ret=(i!=d_map.end() && i->ttd>now);
+  if(ret)
+    content=i->value;
+#else
   bool ret=(i!=d_map.end() && i->second.ttd>now);
   if(ret)
     content=i->second.value;
+#endif
   return ret;
 }
 
@@ -192,12 +215,21 @@
   memset(counts,0,256*sizeof(counts[0]));
   char key;
   for(cmap_t::const_iterator i=d_map.begin();i!=d_map.end();++i) {
+#if MULTI
+    if((offset=i->key.find_first_of("|"))==string::npos || offset+1>i->key.size())
+      continue;
+    
+    key=i->key[offset+1];
+    if((key=='Q' || key=='q') && !i->value.empty())
+      key='!';
+#else
     if((offset=i->first.find_first_of("|"))==string::npos || offset+1>i->first.size())
       continue;
     
     key=i->first[offset+1];
     if((key=='Q' || key=='q') && !i->second.value.empty())
       key='!';
+#endif
     counts[(int)key]++;
   }
 
@@ -233,10 +265,22 @@
 
   vector<cmap_t::iterator> toRemove;
 
+#if MULTI
+  typedef cmap_t::index<tag_ttl>::type ttlsort;
+
+  int cachesize = d_map.size() - d_maxCacheSize;
+  for ( ttlsort::iterator i( d_map.get<tag_ttl>().begin() ); i != d_map.get<tag_ttl>().end() &&
+       ( cachesize > 0 || now>i->ttd ) ; ++i )
+  {
+    --cachesize;
+    toRemove.push_back(d_map.project<0>(i));
+  }
+#else
   for(cmap_t::iterator i=d_map.begin();i!=d_map.end();++i) {
     if(now>i->second.ttd)
       toRemove.push_back(i);
   }
+#endif
 
   l.upgrade(); 
 
diff -urNad trunk~/pdns/packetcache.hh trunk/pdns/packetcache.hh
--- trunk~/pdns/packetcache.hh	2007-04-21 13:56:36.000000000 +0000
+++ trunk/pdns/packetcache.hh	2009-01-05 13:15:46.000000000 +0000
@@ -23,6 +23,22 @@
 #include <utility>
 #include <map>
 
+#define MULTI 1
+
+#if MULTI
+#undef L
+#include <boost/multi_index/ordered_index.hpp>
+#include <boost/multi_index/key_extractors.hpp>
+#include <boost/multi_index_container.hpp>
+#include <boost/version.hpp>
+#include <boost/multi_index/hashed_index.hpp>
+#define L theL()
+
+using namespace ::boost::multi_index;
+struct tag_ttl {};
+
+#endif
+
 #ifndef WIN32
 # if __GNUC__ >= 3
 #   include <ext/hash_map>
@@ -73,6 +89,33 @@
   void insert(const string &key, const string &packet, unsigned int ttl);
   map<char,int> getCounts();
 private:
+  void getTTLS();
+
+#if MULTI
+  class CacheContent
+  {
+  public:
+    CacheContent( const string &k, time_t t, const string &v )
+    : key( k )
+    , ttd( t )
+    , value( v )
+    {}
+    string key;
+    time_t ttd;
+    string value;
+  };
+
+  typedef CacheContent cvalue_t;
+
+  typedef multi_index_container<
+    CacheContent,
+    indexed_by <
+      hashed_unique<member<CacheContent,std::string,&CacheContent::key> >,
+      ordered_non_unique<tag<tag_ttl>, member<CacheContent,time_t,&CacheContent::ttd> >
+    >
+  > cmap_t;
+#else
+
   typedef string ckey_t;
 
   class CacheContent
@@ -83,7 +126,7 @@
   };
 
   typedef CacheContent cvalue_t;
-  void getTTLS();
+
 #ifndef WIN32
 
   struct compare_string
@@ -109,6 +152,8 @@
 
 #endif // WIN32
 
+#endif // MULTI
+
   cmap_t d_map;
 
   pthread_rwlock_t d_mut;
@@ -118,6 +163,9 @@
   int d_miss;
   int d_ttl;
   int d_recursivettl;
+  cmap_t::size_type d_maxCacheSize;
+  int d_cacheFullDel;
+   
   bool d_doRecursion;
   int *statnumhit;
   int *statnummiss;
@@ -179,6 +227,15 @@
     cmap_t::const_iterator i;
     if((i=d_map.find(key))!=d_map.end()) { // HIT!
 
+#if MULTI
+     if(i->ttd>time(0)) { // it is still fresh
+	(*statnumhit)++;
+	d_hit++;
+	cached->parse(i->value.c_str(),i->value.size());  
+	cached->spoofQuestion(p->qdomain); // for correct case
+	return 1;
+      }
+#else
       if(i->second.ttd>time(0)) { // it is still fresh
 	(*statnumhit)++;
 	d_hit++;
@@ -186,6 +243,7 @@
 	cached->spoofQuestion(p->qdomain); // for correct case
 	return 1;
       }
+#endif
     }
   }
   (*statnummiss)++;
diff -urNad trunk~/pdns/pdns.conf-dist trunk/pdns/pdns.conf-dist
--- trunk~/pdns/pdns.conf-dist	2009-01-05 13:15:46.000000000 +0000
+++ trunk/pdns/pdns.conf-dist	2009-01-05 13:15:46.000000000 +0000
@@ -20,6 +20,11 @@
 # cache-ttl=20
 
 #################################
+# max-cache-size       Maximum number of queries in PacketCache
+#
+# max-cache-size=100000
+
+#################################
 # chroot	If set, chroot to this directory for more security
 #
 # chroot=
diff -urNad trunk~/pdns/receiver.cc trunk/pdns/receiver.cc
--- trunk~/pdns/receiver.cc	2008-08-07 07:02:53.000000000 +0000
+++ trunk/pdns/receiver.cc	2009-01-05 13:15:46.000000000 +0000
@@ -123,7 +123,7 @@
 
 static void writePid(void)
 {
-  string fname=arg()["socket-dir"]+"/"+s_programname+".pid";
+  string fname=::arg()["socket-dir"]+"/"+s_programname+".pid";
   ofstream of(fname.c_str());
   if(of)
     of<<getpid()<<endl;
@@ -204,9 +204,9 @@
       char **const newargv=new char*[argc+2];
       int n;
 
-      if(arg()["config-name"]!="") {
-	progname+="-"+arg()["config-name"];
-	L<<Logger::Error<<"Virtual configuration name: "<<arg()["config-name"]<<endl;
+      if(::arg()["config-name"]!="") {
+	progname+="-"+::arg()["config-name"];
+	L<<Logger::Error<<"Virtual configuration name: "<<::arg()["config-name"]<<endl;
       }
 
       newargv[0]=strdup(const_cast<char *>((progname+"-instance").c_str()));
@@ -321,35 +321,35 @@
 static void UNIX_declareArguments()
 {
   static char pietje[128]="!@@SYSCONFDIR@@:";
-  arg().set("config-dir","Location of configuration directory (pdns.conf)")=
+  ::arg().set("config-dir","Location of configuration directory (pdns.conf)")=
     strcmp(pietje+1,"@@SYSCONFDIR@@:") ? pietje+strlen("@@SYSCONFDIR@@:")+1 : SYSCONFDIR;
   
-  arg().set("config-name","Name of this virtual configuration - will rename the binary image")="";
-  arg().set("socket-dir","Where the controlsocket will live")=LOCALSTATEDIR;
-  arg().set("module-dir","Default directory for modules")=LIBDIR;
-  arg().set("chroot","If set, chroot to this directory for more security")="";
-  arg().set("logging-facility","Log under a specific facility")="";
-  arg().set("daemon","Operate as a daemon")="no";
+  ::arg().set("config-name","Name of this virtual configuration - will rename the binary image")="";
+  ::arg().set("socket-dir","Where the controlsocket will live")=LOCALSTATEDIR;
+  ::arg().set("module-dir","Default directory for modules")=LIBDIR;
+  ::arg().set("chroot","If set, chroot to this directory for more security")="";
+  ::arg().set("logging-facility","Log under a specific facility")="";
+  ::arg().set("daemon","Operate as a daemon")="no";
 
 }
 
 static void loadModules()
 {
-  if(!arg()["load-modules"].empty()) { 
+  if(!::arg()["load-modules"].empty()) { 
     vector<string>modules;
     
-    stringtok(modules,arg()["load-modules"],",");
+    stringtok(modules,::arg()["load-modules"],",");
     
     for(vector<string>::const_iterator i=modules.begin();i!=modules.end();++i) {
       bool res;
       const string &module=*i;
       
       if(module.find(".")==string::npos)
-	res=UeberBackend::loadmodule(arg()["module-dir"]+"/lib"+module+"backend.so");
+	res=UeberBackend::loadmodule(::arg()["module-dir"]+"/lib"+module+"backend.so");
       else if(module[0]=='/' || (module[0]=='.' && module[1]=='/') || (module[0]=='.' && module[1]=='.'))    // absolute or current path
 	res=UeberBackend::loadmodule(module);
       else
-	res=UeberBackend::loadmodule(arg()["module-dir"]+"/"+module);
+	res=UeberBackend::loadmodule(::arg()["module-dir"]+"/"+module);
       
       if(res==false) {
 	L<<Logger::Error<<"receiver unable to load module "<<module<<endl;
@@ -405,38 +405,38 @@
     declareArguments();
     UNIX_declareArguments();
       
-    arg().laxParse(argc,argv); // do a lax parse
+    ::arg().laxParse(argc,argv); // do a lax parse
     
-    if(arg()["config-name"]!="") 
-      s_programname+="-"+arg()["config-name"];
+    if(::arg()["config-name"]!="") 
+      s_programname+="-"+::arg()["config-name"];
     
     (void)theL(s_programname);
     
-    string configname=arg()["config-dir"]+"/"+s_programname+".conf";
+    string configname=::arg()["config-dir"]+"/"+s_programname+".conf";
     cleanSlashes(configname);
 
-    if(!arg().mustDo("config") && !arg().mustDo("no-config")) // "config" == print a configuration file
-      arg().laxFile(configname.c_str());
+    if(!::arg().mustDo("config") && !::arg().mustDo("no-config")) // "config" == print a configuration file
+      ::arg().laxFile(configname.c_str());
     
-    arg().laxParse(argc,argv); // reparse so the commandline still wins
-    if(!arg()["logging-facility"].empty()) {
-      boost::optional<int> val=logFacilityToLOG(arg().asNum("logging-facility") );
+    ::arg().laxParse(argc,argv); // reparse so the commandline still wins
+    if(!::arg()["logging-facility"].empty()) {
+      boost::optional<int> val=logFacilityToLOG(::arg().asNum("logging-facility") );
       if(val)
 	theL().setFacility(*val);
       else
-	L<<Logger::Error<<"Unknown logging facility "<<arg().asNum("logging-facility") <<endl;
+	L<<Logger::Error<<"Unknown logging facility "<<::arg().asNum("logging-facility") <<endl;
     }
 
-    L.setLoglevel((Logger::Urgency)(arg().asNum("loglevel")));
-    L.toConsole((Logger::Urgency)(arg().asNum("loglevel")));  
+    L.setLoglevel((Logger::Urgency)(::arg().asNum("loglevel")));
+    L.toConsole((Logger::Urgency)(::arg().asNum("loglevel")));  
 
-    if(arg().mustDo("help") || arg().mustDo("config")) {
-      arg().set("daemon")="no";
-      arg().set("guardian")="no";
+    if(::arg().mustDo("help") || ::arg().mustDo("config")) {
+      ::arg().set("daemon")="no";
+      ::arg().set("guardian")="no";
     }
 
-    if(arg().mustDo("guardian") && !isGuarded(argv)) {
-      if(arg().mustDo("daemon")) {
+    if(::arg().mustDo("guardian") && !isGuarded(argv)) {
+      if(::arg().mustDo("daemon")) {
 	L.toConsole(Logger::Critical);
 	daemonize();
       }
@@ -445,7 +445,7 @@
       cerr<<"Um, we did get here!"<<endl;
     }
 
-    if(arg().mustDo("version")) {
+    if(::arg().mustDo("version")) {
       cerr<<"Version: "VERSION", compiled on "<<__DATE__", "__TIME__;
 #ifdef __GNUC__ 
       cerr<<" with gcc version "<<__VERSION__;
@@ -457,27 +457,27 @@
     // we really need to do work - either standalone or as an instance
     
     loadModules();
-    BackendMakers().launch(arg()["launch"]); // vrooooom!
+    BackendMakers().launch(::arg()["launch"]); // vrooooom!
 
-    if(!arg().getCommands().empty()) {
+    if(!::arg().getCommands().empty()) {
       cerr<<"Fatal: non-option on the command line, perhaps a '--setting=123' statement missed the '='?"<<endl;
       exit(99);
     }
 
 
     
-    if(arg().mustDo("help")) {
+    if(::arg().mustDo("help")) {
       cerr<<"syntax:"<<endl<<endl;
-      cerr<<arg().helpstring(arg()["help"])<<endl;
+      cerr<<::arg().helpstring(::arg()["help"])<<endl;
       exit(99);
     }
     
-    if(arg().mustDo("config")) {
-      cout<<arg().configstring()<<endl;
+    if(::arg().mustDo("config")) {
+      cout<<::arg().configstring()<<endl;
       exit(99);
     }
 
-    if(arg().mustDo("list-modules")) {
+    if(::arg().mustDo("list-modules")) {
       vector<string>modules=BackendMakers().getModules();
       cerr<<"Modules available:"<<endl;
       for(vector<string>::const_iterator i=modules.begin();i!=modules.end();++i)
@@ -486,7 +486,7 @@
       exit(99);
     }
 
-    if(!arg().asNum("local-port")) {
+    if(!::arg().asNum("local-port")) {
       L<<Logger::Error<<"Unable to launch, binding to no port or port 0 makes no sense"<<endl;
       exit(99); // this isn't going to fix itself either
     }
@@ -494,7 +494,7 @@
       L<<Logger::Error<<"Unable to launch, no backends configured for querying"<<endl;
       exit(99); // this isn't going to fix itself either
     }    
-    if(arg().mustDo("daemon")) {
+    if(::arg().mustDo("daemon")) {
       L.toConsole(Logger::None);
       if(!isGuarded(argv))
 	daemonize();
@@ -507,7 +507,7 @@
     else {
       L<<Logger::Warning<<"This is a standalone pdns"<<endl; 
       
-      if(arg().mustDo("control-console"))
+      if(::arg().mustDo("control-console"))
 	dl=new DynListener();
       else
 	dl=new DynListener(s_programname);
@@ -530,13 +530,13 @@
 
     
     // reparse, with error checking
-    if(!arg().mustDo("no-config"))
-      arg().file(configname.c_str());
-    arg().parse(argc,argv);
+    if(!::arg().mustDo("no-config"))
+      ::arg().file(configname.c_str());
+    ::arg().parse(argc,argv);
     UeberBackend::go();
     N=new UDPNameserver; // this fails when we are not root, throws exception
     
-    if(!arg().mustDo("disable-tcp"))
+    if(!::arg().mustDo("disable-tcp"))
       TN=new TCPNameserver; 
   }
   catch(const ArgException &A) {
@@ -563,12 +563,12 @@
     mainthread();
   }
   catch(AhuException &AE) {
-    if(!arg().mustDo("daemon"))
+    if(!::arg().mustDo("daemon"))
       cerr<<"Exiting because: "<<AE.reason<<endl;
     L<<Logger::Error<<"Exiting because: "<<AE.reason<<endl;
   }      
   catch(exception &e) {
-    if(!arg().mustDo("daemon"))
+    if(!::arg().mustDo("daemon"))
       cerr<<"Exiting because of STL error: "<<e.what()<<endl;
     L<<Logger::Error<<"Exiting because of STL error: "<<e.what()<<endl;
   }
diff -urNad trunk~/pdns/resolver.cc trunk/pdns/resolver.cc
--- trunk~/pdns/resolver.cc	2009-01-05 13:15:46.000000000 +0000
+++ trunk/pdns/resolver.cc	2009-01-05 13:15:46.000000000 +0000
@@ -60,14 +60,14 @@
   memset((char *)&sin,0, sizeof(sin));
   
   sin.sin_family = AF_INET;
-  if(!IpToU32(arg()["query-local-address"], &sin.sin_addr.s_addr))
-    throw AhuException("Unable to resolve local address '"+ arg()["query-local-address"] +"'"); 
+  if(!IpToU32(::arg()["query-local-address"], &sin.sin_addr.s_addr))
+    throw AhuException("Unable to resolve local address '"+ ::arg()["query-local-address"] +"'"); 
 
   int tries=10;
   while(--tries) {
     sin.sin_port = htons(10000+(random()%10000));
   
-    if (bind(d_sock, (struct sockaddr *)&sin, sizeof(sin)) >= 0) 
+    if (::bind(d_sock, (struct sockaddr *)&sin, sizeof(sin)) >= 0) 
       break;
 
   }
@@ -203,11 +203,11 @@
     throw ResolverException("Unable to make a TCP socket for resolver: "+stringerror());
 
   // Use query-local-address as source IP for queries, if specified.
-  string querylocaladdress(arg()["query-local-address"]);
+  string querylocaladdress(::arg()["query-local-address"]);
   if (!querylocaladdress.empty()) {
     ComboAddress fromaddr(querylocaladdress, 0);
 
-    if (bind(d_sock, (struct sockaddr *)&fromaddr, fromaddr.getSocklen()) < 0) {
+    if (::bind(d_sock, (struct sockaddr *)&fromaddr, fromaddr.getSocklen()) < 0) {
       Utility::closesocket(d_sock);
       d_sock=-1;
       throw ResolverException("Binding to query-local-address: "+stringerror());
@@ -356,7 +356,7 @@
 
   // d_sock is connected and is about to spit out a packet
   // FIXED, get and pass max request time 
-  struct timeval time_left={arg().asNum("max-tcp-request-time"),0};
+  struct timeval time_left={::arg().asNum("max-tcp-request-time"),0};
   int len=getLength(time_left);
   if(len<0)
     throw ResolverException("EOF trying to read axfr chunk from remote TCP client");
diff -urNad trunk~/pdns/tcpreceiver.cc trunk/pdns/tcpreceiver.cc
--- trunk~/pdns/tcpreceiver.cc	2009-01-05 13:15:46.000000000 +0000
+++ trunk/pdns/tcpreceiver.cc	2009-01-05 13:15:46.000000000 +0000
@@ -203,7 +203,7 @@
   Utility::setNonBlocking(sock);
   ServiceTuple st;
   st.port=53;
-  parseService(arg()["recursor"],st);
+  parseService(::arg()["recursor"],st);
 
   try {
     ComboAddress recursor(st.host, st.port);
@@ -252,7 +252,7 @@
     
     for(;;) {
       // FIXED, getting max request value
-      struct timeval time_left={arg().asNum("max-tcp-request-time"),0};
+      struct timeval time_left={::arg().asNum("max-tcp-request-time"),0};
       ComboAddress remote;
       socklen_t remotelen=sizeof(remote);
       if(getpeername(fd, (struct sockaddr *)&remote, &remotelen) < 0) {
@@ -351,10 +351,10 @@
 
 bool TCPNameserver::canDoAXFR(shared_ptr<DNSPacket> q)
 {
-  if(arg().mustDo("disable-axfr"))
+  if(::arg().mustDo("disable-axfr"))
     return false;
 
-  if( arg()["allow-axfr-ips"].empty() || d_ng.match( (ComboAddress *) &q->remote ) )
+  if( ::arg()["allow-axfr-ips"].empty() || d_ng.match( (ComboAddress *) &q->remote ) )
     return true;
 
   extern CommunicatorClass Communicator;
@@ -452,7 +452,7 @@
 
   int count=0;
   int chunk=100; // FIXME: this should probably be autosizing
-  if(arg().mustDo("strict-rfc-axfrs"))
+  if(::arg().mustDo("strict-rfc-axfrs"))
     chunk=1;
 
   outpacket=shared_ptr<DNSPacket>(q->replyPacket());
@@ -496,15 +496,15 @@
 
 TCPNameserver::TCPNameserver()
 {
-//  sem_init(&d_connectionroom_sem,0,arg().asNum("max-tcp-connections"));
-  d_connectionroom_sem = new Semaphore( arg().asNum( "max-tcp-connections" ));
+//  sem_init(&d_connectionroom_sem,0,::arg().asNum("max-tcp-connections"));
+  d_connectionroom_sem = new Semaphore( ::arg().asNum( "max-tcp-connections" ));
 
-  s_timeout=arg().asNum("tcp-idle-timeout");
+  s_timeout=::arg().asNum("tcp-idle-timeout");
   vector<string>locals;
-  stringtok(locals,arg()["local-address"]," ,");
+  stringtok(locals,::arg()["local-address"]," ,");
 
   vector<string>locals6;
-  stringtok(locals6,arg()["local-ipv6"]," ,");
+  stringtok(locals6,::arg()["local-ipv6"]," ,");
 
   if(locals.empty() && locals6.empty())
     throw AhuException("No local address specified");
@@ -512,7 +512,7 @@
   d_highfd=0;
 
   vector<string> parts;
-  stringtok( parts, arg()["allow-axfr-ips"], ", \t" ); // is this IP on the guestlist?
+  stringtok( parts, ::arg()["allow-axfr-ips"], ", \t" ); // is this IP on the guestlist?
   for( vector<string>::const_iterator i = parts.begin(); i != parts.end(); ++i ) {
     d_ng.addMask( *i );
   }
@@ -528,7 +528,7 @@
     if(s<0) 
       throw AhuException("Unable to acquire TCP socket: "+stringerror());
 
-    ComboAddress local(*laddr, arg().asNum("local-port"));
+    ComboAddress local(*laddr, ::arg().asNum("local-port"));
       
     int tmp=1;
     if(setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char*)&tmp,sizeof tmp)<0) {
@@ -536,7 +536,7 @@
       exit(1);  
     }
 
-    if(bind(s, (sockaddr*)&local, local.getSocklen())<0) {
+    if(::bind(s, (sockaddr*)&local, local.getSocklen())<0) {
       L<<Logger::Error<<"binding to TCP socket: "<<strerror(errno)<<endl;
       throw AhuException("Unable to bind to TCP socket");
     }
@@ -555,7 +555,7 @@
     if(s<0) 
       throw AhuException("Unable to acquire TCPv6 socket: "+stringerror());
 
-    ComboAddress local(*laddr, arg().asNum("local-port"));
+    ComboAddress local(*laddr, ::arg().asNum("local-port"));
 
     int tmp=1;
     if(setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char*)&tmp,sizeof tmp)<0) {

--- End Message ---
--- Begin Message ---
On Mon, 2009-01-05 at 15:07 +0100, Stephan S� wrote:
> Package: pdns
> Severity: wishlist
> Tags: patch
> 
> Hi pdns maintainers,
> 
> the attached dpatch
> 
> ## DP: Allows multi-index packet cache.
> ## DP:
> ## DP: Note that this patch also fixes/worksaround some "C++ programmer 
> blackouts"
> ## DP: that should eventually be cleaned up upstream:
> ## DP: - Works around hilarious "#define L" in header files (effectiveley 
> breaking boost template includes in our case).
> ## DP: - Cleans up some C++ namespace issues with boost (most likely due to 
> lame "use namespace"-things for boost)
> ## DP:   by adding top level namespace "::" where ambigiuous.
> 
> is used here (UI) to improve pdns. It applies cleanly to 2.9.21.2-1
> after the existing dpatches.

this patch does not apply any more for upstream 2.9.22, and won't be
updated, so I am closing this bug.

Sorry for the noise,

Stephan
-- 
Stephan Sürken <absurd at debian.org>


--- End Message ---

Reply via email to