]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
make dnsscan accept multiple files
authorBert Hubert <bert.hubert@netherlabs.nl>
Mon, 24 Apr 2006 07:29:38 +0000 (07:29 +0000)
committerBert Hubert <bert.hubert@netherlabs.nl>
Mon, 24 Apr 2006 07:29:38 +0000 (07:29 +0000)
move auth nameserver over to ComboAddress

git-svn-id: svn://svn.powerdns.com/pdns/trunk/pdns@762 d19b8d6e-7fed-0310-83ef-9ca221ded41b

14 files changed:
pdns/common_startup.cc
pdns/communicator.cc
pdns/dnspacket.cc
pdns/dnspacket.hh
pdns/dnsproxy.cc
pdns/dnsscan.cc
pdns/iputils.hh
pdns/nameserver.cc
pdns/nameserver.hh
pdns/resolver.cc
pdns/resolver.hh
pdns/syncres.cc
pdns/tcpreceiver.cc
pdns/tcpreceiver.hh

index 05d30c59fa71af89a664f9658ad1fa3a85d6226e..bd234619e7750105f5c029d966940b0697225fa2 100644 (file)
@@ -238,7 +238,7 @@ void *qthread(void *p)
     S.ringAccount("remotes",P->getRemote());
 
     if((P->d.opcode != Opcode::Notify) && PC.get(P,&cached)) { // short circuit - does the PacketCache recognize this question?
-      cached.setRemote((struct sockaddr *)(P->remote),P->d_socklen);  // inlined
+      cached.setRemote(&P->remote);  // inlined
       cached.setSocket(P->getSocket());                               // inlined
       cached.spoofID(P->d.id);                                        // inlined 
       cached.d.rd=P->d.rd; // copy in recursion desired bit 
index ac63a5ceee877bf63db075acad0caee9a45457db..bb001e8d890e6b90aab8d1a7425e2fc5111e8674 100644 (file)
@@ -290,7 +290,7 @@ void CommunicatorClass::slaveRefresh(PacketHandler *P)
 
 int CommunicatorClass::doNotifications()
 {
-  struct sockaddr_in from;
+  ComboAddress from;
   Utility::socklen_t fromlen=sizeof(from);
   char buffer[1500];
   int size;
@@ -300,7 +300,7 @@ int CommunicatorClass::doNotifications()
   while((size=recvfrom(d_nsock,buffer,sizeof(buffer),0,(struct sockaddr *)&from,&fromlen))>0) {
     DNSPacket p;
 
-    p.setRemote((struct sockaddr *)&from, fromlen);
+    p.setRemote(&from);
 
     if(p.parse(buffer,size)<0) {
       L<<Logger::Warning<<"Unable to parse SOA notification answer from "<<p.getRemote()<<endl;
index ca227ca1847a12024e1b0f5faa575bbf07bb4884..f88c51179e17b23da484d442f7c26ba71bba2a64 100644 (file)
@@ -56,20 +56,18 @@ string DNSPacket::getLocal() const
   int addrlen=sizeof(sa);
 
   getsockname(d_socket, (struct sockaddr *)&sa, (socklen_t *)&addrlen);
-  return sockAddrToString(&sa);
+  return sockAddrToString((struct sockaddr_in*)&sa);
 }
 
 
 string DNSPacket::getRemote() const
 {
-  return sockAddrToString((struct sockaddr_in *)remote);
+  return remote.toString();
 }
 
 uint16_t DNSPacket::getRemotePort() const
 {
-  if(d_socklen==sizeof(sockaddr_in))
-    return ((struct sockaddr_in*)remote)->sin_port;
-  return 0;
+  return remote.sin4.sin_port;
 }
 
 void DNSPacket::trim()
@@ -83,7 +81,7 @@ DNSPacket::DNSPacket(const DNSPacket &orig)
 {
   DLOG(L<<"DNSPacket copy constructor called!"<<endl);
   d_socket=orig.d_socket;
-  memcpy(remote, orig.remote, sizeof(remote));
+  remote=orig.remote;
   len=orig.len;
   d_qlen=orig.d_qlen;
   d_dt=orig.d_dt;
@@ -1400,7 +1398,7 @@ DNSPacket *DNSPacket::replyPacket() const
   DNSPacket *r=new DNSPacket;
   r->setSocket(d_socket);
 
-  r->setRemote((struct sockaddr *)remote, d_socklen);
+  r->setRemote(&remote);
   r->setAnswer(true);  // this implies the allocation of the header
   r->setA(true); // and we are authoritative
   r->setRA(0); // no recursion available
index 94083cc210f83452c8619927cdc33f116c3cb5cb..61b4b89612e7c8fc3d1181bad976c413fd306278 100644 (file)
@@ -31,6 +31,7 @@
 #include <cstring>
 #include <cstdlib>
 #include <sys/types.h>
+#include "iputils.hh"
 
 #ifndef WIN32
 #include <sys/socket.h>
@@ -115,7 +116,7 @@ public:
     unsigned int arcount:16;  //!< number of additional resource records
   };
 
-  inline void setRemote(const struct sockaddr *a, Utility::socklen_t socklen);
+  inline void setRemote(const ComboAddress*);
   string getLocal() const;
   string getRemote() const;
   uint16_t getRemotePort() const;
@@ -238,7 +239,7 @@ public:
 
   //////// DATA !
 
-  char remote[sizeof(sockaddr_in6)];
+  ComboAddress remote;
   Utility::socklen_t d_socklen; // 4
   uint16_t len; //!< length of the raw binary packet 2
   uint16_t qclass;  //!< class of the question - should always be INternet 2
@@ -333,13 +334,9 @@ int DNSPacket::parse(const char *mesg, int length)
 }
 
 //! Use this to set where this packet was received from or should be sent to
-inline void DNSPacket::setRemote(const struct sockaddr *s, Utility::socklen_t socklen)
+inline void DNSPacket::setRemote(const ComboAddress *s)
 {
-  if(socklen>(Utility::socklen_t)sizeof(remote))
-    throw AhuException("Address too long for storage: "+itoa(socklen));
-
-  memcpy((void *)remote,(void *)s,socklen);
-  d_socklen=socklen;
+  remote=*s;
 }
 
 inline void DNSPacket::spoofID(uint16_t id)
index d5dd3bb068234695626f7a0d77506ff6435eeb53..2feaec61d35f6d5616bd6e2ee37adbe987bf4545 100644 (file)
@@ -93,7 +93,7 @@ void DNSProxy::onlyFrom(const string &ips)
 
 bool DNSProxy::recurseFor(DNSPacket* p)
 {
-  return d_ng.match((struct sockaddr_in *)&p->remote);
+  return d_ng.match((ComboAddress *)&p->remote);
 }
 
 /** returns false if p->remote is not allowed to recurse via us */
index 26191eab2d5e238dd4927294f0380ecb55fad91f..2d916ebf54ceac62768dd3c26644149dd95969bf 100644 (file)
@@ -26,34 +26,44 @@ StatBag S;
 int main(int argc, char** argv)
 try
 {
-  PcapPacketReader pr(argv[1]);
   Socket sock(InterNetwork, Datagram);
 
+  /*
   IPEndpoint remote(argc > 2 ? argv[2] : "127.0.0.1", 
                    argc > 3 ? atoi(argv[3]) : 5300);
 
+  */
 
-  while(pr.getUDPPacket()) {
-    try {
-      MOADNSParser mdp((const char*)pr.d_payload, pr.d_len);
-      for(int i=0; i < mdp.d_qname.length(); ++i)
-       if(!isalnum(mdp.d_qname[i]) && mdp.d_qname[i]!='.' && mdp.d_qname[i]!='-' && mdp.d_qname[i]!='_') {
-         //      cout<<mdp.d_qname<<"|"<<mdp.d_qtype<<"|"<<mdp.d_qclass<<"\n";
-         // sock.sendTo(string(pr.d_payload, pr.d_payload + pr.d_len), remote);
-         break;
+  if(argc<2) {
+    cerr<<"Syntax: dnsscan file1 [file2 ..] "<<endl;
+    exit(1);
+  }
+    
+  for(int n=1; n < argc; ++n) {
+    PcapPacketReader pr(argv[n]);
+    
+    while(pr.getUDPPacket()) {
+      try {
+       MOADNSParser mdp((const char*)pr.d_payload, pr.d_len);
+       for(int i=0; i < mdp.d_qname.length(); ++i)
+         if(!isalnum(mdp.d_qname[i]) && mdp.d_qname[i]!='.' && mdp.d_qname[i]!='-' && mdp.d_qname[i]!='_') {
+           //    cout<<mdp.d_qname<<"|"<<mdp.d_qtype<<"|"<<mdp.d_qclass<<"\n";
+           // sock.sendTo(string(pr.d_payload, pr.d_payload + pr.d_len), remote);
+           break;
+         }
+       if(mdp.d_qtype > 256 || mdp.d_qclass!=1 ) {
+         //    sock.sendTo(string(pr.d_payload, pr.d_payload + pr.d_len), remote);
+         
        }
-      if(mdp.d_qtype > 256 || mdp.d_qclass!=1 ) {
-       //      sock.sendTo(string(pr.d_payload, pr.d_payload + pr.d_len), remote);
-
+       for(MOADNSParser::answers_t::const_iterator i=mdp.d_answers.begin(); i!=mdp.d_answers.end(); ++i) {          
+         
+       }
+       
       }
-      for(MOADNSParser::answers_t::const_iterator i=mdp.d_answers.begin(); i!=mdp.d_answers.end(); ++i) {          
-
+      catch(MOADNSException &e) {
+       cout<<"Error from remote "<<U32ToIP(ntohl(*((uint32_t*)&pr.d_ip->ip_src)))<<": "<<e.what()<<"\n";
+       //      sock.sendTo(string(pr.d_payload, pr.d_payload + pr.d_len), remote);
       }
-
-    }
-    catch(MOADNSException &e) {
-      cout<<"Error: "<<e.what()<<"\n";
-      sock.sendTo(string(pr.d_payload, pr.d_payload + pr.d_len), remote);
     }
   }
 }
index 69ee27c4ce51709b3230a87f73ecf8cbcd58d21a..2612097c7b5e86bfbabcefec296a5d537b4bbc16 100644 (file)
@@ -1,6 +1,6 @@
 /*
     PowerDNS Versatile Database Driven Nameserver
-    Copyright (C) 2002  PowerDNS.COM BV
+    Copyright (C) 2002 - 2006  PowerDNS.COM BV
 
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License version 2
@@ -31,6 +31,7 @@
 #include <stdio.h>
 #include <functional>
 #include "ahuexception.hh"
+#include "misc.hh"
 
 using namespace std;
 
index 7b79661d122f56d141aa7e8bb0bcce8863e8f84d..7485005597bdeca7c34441568be1a5beef66f701 100644 (file)
@@ -196,12 +196,12 @@ void UDPNameserver::send(DNSPacket *p)
     p=new DNSPacket(*p);
     p->truncate(512);
     buffer=p->getData();
-    if(sendto(p->getSocket(),buffer,p->len,0,(struct sockaddr *)(p->remote),p->d_socklen)<0) 
+    if(sendto(p->getSocket(),buffer,p->len,0,(struct sockaddr *)(&p->remote),p->d_socklen)<0) 
       L<<Logger::Error<<"Error sending reply with sendto (socket="<<p->getSocket()<<"): "<<strerror(errno)<<endl;
     delete p;
   }
   else {
-    if(sendto(p->getSocket(),buffer,p->len,0,(struct sockaddr *)(p->remote),p->d_socklen)<0)
+    if(sendto(p->getSocket(),buffer,p->len,0,(struct sockaddr *)(&p->remote),p->d_socklen)<0)
       L<<Logger::Error<<"Error sending reply with sendto (socket="<<p->getSocket()<<"): "<<strerror(errno)<<endl;
   }
 }
index 14f04df545f2040dee73ac0b53f2df3541ea1c58..e094f12314938b03ff7ddc53ec8b9832b517a3ff 100644 (file)
@@ -85,7 +85,7 @@ private:
 
 inline DNSPacket *UDPNameserver::receive(DNSPacket *prefilled)
 {
-  char remote[ sizeof(sockaddr_in6) ];
+  ComboAddress remote;
   extern StatBag S;
 
   Utility::socklen_t addrlen;
@@ -93,7 +93,7 @@ inline DNSPacket *UDPNameserver::receive(DNSPacket *prefilled)
   char mesg[513];
   Utility::sock_t sock=-1;
 
-  memset( remote, 0, sizeof( remote ));
+  memset( &remote, 0, sizeof( remote ));
   addrlen=sizeof(remote);  
   if(d_sockets.size()>1) {
     fd_set rfds=d_rfds;
@@ -109,7 +109,7 @@ inline DNSPacket *UDPNameserver::receive(DNSPacket *prefilled)
 
        // XXX FIXME this code could be using recvmsg + ip_pktinfo on platforms that support it
        
-       if((len=recvfrom(sock,mesg,sizeof(mesg)-1,0,(sockaddr*) remote, &addrlen))<0) {
+       if((len=recvfrom(sock,mesg,sizeof(mesg)-1,0,(sockaddr*) &remote, &addrlen))<0) {
          L<<Logger::Error<<"recvfrom gave error, ignoring: "<<strerror(errno)<<endl;
          return 0;
        }
@@ -123,13 +123,13 @@ inline DNSPacket *UDPNameserver::receive(DNSPacket *prefilled)
     sock=d_sockets[0];
 
     len=0;
-    if((len=recvfrom(sock,mesg,512,0,(sockaddr*) remote, &addrlen))<0) {
+    if((len=recvfrom(sock,mesg,512,0,(sockaddr*) &remote, &addrlen))<0) {
       L<<Logger::Error<<"recvfrom gave error, ignoring: "<<strerror(errno)<<endl;
       return 0;
     }
   }
   
-  DLOG(L<<"Received a packet " << len <<" bytes long from "<<inet_ntoa( reinterpret_cast< sockaddr_in * >( &remote )->sin_addr )<<endl);
+  DLOG(L<<"Received a packet " << len <<" bytes long from "<< remote.toString()<<endl);
   
   DNSPacket *packet;
   if(prefilled)  // they gave us a preallocated packet
@@ -138,7 +138,7 @@ inline DNSPacket *UDPNameserver::receive(DNSPacket *prefilled)
     packet=new DNSPacket; // don't forget to free it!
   packet->d_dt.set(); // timing
   packet->setSocket(sock);
-  packet->setRemote((struct sockaddr *)remote, addrlen);
+  packet->setRemote(&remote);
   if(packet->parse(mesg, len)<0) {
     S.inc("corrupt-packets");
     S.ringAccount("remotes-corrupt", packet->getRemote());
index 90e9f990a0bc0b888205e9000323b8f9d7c62d5b..2ccb1a597654f29205e6d9b074c5f0b493098d68 100644 (file)
@@ -232,10 +232,10 @@ void Resolver::makeTCPSocket(const string &ip, uint16_t port)
 
   struct in_addr inp;
   Utility::inet_aton(ip.c_str(),&inp);
-  d_toaddr.sin_addr.s_addr=inp.s_addr;
+  d_toaddr.sin4.sin_addr.s_addr=inp.s_addr;
 
-  d_toaddr.sin_port=htons(port);
-  d_toaddr.sin_family=AF_INET;
+  d_toaddr.sin4.sin_port=htons(port);
+  d_toaddr.sin4.sin_family=AF_INET;
 
   d_sock=socket(AF_INET,SOCK_STREAM,0);
   if(d_sock<0)
@@ -417,7 +417,7 @@ Resolver::res_t Resolver::result()
 {
   try {
     DNSPacket p;
-    p.setRemote((const sockaddr*)&d_toaddr, sizeof(d_toaddr));
+    p.setRemote(&d_toaddr);
     p.d_tcp = d_inaxfr; // fixes debian bug 330184
     if(p.parse((char *)d_buf, d_len)<0)
       throw ResolverException("resolver: unable to parse packet of "+itoa(d_len)+" bytes");
index f81b9a6a05ce3cd012c457902ce4c9af955be9cb..8c13f784e33f60340e354f21c4497c8db840df3b 100644 (file)
@@ -1,6 +1,6 @@
 /*
     PowerDNS Versatile Database Driven Nameserver
-    Copyright (C) 2002  PowerDNS.COM BV
+    Copyright (C) 2002 - 2006  PowerDNS.COM BV
 
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License version 2
@@ -20,7 +20,7 @@
 #include <string>
 #include <vector>
 #include <sys/types.h>
-
+#include "iputils.hh"
 #ifndef WIN32
 
 # include <arpa/nameser.h>
@@ -85,6 +85,6 @@ private:
   int d_timeout;
   uint32_t d_ip;
   bool d_inaxfr;
-  struct sockaddr_in d_toaddr;
+  ComboAddress d_toaddr;
 };
 
index 9646e32741561f5eb13bd9308475d1d07782c6e6..7fac6225ff864baf45b9cdc65fae245807c930d7 100644 (file)
@@ -94,7 +94,7 @@ int SyncRes::beginResolve(const string &qname, const QType &qtype, uint16_t qcla
     return -1;
   
   set<GetBestNSAnswer> beenthere;
-  int res=doResolve(qname, qtype, ret,0,beenthere);
+  int res=doResolve(qname, qtype, ret, 0, beenthere);
   if(!res)
     addCruft(qname, ret);
   return res;
index ea57270f3ca774a0c4f56ae5e45cd353b6de960f..99aa3fb8e4f9ccc35482a6c99cda1efa2a388e21 100644 (file)
@@ -84,7 +84,7 @@ void *TCPNameserver::launcher(void *data)
 }
 
 
-int TCPNameserver::readLength(int fd, struct sockaddr_in *remote)
+int TCPNameserver::readLength(int fd, ComboAddress *remote)
 {
   int bytesLeft=2;
   unsigned char buf[2];
@@ -95,13 +95,13 @@ int TCPNameserver::readLength(int fd, struct sockaddr_in *remote)
   while(bytesLeft) {
     int ret=waitForData(fd, s_timeout);
     if(ret<0)
-      throw AhuException("Waiting on data from remote TCP client "+string(inet_ntoa(remote->sin_addr))+": "+stringerror());
+      throw AhuException("Waiting on data from remote TCP client "+remote->toString()+": "+stringerror());
   
     ret=recv(fd, reinterpret_cast< char * >( buf ) +2-bytesLeft, bytesLeft,0);
     if(ret<0)
-      throw AhuException("Trying to read data from remote TCP client "+string(inet_ntoa(remote->sin_addr))+": "+stringerror());
+      throw AhuException("Trying to read data from remote TCP client "+remote->toString()+": "+stringerror());
     if(!ret) {
-      DLOG(L<<"Remote TCP client "+string(inet_ntoa(remote->sin_addr))+" closed connection");
+      DLOG(L<<"Remote TCP client "+remote->toString()+" closed connection");
       return -1;
     }
     bytesLeft-=ret;
@@ -109,7 +109,7 @@ int TCPNameserver::readLength(int fd, struct sockaddr_in *remote)
   return buf[0]*256+buf[1];
 }
 
-void TCPNameserver::getQuestion(int fd, char *mesg, int pktlen, const struct sockaddr_in &remote)
+void TCPNameserver::getQuestion(int fd, char *mesg, int pktlen, const ComboAddress &remote)
 {
   int ret=0, bytesread=0;
   while(bytesread<pktlen) {
@@ -122,9 +122,9 @@ void TCPNameserver::getQuestion(int fd, char *mesg, int pktlen, const struct soc
 
  err:;
   if(ret<0) 
-    throw AhuException("Error reading DNS data from TCP client "+string(inet_ntoa(remote.sin_addr))+": "+stringerror());
+    throw AhuException("Error reading DNS data from TCP client "+remote.toString()+": "+stringerror());
   else 
-    throw AhuException("Remote TCP client "+string(inet_ntoa(remote.sin_addr))+" closed connection");
+    throw AhuException("Remote TCP client "+remote.toString()+" closed connection");
 }
 
 void *TCPNameserver::doConnection(void *data)
@@ -140,14 +140,14 @@ void *TCPNameserver::doConnection(void *data)
     DLOG(L<<"TCP Connection accepted on fd "<<fd<<endl);
     
     for(;;) {
-      struct sockaddr_in remote;
+      ComboAddress remote;
       
       int pktlen=readLength(fd, &remote);
       if(pktlen<0) // EOF
        break;
 
       if(pktlen>511) {
-       L<<Logger::Error<<"Received an overly large question from "<<inet_ntoa(remote.sin_addr)<<", dropping"<<endl;
+       L<<Logger::Error<<"Received an overly large question from "<<remote.toString()<<", dropping"<<endl;
        break;
       }
       
@@ -159,7 +159,7 @@ void *TCPNameserver::doConnection(void *data)
 
       packet=new DNSPacket;
 
-      packet->setRemote((struct sockaddr *)&remote,sizeof(remote));
+      packet->setRemote(&remote);
       packet->d_tcp=true;
       if(packet->parse(mesg, pktlen)<0)
        break;
@@ -198,7 +198,7 @@ void *TCPNameserver::doConnection(void *data)
 
       DNSPacket* cached=new DNSPacket;
       if(!packet->d.rd && (PC.get(packet, cached))) { // short circuit - does the PacketCache recognize this question?
-       cached->setRemote((struct sockaddr *)(packet->remote), sizeof(struct sockaddr_in));
+       cached->setRemote(&packet->remote);
        cached->spoofID(packet->d.id);
        if(sendDelPacket(cached, fd)<0) 
          goto out;
@@ -264,7 +264,7 @@ bool TCPNameserver::canDoAXFR(DNSPacket *q)
   if(arg().mustDo("disable-axfr"))
     return false;
 
-  if( arg()["allow-axfr-ips"].empty() || d_ng.match( (struct sockaddr_in *) &q->remote ) )
+  if( arg()["allow-axfr-ips"].empty() || d_ng.match( (ComboAddress *) &q->remote ) )
     return true;
 
   extern CommunicatorClass Communicator;
index d51448d40e40404909a90b8f242c7206f6a2420b..de25464f3fad0ff3d020fbb5e69548b93587cdde 100644 (file)
@@ -48,8 +48,8 @@ public:
 private:
 
   static int sendDelPacket(DNSPacket *p, int outsock);
-  static int readLength(int fd, struct sockaddr_in *remote);
-  static void getQuestion(int fd, char *mesg, int pktlen, const struct sockaddr_in &remote);
+  static int readLength(int fd, ComboAddress *remote);
+  static void getQuestion(int fd, char *mesg, int pktlen, const ComboAddress& remote);
   static int doAXFR(const string &target, DNSPacket *q, int outsock);
   static bool canDoAXFR(DNSPacket *q);
   static void *doConnection(void *data);