Changeset 1246

Show
Ignore:
Timestamp:
08/03/08 21:21:53 (20 months ago)
Author:
ahu
Message:

implement TCP-based pdns_control with a simple secret, cleanup pdns_control infrastructure in PowerDNS, plus remove chomp() with bugs and replace by boost::trim

Location:
trunk/pdns/pdns
Files:
11 modified

Legend:

Unmodified
Added
Removed
  • trunk/pdns/pdns/common_startup.cc

    r1232 r1246  
    3636  return theArg; 
    3737} 
    38  
    3938 
    4039void declareArguments() 
     
    8281  ::arg().set("allow-axfr-ips","Allow zonetransfers only to these subnets")="0.0.0.0/0"; 
    8382  ::arg().set("slave-cycle-interval","Reschedule failed SOA serial checks once every .. seconds")="60"; 
     83 
     84  ::arg().set("tcp-control-address","If set, PowerDNS can be controlled over TCP on this address")=""; 
     85  ::arg().set("tcp-control-port","If set, PowerDNS can be controlled over TCP on this address")="53000"; 
     86  ::arg().set("tcp-control-secret","If set, PowerDNS can be controlled over TCP after passing this secret")=""; 
     87  ::arg().set("tcp-control-range","If set, remote control of PowerDNS is possible over these networks only")="127.0.0.0/8, 10.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, ::1/128, fe80::/10"; 
    8488   
    8589  ::arg().setSwitch("slave","Act as a slave")="no"; 
  • trunk/pdns/pdns/dynlistener.cc

    r1226 r1246  
    11 /* 
    22    PowerDNS Versatile Database Driven Nameserver 
    3     Copyright (C) 2002 - 2006  PowerDNS.COM BV 
     3    Copyright (C) 2002 - 2008  PowerDNS.COM BV 
    44 
    55    This program is free software; you can redistribute it and/or modify 
     
    2424#include <pthread.h> 
    2525#include <unistd.h> 
    26  
     26#include <boost/algorithm/string.hpp> 
     27#include <boost/shared_ptr.hpp> 
    2728#include <sys/socket.h> 
    2829#include <netinet/in.h> 
     
    3637#include <fcntl.h> 
    3738#include <unistd.h> 
    38  
     39#include <boost/algorithm/string.hpp>  
    3940#include "misc.hh" 
    4041#include "dns.hh" 
     
    4647#include "statbag.hh" 
    4748 
    48  
    49  
    5049extern StatBag S; 
     50 
     51DynListener::g_funkdb_t DynListener::s_funcdb; 
     52DynListener::g_funk_t* DynListener::s_restfunc; 
    5153 
    5254DynListener::~DynListener() 
     
    5658} 
    5759 
    58 DynListener::DynListener(const string &pname) 
    59 { 
    60   d_restfunc=0; 
    61   string programname(pname); 
    62  
    63   if(!programname.empty()) { 
    64     struct sockaddr_un local; 
    65     d_s=socket(AF_UNIX,SOCK_STREAM,0); 
    66  
    67     if(d_s<0) { 
    68       L<<Logger::Error<<"Creating socket for dynlistener: "<<strerror(errno)<<endl;; 
    69       exit(1); 
    70     } 
    71  
    72     int tmp=1; 
    73     if(setsockopt(d_s,SOL_SOCKET,SO_REUSEADDR,(char*)&tmp,sizeof tmp)<0) 
    74       throw AhuException(string("Setsockopt failed: ")+strerror(errno)); 
     60void DynListener::createSocketAndBind(int family, struct sockaddr*local, size_t len) 
     61{ 
     62  d_s=socket(family, SOCK_STREAM,0); 
     63 
     64  if(d_s < 0) { 
     65    L<<Logger::Error<<"Creating socket for dynlistener: "<<strerror(errno)<<endl;; 
     66    exit(1); 
     67  } 
     68   
     69  int tmp=1; 
     70  if(setsockopt(d_s,SOL_SOCKET,SO_REUSEADDR,(char*)&tmp,sizeof tmp)<0) 
     71    throw AhuException(string("Setsockopt failed: ")+strerror(errno)); 
    7572     
     73  if(bind(d_s, local, len) < 0) { 
     74    L<<Logger::Critical<<"Binding to dynlistener: "<<strerror(errno)<<endl; 
     75    exit(1); 
     76  } 
     77 
     78  listen(d_s,10); 
     79} 
     80 
     81void DynListener::listenOnUnixDomain(const string& fname) 
     82{ 
     83  int err=unlink(fname.c_str()); 
     84  if(err < 0 && errno!=ENOENT) { 
     85    L<<Logger::Critical<<"Unable to remove (previous) controlsocket: "<<strerror(errno)<<endl; 
     86    exit(1); 
     87  } 
     88 
     89  struct sockaddr_un local; 
     90  memset(&local,0,sizeof(local)); 
     91  local.sun_family=AF_UNIX; 
     92  strncpy(local.sun_path, fname.c_str(), fname.length()); 
     93   
     94  createSocketAndBind(AF_UNIX, (struct sockaddr*)& local, sizeof(local)); 
     95  d_socketname=fname; 
     96  if(!arg()["setgid"].empty()) { 
     97    if(chown(fname.c_str(),static_cast<uid_t>(-1),Utility::makeGidNumeric(arg()["setgid"]))<0) 
     98      L<<Logger::Error<<"Unable to change group ownership of controlsocket: "<<strerror(errno)<<endl; 
     99    if(chmod(fname.c_str(),0660)<0) 
     100      L<<Logger::Error<<"Unable to change group access mode of controlsocket: "<<strerror(errno)<<endl; 
     101  } 
     102   
     103   
     104  L<<Logger::Warning<<"Listening on controlsocket in '"<<fname<<"'"<<endl; 
     105  d_nonlocal=true; 
     106} 
     107 
     108void DynListener::listenOnTCP(const ComboAddress& local) 
     109{ 
     110  createSocketAndBind(AF_INET, (struct sockaddr*)& local, local.getSocklen()); 
     111  d_socketaddress=local; 
     112  L<<Logger::Warning<<"Listening on controlsocket on '"<<local.toStringWithPort()<<"'"<<endl; 
     113  d_nonlocal=true; 
     114 
     115  if(!::arg()["tcp-control-range"].empty()) { 
     116    vector<string> ips; 
     117    stringtok(ips, ::arg()["tcp-control-range"], ", "); 
     118    L<<Logger::Warning<<"Only allowing TCP control from: "; 
     119    for(vector<string>::const_iterator i = ips.begin(); i!= ips.end(); ++i) { 
     120      d_tcprange.addMask(*i); 
     121      if(i!=ips.begin()) 
     122        L<<Logger::Warning<<", "; 
     123      L<<Logger::Warning<<*i; 
     124    } 
     125    L<<Logger::Warning<<endl; 
     126  } 
     127} 
     128 
     129 
     130DynListener::DynListener(const ComboAddress& local) 
     131{ 
     132  listenOnTCP(local); 
     133  d_tcp=true; 
     134} 
     135 
     136DynListener::DynListener(const string &progname) 
     137{ 
     138  if(!progname.empty()) { 
    76139    string socketname=arg()["socket-dir"]+"/"; 
    77140    cleanSlashes(socketname); 
     
    84147    } 
    85148     
    86     socketname+=programname+".controlsocket"; 
    87     int err=unlink(socketname.c_str()); 
    88     if(err < 0 && errno!=ENOENT) { 
    89       L<<Logger::Critical<<"Unable to remove (previous) controlsocket: "<<strerror(errno)<<endl; 
    90       exit(1); 
    91     } 
    92     memset(&local,0,sizeof(local)); 
    93     local.sun_family=AF_UNIX; 
    94     strcpy(local.sun_path,socketname.c_str()); 
    95      
    96     if(bind(d_s, (sockaddr*)&local,sizeof(local))<0) { 
    97       L<<Logger::Critical<<"Binding to dynlistener '"<<socketname<<"': "<<strerror(errno)<<endl; 
    98       exit(1); 
    99     } 
    100     d_socketname=socketname; 
    101     if(!arg()["setgid"].empty()) { 
    102       if(chown(socketname.c_str(),static_cast<uid_t>(-1),Utility::makeGidNumeric(arg()["setgid"]))<0) 
    103         L<<Logger::Error<<"Unable to change group ownership of controlsocket: "<<strerror(errno)<<endl; 
    104       if(chmod(socketname.c_str(),0660)<0) 
    105         L<<Logger::Error<<"Unable to change group access mode of controlsocket: "<<strerror(errno)<<endl; 
    106     } 
    107        
    108  
    109     L<<Logger::Warning<<"Listening on controlsocket in '"<<socketname<<"'"<<endl; 
    110     d_udp=true; 
    111     listen(d_s,10); 
     149    socketname+=progname+".controlsocket"; 
     150    listenOnUnixDomain(socketname); 
    112151  } 
    113152  else 
    114     d_udp=false; 
    115  
    116  
     153    d_nonlocal=false; // we listen on stdin! 
     154  d_tcp=false; 
    117155} 
    118156 
     
    136174 
    137175  int len; 
    138      
    139   sockaddr_un remote; 
    140   socklen_t remlen=sizeof(remote); 
    141  
    142   if(d_udp) { 
     176 
     177  ComboAddress remote; 
     178  socklen_t remlen=remote.getSocklen(); 
     179 
     180  if(d_nonlocal) { 
    143181    for(;;) { 
    144182      d_client=accept(d_s,(sockaddr*)&remote,&remlen); 
     
    148186        continue; 
    149187      } 
    150       if((len=recv(d_client, &mesg[0], mesg.size(),0))<0) { 
    151         L<<Logger::Error<<"Unable to receive packet from controlsocket ("<<d_client<<"): "<<strerror(errno)<<endl; 
     188 
     189      boost::shared_ptr<FILE> fp=boost::shared_ptr<FILE>(fdopen(dup(d_client), "r"), fclose); 
     190      if(d_tcp) { 
     191        if(!fgets(&mesg[0], mesg.size(), fp.get())) { 
     192          L<<Logger::Error<<"Unable to receive password from controlsocket ("<<d_client<<"): "<<strerror(errno)<<endl; 
     193          close(d_client); 
     194          continue; 
     195        } 
     196        string password(&mesg[0]); 
     197        boost::trim(password); 
     198        if(password.empty() || password!=arg()["tcp-control-secret"]) { 
     199          L<<Logger::Error<<"Wrong password on TCP control socket"<<endl; 
     200          writen2(d_client, "Wrong password"); 
     201 
     202          close(d_client); 
     203          continue; 
     204        } 
     205      } 
     206      if(!fgets(&mesg[0], mesg.size(), fp.get())) { 
     207        L<<Logger::Error<<"Unable to receive line from controlsocket ("<<d_client<<"): "<<strerror(errno)<<endl; 
    152208        close(d_client); 
    153209        continue; 
    154210      } 
    155211       
    156       if(len == (int)mesg.size()) { 
     212      if(strlen(&mesg[0]) == mesg.size()) { 
    157213        L<<Logger::Error<<"Line on controlsocket ("<<d_client<<") was too long"<<endl; 
    158214        close(d_client); 
    159215        continue; 
    160216      } 
    161  
    162       mesg[len]=0; 
    163217      break; 
    164218    } 
     
    183237void DynListener::sendLine(const string &l) 
    184238{ 
    185   if(d_udp) { 
     239  if(d_nonlocal) { 
    186240    unsigned int sent=0; 
    187241    int ret; 
    188     while(sent<l.length()) { 
    189       ret=send(d_client,l.c_str()+sent,l.length()-sent,0);  
     242    while(sent < l.length()) { 
     243      ret=send(d_client, l.c_str()+sent, l.length()-sent, 0);  
     244 
    190245      if(ret<0 || !ret) { 
    191246        L<<Logger::Error<<"Error sending data to pdns_control: "<<stringerror()<<endl; 
     
    207262void DynListener::registerFunc(const string &name, g_funk_t *gf) 
    208263{ 
    209   d_funcdb[name]=gf; 
     264  s_funcdb[name]=gf; 
    210265} 
    211266 
    212267void DynListener::registerRestFunc(g_funk_t *gf) 
    213268{ 
    214   d_restfunc=gf; 
     269  s_restfunc=gf; 
    215270} 
    216271 
     
    220275    map<string,string> parameters; 
    221276 
    222     for(;;) { 
     277    for(int n=0;;++n) { 
     278      //      cerr<<"Reading new line, "<<d_client<<endl; 
    223279      string line=getLine(); 
    224       chomp(line,"\n"); 
     280      boost::trim_right(line); 
    225281 
    226282      vector<string>parts; 
     
    231287      } 
    232288      parts[0] = toUpper( parts[0] ); 
    233       if(!d_funcdb[parts[0]]) { 
    234         if(d_restfunc)  
    235           sendLine((*d_restfunc)(parts,d_ppid)); 
     289      if(!s_funcdb[parts[0]]) { 
     290        if(s_restfunc)  
     291          sendLine((*s_restfunc)(parts,d_ppid)); 
    236292        else 
    237293          sendLine("Unknown command: '"+parts[0]+"'"); 
     
    239295      } 
    240296 
    241       sendLine((*d_funcdb[parts[0]])(parts,d_ppid)); 
     297      sendLine((*s_funcdb[parts[0]])(parts,d_ppid)); 
    242298    } 
    243299  } 
  • trunk/pdns/pdns/dynlistener.hh

    r681 r1246  
    11/* 
    22    PowerDNS Versatile Database Driven Nameserver 
    3     Copyright (C) 2002 PowerDNS.COM BV 
     3    Copyright (C) 2002 - 2008 PowerDNS.COM BV 
    44 
    55    This program is free software; you can redistribute it and/or modify 
     
    2727#include <iostream> 
    2828#include <sstream> 
    29  
     29#include "iputils.hh" 
     30#include <boost/utility.hpp> 
    3031#ifndef WIN32 
    3132#include <unistd.h> 
     
    3940using namespace std; 
    4041 
    41 class DynListener 
     42class DynListener : public boost::noncopyable 
    4243{ 
    4344public: 
    44   DynListener(const string &pname=""); 
     45  explicit DynListener(const string &pname=""); 
     46  explicit DynListener(const ComboAddress& addr); 
    4547  ~DynListener(); 
    4648  void go(); 
     
    5153  typedef map<string,g_funk_t *> g_funkdb_t; 
    5254   
    53   void registerFunc(const string &name, g_funk_t *gf); 
    54   void registerRestFunc(g_funk_t *gf); 
     55  static void registerFunc(const string &name, g_funk_t *gf); 
     56  static void registerRestFunc(g_funk_t *gf); 
    5557private: 
    56   DynListener(const DynListener &); 
    57   DynListener& operator=(const DynListener &);  
    5858  void sendLine(const string &line); 
    5959  string getLine(); 
     60 
     61  void listenOnUnixDomain(const std::string& fname); 
     62  void listenOnTCP(const ComboAddress&); 
     63  void createSocketAndBind(int family, struct sockaddr*local, size_t len); 
    6064 
    6165#ifndef WIN32 
     
    6670   
    6771  Utility::socklen_t d_addrlen; 
    68  
     72  NetmaskGroup d_tcprange; 
    6973  int d_s; 
    7074  int d_client; 
    7175  pthread_t d_tid; 
    72   bool d_udp; 
     76  bool d_nonlocal; 
     77  bool d_tcp; 
    7378  pid_t d_ppid; 
    7479   
    7580  string d_socketname; 
    76   g_funkdb_t d_funcdb; 
    77   g_funk_t* d_restfunc; 
    78  
     81  ComboAddress d_socketaddress; 
     82  static g_funkdb_t s_funcdb; 
     83  static g_funk_t* s_restfunc; 
    7984}; 
    8085#endif /* PDNS_DYNLISTENER */ 
  • trunk/pdns/pdns/dynloader.cc

    r680 r1246  
    11/* 
    22    PowerDNS Versatile Database Driven Nameserver 
    3     Copyright (C) 2002 - 2005  PowerDNS.COM BV 
     3    Copyright (C) 2002 - 2008  PowerDNS.COM BV 
    44 
    55    This program is free software; you can redistribute it and/or modify 
     
    2828#include <fcntl.h> 
    2929#include <sys/types.h> 
     30#include <boost/shared_ptr.hpp> 
    3031 
    3132#include <sys/stat.h> 
     
    3839#include "misc.hh" 
    3940using namespace std; 
     41using namespace boost; 
    4042 
    4143ArgvMap &arg() 
     
    5759   
    5860  arg().set("socket-dir","Where the controlsocket will live")=LOCALSTATEDIR; 
     61  arg().set("remote-address","Remote address to query"); 
     62  arg().set("remote-port","Remote port to query")="53000"; 
     63  arg().set("secret","Secret needed to connect to remote PowerDNS"); 
     64 
    5965  arg().set("config-name","Name of this virtual configuration - will rename the binary image")=""; 
    6066  arg().set("chroot","")=""; 
     
    9197    string command=commands[0]; 
    9298 
    93     DynMessenger D(localdir,socketname); 
     99    shared_ptr<DynMessenger> D; 
     100    if(arg()["remote-address"].empty()) 
     101      D=shared_ptr<DynMessenger>(new DynMessenger(localdir,socketname)); 
     102    else { 
     103      uint16_t port; 
     104      try { 
     105        port  = lexical_cast<uint16_t>(arg()["remote-port"]); 
     106      } 
     107      catch(...) { 
     108        cerr<<"Unable to convert '"<<port<<"' to a port number for connecting to remote PowerDNS\n"; 
     109        exit(99); 
     110      } 
     111       
     112      D=shared_ptr<DynMessenger>(new DynMessenger(ComboAddress(arg()["remote-address"], port), arg()["secret"])); 
     113    } 
    94114 
    95115    string message; 
     
    122142     
    123143     
    124     if(D.send(message)<0) { 
     144    if(D->send(message)<0) { 
    125145      cerr<<"Error sending command"<<endl; 
    126146      return 1; 
    127147    } 
    128148     
    129     string resp=D.receive(); 
     149    string resp=D->receive(); 
    130150     
    131151    cout<<resp<<endl; 
  • trunk/pdns/pdns/dynmessenger.cc

    r1094 r1246  
    11/* 
    22    PowerDNS Versatile Database Driven Nameserver 
    3     Copyright (C) 2002 PowerDNS.COM BV 
     3    Copyright (C) 2002 - 2008 PowerDNS.COM BV 
    44 
    55    This program is free software; you can redistribute it and/or modify 
     
    6969} 
    7070 
     71DynMessenger::DynMessenger(const ComboAddress& remote, const string &secret) 
     72{ 
     73  *d_local.sun_path=0; 
     74  d_s=socket(AF_INET, SOCK_STREAM,0); 
     75   
     76  if(d_s<0) { 
     77    throw AhuException(string("socket")+strerror(errno)); 
     78  } 
     79   
     80  if(connect(d_s, (sockaddr*)&remote, remote.getSocklen())<0) { 
     81    close(d_s); 
     82    throw AhuException("Unable to connect to remote '"+remote.toStringWithPort()+"': "+string(strerror(errno))); 
     83  } 
     84 
     85  string login=secret+"\n"; 
     86  writen2(d_s, login); 
     87} 
     88 
    7189DynMessenger::~DynMessenger() 
    7290{ 
    73   if(unlink(d_local.sun_path)<0) 
     91  if(*d_local.sun_path && unlink(d_local.sun_path)<0) 
    7492    cerr<<"Warning: unable to unlink local unix domain endpoint: "<<strerror(errno)<<endl; 
    7593  close(d_s); 
     
    7896int DynMessenger::send(const string &msg) const 
    7997{ 
    80   if(::send(d_s,msg.c_str(),msg.size()+1,0)<0) { 
     98  if(writen2(d_s, msg+"\n") < 0) { // sue me 
    8199    perror("sendto"); 
    82100    return -1; 
     
    84102  return 0; 
    85103} 
    86  
    87 /* 
    88        int  recvfrom(int  s,  void  *buf,  size_t len, int flags, 
    89        struct sockaddr *from, socklen_t *fromlen); 
    90 */ 
    91104 
    92105string DynMessenger::receive() const  
  • trunk/pdns/pdns/dynmessenger.hh

    r681 r1246  
    3636 
    3737#include <errno.h> 
     38#include "iputils.hh" 
    3839#include "ahuexception.hh" 
    3940 
    4041using namespace std; 
    4142 
    42 //! The DynMessenger can send messages to UNIX domain sockets 
     43//! The DynMessenger can send messages to UNIX domain sockets and TCP sockets 
    4344class DynMessenger 
    4445{ 
     
    5354 
    5455#endif // WIN32 
    55    
    56  
    5756  DynMessenger(const DynMessenger &); // NOT IMPLEMENTED 
    5857   
     
    6160 
    6261  DynMessenger(const string &ldir, const string &filename);  //!< Create a DynMessenger sending to this file 
     62  DynMessenger(const ComboAddress& remote, const string &password);  //!< Create a DynMessenger sending to this file 
    6363  ~DynMessenger(); 
    6464 
  • trunk/pdns/pdns/misc.cc

    r1088 r1246  
    4343#include <sys/types.h> 
    4444#include "utility.hh" 
     45#include <boost/algorithm/string.hpp> 
     46 
     47int writen2(int fd, const void *buf, size_t count) 
     48{ 
     49  const char *ptr = (char*)buf; 
     50  const char *eptr = ptr + count; 
     51   
     52  int res; 
     53  while(ptr != eptr) { 
     54    res = ::write(fd, ptr, eptr - ptr); 
     55    if(res < 0) { 
     56      if (errno == EAGAIN) 
     57        throw std::runtime_error("used writen2 on non-blocking socket, got EAGAIN"); 
     58      else 
     59        unixDie("failed in writen2"); 
     60    } 
     61    else if (res == 0) 
     62      throw std::runtime_error("could not write all bytes, got eof in writen2"); 
     63     
     64    ptr += res; 
     65  } 
     66   
     67  return count; 
     68} 
     69 
    4570 
    4671string nowTime() 
     
    4873  time_t now=time(0); 
    4974  string t=ctime(&now); 
    50   chomp(t,"\n"); 
     75  boost::trim_right(t); 
    5176  return t; 
    5277} 
  • trunk/pdns/pdns/misc.hh

    r1234 r1246  
    178178} 
    179179 
     180int writen2(int fd, const void *buf, size_t count); 
     181inline int writen2(int fd, const std::string &s) { return writen2(fd, s.data(), s.size()); } 
     182 
     183 
    180184const string toLower(const string &upper); 
    181185const string toLowerCanonic(const string &upper); 
     
    293297} 
    294298 
    295  
    296 inline void chomp( string& line, const string& delim ) 
    297 { 
    298         string::size_type pos; 
    299  
    300         if( ( pos = line.find_last_not_of( delim ) ) != string::npos ) 
    301         { 
    302                 line.resize( pos + 1 ); 
    303         } 
    304 } 
    305  
    306299inline void unixDie(const string &why) 
    307300{ 
  • trunk/pdns/pdns/receiver.cc

    r1232 r1246  
    4040#include <fcntl.h> 
    4141#include <fstream> 
     42#include <boost/algorithm/string.hpp> 
    4243 
    4344#include "config.h" 
     
    6364#include "dnsrecords.hh" 
    6465 
     66 
    6567time_t s_starttime; 
    6668 
     
    154156    response+=mesg; 
    155157  } 
    156   chomp(response,"\n"); 
     158  boost::trim_right(response); 
    157159  return response; 
    158160} 
     
    519521      writePid(); 
    520522    } 
    521     dl->registerFunc("SHOW",&DLShowHandler); 
    522     dl->registerFunc("RPING",&DLPingHandler); 
    523     dl->registerFunc("QUIT",&DLRQuitHandler); 
    524     dl->registerFunc("UPTIME",&DLUptimeHandler); 
    525     dl->registerFunc("NOTIFY-HOST",&DLNotifyHostHandler); 
    526     dl->registerFunc("NOTIFY",&DLNotifyHandler); 
    527     dl->registerFunc("RELOAD",&DLReloadHandler); 
    528     dl->registerFunc("REDISCOVER",&DLRediscoverHandler); 
    529     dl->registerFunc("VERSION",&DLVersionHandler); 
    530     dl->registerFunc("PURGE",&DLPurgeHandler); 
    531     dl->registerFunc("CCOUNTS",&DLCCHandler); 
    532     dl->registerFunc("SET",&DLSettingsHandler); 
    533     dl->registerFunc("RETRIEVE",&DLNotifyRetrieveHandler); 
    534  
    535      
     523    DynListener::registerFunc("SHOW",&DLShowHandler); 
     524    DynListener::registerFunc("RPING",&DLPingHandler); 
     525    DynListener::registerFunc("QUIT",&DLRQuitHandler); 
     526    DynListener::registerFunc("UPTIME",&DLUptimeHandler); 
     527    DynListener::registerFunc("NOTIFY-HOST",&DLNotifyHostHandler); 
     528    DynListener::registerFunc("NOTIFY",&DLNotifyHandler); 
     529    DynListener::registerFunc("RELOAD",&DLReloadHandler); 
     530    DynListener::registerFunc("REDISCOVER",&DLRediscoverHandler); 
     531    DynListener::registerFunc("VERSION",&DLVersionHandler); 
     532    DynListener::registerFunc("PURGE",&DLPurgeHandler); 
     533    DynListener::registerFunc("CCOUNTS",&DLCCHandler); 
     534    DynListener::registerFunc("SET",&DLSettingsHandler); 
     535    DynListener::registerFunc("RETRIEVE",&DLNotifyRetrieveHandler); 
     536 
     537    if(!::arg()["tcp-control-address"].empty()) { 
     538      DynListener* dlTCP=new DynListener(ComboAddress(::arg()["tcp-control-address"], ::arg().asNum("tcp-control-port"))); 
     539      dlTCP->go(); 
     540    } 
     541 
    536542    // reparse, with error checking 
    537543    if(!::arg().mustDo("no-config")) 
  • trunk/pdns/pdns/win32_dynlistener.cc

    r681 r1246  
    3333#include <sys/stat.h> 
    3434#include <fcntl.h> 
    35  
     35#include <boost/algorithm/string.hpp> 
    3636#include "misc.hh" 
    3737#include "dns.hh" 
     
    141141    for(;;) { 
    142142      string line=getLine(); 
    143       chomp(line,"\n"); 
     143      boost::trim_right(line); 
    144144 
    145145      vector<string>parts; 
  • trunk/pdns/pdns/win32_receiver.cc

    r681 r1246  
    243243        dl=new DynListener(s_programname); 
    244244       
    245     dl->registerFunc("SHOW",&DLShowHandler); 
    246     dl->registerFunc("RPING",&DLPingHandler); 
    247     dl->registerFunc("QUIT",&DLRQuitHandler); 
    248     dl->registerFunc("UPTIME",&DLUptimeHandler); 
    249     dl->registerFunc("NOTIFY-HOST",&DLNotifyHostHandler); 
    250     dl->registerFunc("NOTIFY",&DLNotifyHandler); 
    251     dl->registerFunc("RELOAD",&DLReloadHandler); 
    252     dl->registerFunc("REDISCOVER",&DLRediscoverHandler); 
    253     dl->registerFunc("VERSION",&DLVersionHandler); 
    254     dl->registerFunc("PURGE",&DLPurgeHandler); 
    255     dl->registerFunc("CCOUNTS",&DLCCHandler); 
    256     dl->registerFunc("SET",&DLSettingsHandler); 
    257     dl->registerFunc("RETRIEVE",&DLNotifyRetrieveHandler); 
     245    DynListener::registerFunc("SHOW",&DLShowHandler); 
     246    DynListener::registerFunc("RPING",&DLPingHandler); 
     247    DynListener::registerFunc("QUIT",&DLRQuitHandler); 
     248    DynListener::registerFunc("UPTIME",&DLUptimeHandler); 
     249    DynListener::registerFunc("NOTIFY-HOST",&DLNotifyHostHandler); 
     250    DynListener::registerFunc("NOTIFY",&DLNotifyHandler); 
     251    DynListener::registerFunc("RELOAD",&DLReloadHandler); 
     252    DynListener::registerFunc("REDISCOVER",&DLRediscoverHandler); 
     253    DynListener::registerFunc("VERSION",&DLVersionHandler); 
     254    DynListener::registerFunc("PURGE",&DLPurgeHandler); 
     255    DynListener::registerFunc("CCOUNTS",&DLCCHandler); 
     256    DynListener::registerFunc("SET",&DLSettingsHandler); 
     257    DynListener::registerFunc("RETRIEVE",&DLNotifyRetrieveHandler); 
    258258 
    259259