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 <stephan.suer...@1und1.de>
##
## 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) {

Reply via email to