Changeset 762

Show
Ignore:
Timestamp:
04/24/06 09:29:38 (4 years ago)
Author:
ahu
Message:

make dnsscan accept multiple files
move auth nameserver over to ComboAddress?

Location:
trunk/pdns/pdns
Files:
14 modified

Legend:

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

    r686 r762  
    239239 
    240240    if((P->d.opcode != Opcode::Notify) && PC.get(P,&cached)) { // short circuit - does the PacketCache recognize this question? 
    241       cached.setRemote((struct sockaddr *)(P->remote),P->d_socklen);  // inlined 
     241      cached.setRemote(&P->remote);  // inlined 
    242242      cached.setSocket(P->getSocket());                               // inlined 
    243243      cached.spoofID(P->d.id);                                        // inlined  
  • trunk/pdns/pdns/communicator.cc

    r680 r762  
    291291int CommunicatorClass::doNotifications() 
    292292{ 
    293   struct sockaddr_in from; 
     293  ComboAddress from; 
    294294  Utility::socklen_t fromlen=sizeof(from); 
    295295  char buffer[1500]; 
     
    301301    DNSPacket p; 
    302302 
    303     p.setRemote((struct sockaddr *)&from, fromlen); 
     303    p.setRemote(&from); 
    304304 
    305305    if(p.parse(buffer,size)<0) { 
  • trunk/pdns/pdns/dnspacket.cc

    r726 r762  
    5757 
    5858  getsockname(d_socket, (struct sockaddr *)&sa, (socklen_t *)&addrlen); 
    59   return sockAddrToString(&sa); 
     59  return sockAddrToString((struct sockaddr_in*)&sa); 
    6060} 
    6161 
     
    6363string DNSPacket::getRemote() const 
    6464{ 
    65   return sockAddrToString((struct sockaddr_in *)remote); 
     65  return remote.toString(); 
    6666} 
    6767 
    6868uint16_t DNSPacket::getRemotePort() const 
    6969{ 
    70   if(d_socklen==sizeof(sockaddr_in)) 
    71     return ((struct sockaddr_in*)remote)->sin_port; 
    72   return 0; 
     70  return remote.sin4.sin_port; 
    7371} 
    7472 
     
    8482  DLOG(L<<"DNSPacket copy constructor called!"<<endl); 
    8583  d_socket=orig.d_socket; 
    86   memcpy(remote, orig.remote, sizeof(remote)); 
     84  remote=orig.remote; 
    8785  len=orig.len; 
    8886  d_qlen=orig.d_qlen; 
     
    14011399  r->setSocket(d_socket); 
    14021400 
    1403   r->setRemote((struct sockaddr *)remote, d_socklen); 
     1401  r->setRemote(&remote); 
    14041402  r->setAnswer(true);  // this implies the allocation of the header 
    14051403  r->setA(true); // and we are authoritative 
  • trunk/pdns/pdns/dnspacket.hh

    r680 r762  
    3232#include <cstdlib> 
    3333#include <sys/types.h> 
     34#include "iputils.hh" 
    3435 
    3536#ifndef WIN32 
     
    116117  }; 
    117118 
    118   inline void setRemote(const struct sockaddr *a, Utility::socklen_t socklen); 
     119  inline void setRemote(const ComboAddress*); 
    119120  string getLocal() const; 
    120121  string getRemote() const; 
     
    239240  //////// DATA ! 
    240241 
    241   char remote[sizeof(sockaddr_in6)]; 
     242  ComboAddress remote; 
    242243  Utility::socklen_t d_socklen; // 4 
    243244  uint16_t len; //!< length of the raw binary packet 2 
     
    334335 
    335336//! Use this to set where this packet was received from or should be sent to 
    336 inline void DNSPacket::setRemote(const struct sockaddr *s, Utility::socklen_t socklen) 
    337 { 
    338   if(socklen>(Utility::socklen_t)sizeof(remote)) 
    339     throw AhuException("Address too long for storage: "+itoa(socklen)); 
    340  
    341   memcpy((void *)remote,(void *)s,socklen); 
    342   d_socklen=socklen; 
     337inline void DNSPacket::setRemote(const ComboAddress *s) 
     338{ 
     339  remote=*s; 
    343340} 
    344341 
  • trunk/pdns/pdns/dnsproxy.cc

    r726 r762  
    9494bool DNSProxy::recurseFor(DNSPacket* p) 
    9595{ 
    96   return d_ng.match((struct sockaddr_in *)&p->remote); 
     96  return d_ng.match((ComboAddress *)&p->remote); 
    9797} 
    9898 
  • trunk/pdns/pdns/dnsscan.cc

    r761 r762  
    2727try 
    2828{ 
    29   PcapPacketReader pr(argv[1]); 
    3029  Socket sock(InterNetwork, Datagram); 
    3130 
     31  /* 
    3232  IPEndpoint remote(argc > 2 ? argv[2] : "127.0.0.1",  
    3333                    argc > 3 ? atoi(argv[3]) : 5300); 
    3434 
     35  */ 
    3536 
    36   while(pr.getUDPPacket()) { 
    37     try { 
    38       MOADNSParser mdp((const char*)pr.d_payload, pr.d_len); 
    39       for(int i=0; i < mdp.d_qname.length(); ++i) 
    40         if(!isalnum(mdp.d_qname[i]) && mdp.d_qname[i]!='.' && mdp.d_qname[i]!='-' && mdp.d_qname[i]!='_') { 
    41           //      cout<<mdp.d_qname<<"|"<<mdp.d_qtype<<"|"<<mdp.d_qclass<<"\n"; 
    42           // sock.sendTo(string(pr.d_payload, pr.d_payload + pr.d_len), remote); 
    43           break; 
     37  if(argc<2) { 
     38    cerr<<"Syntax: dnsscan file1 [file2 ..] "<<endl; 
     39    exit(1); 
     40  } 
     41     
     42  for(int n=1; n < argc; ++n) { 
     43    PcapPacketReader pr(argv[n]); 
     44     
     45    while(pr.getUDPPacket()) { 
     46      try { 
     47        MOADNSParser mdp((const char*)pr.d_payload, pr.d_len); 
     48        for(int i=0; i < mdp.d_qname.length(); ++i) 
     49          if(!isalnum(mdp.d_qname[i]) && mdp.d_qname[i]!='.' && mdp.d_qname[i]!='-' && mdp.d_qname[i]!='_') { 
     50            //    cout<<mdp.d_qname<<"|"<<mdp.d_qtype<<"|"<<mdp.d_qclass<<"\n"; 
     51            // sock.sendTo(string(pr.d_payload, pr.d_payload + pr.d_len), remote); 
     52            break; 
     53          } 
     54        if(mdp.d_qtype > 256 || mdp.d_qclass!=1 ) { 
     55          //    sock.sendTo(string(pr.d_payload, pr.d_payload + pr.d_len), remote); 
     56           
    4457        } 
    45       if(mdp.d_qtype > 256 || mdp.d_qclass!=1 ) { 
     58        for(MOADNSParser::answers_t::const_iterator i=mdp.d_answers.begin(); i!=mdp.d_answers.end(); ++i) {           
     59           
     60        } 
     61         
     62      } 
     63      catch(MOADNSException &e) { 
     64        cout<<"Error from remote "<<U32ToIP(ntohl(*((uint32_t*)&pr.d_ip->ip_src)))<<": "<<e.what()<<"\n"; 
    4665        //      sock.sendTo(string(pr.d_payload, pr.d_payload + pr.d_len), remote); 
    47  
    4866      } 
    49       for(MOADNSParser::answers_t::const_iterator i=mdp.d_answers.begin(); i!=mdp.d_answers.end(); ++i) {           
    50  
    51       } 
    52  
    53     } 
    54     catch(MOADNSException &e) { 
    55       cout<<"Error: "<<e.what()<<"\n"; 
    56       sock.sendTo(string(pr.d_payload, pr.d_payload + pr.d_len), remote); 
    5767    } 
    5868  } 
  • trunk/pdns/pdns/iputils.hh

    r731 r762  
    11/* 
    22    PowerDNS Versatile Database Driven Nameserver 
    3     Copyright (C) 2002 PowerDNS.COM BV 
     3    Copyright (C) 2002 - 2006 PowerDNS.COM BV 
    44 
    55    This program is free software; you can redistribute it and/or modify 
     
    3232#include <functional> 
    3333#include "ahuexception.hh" 
     34#include "misc.hh" 
    3435 
    3536using namespace std; 
  • trunk/pdns/pdns/nameserver.cc

    r680 r762  
    197197    p->truncate(512); 
    198198    buffer=p->getData(); 
    199     if(sendto(p->getSocket(),buffer,p->len,0,(struct sockaddr *)(p->remote),p->d_socklen)<0)  
     199    if(sendto(p->getSocket(),buffer,p->len,0,(struct sockaddr *)(&p->remote),p->d_socklen)<0)  
    200200      L<<Logger::Error<<"Error sending reply with sendto (socket="<<p->getSocket()<<"): "<<strerror(errno)<<endl; 
    201201    delete p; 
    202202  } 
    203203  else { 
    204     if(sendto(p->getSocket(),buffer,p->len,0,(struct sockaddr *)(p->remote),p->d_socklen)<0) 
     204    if(sendto(p->getSocket(),buffer,p->len,0,(struct sockaddr *)(&p->remote),p->d_socklen)<0) 
    205205      L<<Logger::Error<<"Error sending reply with sendto (socket="<<p->getSocket()<<"): "<<strerror(errno)<<endl; 
    206206  } 
  • trunk/pdns/pdns/nameserver.hh

    r680 r762  
    8686inline DNSPacket *UDPNameserver::receive(DNSPacket *prefilled) 
    8787{ 
    88   char remote[ sizeof(sockaddr_in6) ]; 
     88  ComboAddress remote; 
    8989  extern StatBag S; 
    9090 
     
    9494  Utility::sock_t sock=-1; 
    9595 
    96   memset( remote, 0, sizeof( remote )); 
     96  memset( &remote, 0, sizeof( remote )); 
    9797  addrlen=sizeof(remote);   
    9898  if(d_sockets.size()>1) { 
     
    110110        // XXX FIXME this code could be using recvmsg + ip_pktinfo on platforms that support it 
    111111         
    112         if((len=recvfrom(sock,mesg,sizeof(mesg)-1,0,(sockaddr*) remote, &addrlen))<0) { 
     112        if((len=recvfrom(sock,mesg,sizeof(mesg)-1,0,(sockaddr*) &remote, &addrlen))<0) { 
    113113          L<<Logger::Error<<"recvfrom gave error, ignoring: "<<strerror(errno)<<endl; 
    114114          return 0; 
     
    124124 
    125125    len=0; 
    126     if((len=recvfrom(sock,mesg,512,0,(sockaddr*) remote, &addrlen))<0) { 
     126    if((len=recvfrom(sock,mesg,512,0,(sockaddr*) &remote, &addrlen))<0) { 
    127127      L<<Logger::Error<<"recvfrom gave error, ignoring: "<<strerror(errno)<<endl; 
    128128      return 0; 
     
    130130  } 
    131131   
    132   DLOG(L<<"Received a packet " << len <<" bytes long from "<<inet_ntoa( reinterpret_cast< sockaddr_in * >( &remote )->sin_addr )<<endl); 
     132  DLOG(L<<"Received a packet " << len <<" bytes long from "<< remote.toString()<<endl); 
    133133   
    134134  DNSPacket *packet; 
     
    139139  packet->d_dt.set(); // timing 
    140140  packet->setSocket(sock); 
    141   packet->setRemote((struct sockaddr *)remote, addrlen); 
     141  packet->setRemote(&remote); 
    142142  if(packet->parse(mesg, len)<0) { 
    143143    S.inc("corrupt-packets"); 
  • trunk/pdns/pdns/resolver.cc

    r680 r762  
    233233  struct in_addr inp; 
    234234  Utility::inet_aton(ip.c_str(),&inp); 
    235   d_toaddr.sin_addr.s_addr=inp.s_addr; 
    236  
    237   d_toaddr.sin_port=htons(port); 
    238   d_toaddr.sin_family=AF_INET; 
     235  d_toaddr.sin4.sin_addr.s_addr=inp.s_addr; 
     236 
     237  d_toaddr.sin4.sin_port=htons(port); 
     238  d_toaddr.sin4.sin_family=AF_INET; 
    239239 
    240240  d_sock=socket(AF_INET,SOCK_STREAM,0); 
     
    418418  try { 
    419419    DNSPacket p; 
    420     p.setRemote((const sockaddr*)&d_toaddr, sizeof(d_toaddr)); 
     420    p.setRemote(&d_toaddr); 
    421421    p.d_tcp = d_inaxfr; // fixes debian bug 330184 
    422422    if(p.parse((char *)d_buf, d_len)<0) 
  • trunk/pdns/pdns/resolver.hh

    r681 r762  
    11/* 
    22    PowerDNS Versatile Database Driven Nameserver 
    3     Copyright (C) 2002 PowerDNS.COM BV 
     3    Copyright (C) 2002 - 2006 PowerDNS.COM BV 
    44 
    55    This program is free software; you can redistribute it and/or modify 
     
    2121#include <vector> 
    2222#include <sys/types.h> 
    23  
     23#include "iputils.hh" 
    2424#ifndef WIN32 
    2525 
     
    8686  uint32_t d_ip; 
    8787  bool d_inaxfr; 
    88   struct sockaddr_in d_toaddr; 
     88  ComboAddress d_toaddr; 
    8989}; 
    9090 
  • trunk/pdns/pdns/syncres.cc

    r756 r762  
    9595   
    9696  set<GetBestNSAnswer> beenthere; 
    97   int res=doResolve(qname, qtype, ret,0,beenthere); 
     97  int res=doResolve(qname, qtype, ret, 0, beenthere); 
    9898  if(!res) 
    9999    addCruft(qname, ret); 
  • trunk/pdns/pdns/tcpreceiver.cc

    r685 r762  
    8585 
    8686 
    87 int TCPNameserver::readLength(int fd, struct sockaddr_in *remote) 
     87int TCPNameserver::readLength(int fd, ComboAddress *remote) 
    8888{ 
    8989  int bytesLeft=2; 
     
    9696    int ret=waitForData(fd, s_timeout); 
    9797    if(ret<0) 
    98       throw AhuException("Waiting on data from remote TCP client "+string(inet_ntoa(remote->sin_addr))+": "+stringerror()); 
     98      throw AhuException("Waiting on data from remote TCP client "+remote->toString()+": "+stringerror()); 
    9999   
    100100    ret=recv(fd, reinterpret_cast< char * >( buf ) +2-bytesLeft, bytesLeft,0); 
    101101    if(ret<0) 
    102       throw AhuException("Trying to read data from remote TCP client "+string(inet_ntoa(remote->sin_addr))+": "+stringerror()); 
     102      throw AhuException("Trying to read data from remote TCP client "+remote->toString()+": "+stringerror()); 
    103103    if(!ret) { 
    104       DLOG(L<<"Remote TCP client "+string(inet_ntoa(remote->sin_addr))+" closed connection"); 
     104      DLOG(L<<"Remote TCP client "+remote->toString()+" closed connection"); 
    105105      return -1; 
    106106    } 
     
    110110} 
    111111 
    112 void TCPNameserver::getQuestion(int fd, char *mesg, int pktlen, const struct sockaddr_in &remote) 
     112void TCPNameserver::getQuestion(int fd, char *mesg, int pktlen, const ComboAddress &remote) 
    113113{ 
    114114  int ret=0, bytesread=0; 
     
    123123 err:; 
    124124  if(ret<0)  
    125     throw AhuException("Error reading DNS data from TCP client "+string(inet_ntoa(remote.sin_addr))+": "+stringerror()); 
     125    throw AhuException("Error reading DNS data from TCP client "+remote.toString()+": "+stringerror()); 
    126126  else  
    127     throw AhuException("Remote TCP client "+string(inet_ntoa(remote.sin_addr))+" closed connection"); 
     127    throw AhuException("Remote TCP client "+remote.toString()+" closed connection"); 
    128128} 
    129129 
     
    141141     
    142142    for(;;) { 
    143       struct sockaddr_in remote; 
     143      ComboAddress remote; 
    144144       
    145145      int pktlen=readLength(fd, &remote); 
     
    148148 
    149149      if(pktlen>511) { 
    150         L<<Logger::Error<<"Received an overly large question from "<<inet_ntoa(remote.sin_addr)<<", dropping"<<endl; 
     150        L<<Logger::Error<<"Received an overly large question from "<<remote.toString()<<", dropping"<<endl; 
    151151        break; 
    152152      } 
     
    160160      packet=new DNSPacket; 
    161161 
    162       packet->setRemote((struct sockaddr *)&remote,sizeof(remote)); 
     162      packet->setRemote(&remote); 
    163163      packet->d_tcp=true; 
    164164      if(packet->parse(mesg, pktlen)<0) 
     
    199199      DNSPacket* cached=new DNSPacket; 
    200200      if(!packet->d.rd && (PC.get(packet, cached))) { // short circuit - does the PacketCache recognize this question? 
    201         cached->setRemote((struct sockaddr *)(packet->remote), sizeof(struct sockaddr_in)); 
     201        cached->setRemote(&packet->remote); 
    202202        cached->spoofID(packet->d.id); 
    203203        if(sendDelPacket(cached, fd)<0)  
     
    265265    return false; 
    266266 
    267   if( arg()["allow-axfr-ips"].empty() || d_ng.match( (struct sockaddr_in *) &q->remote ) ) 
     267  if( arg()["allow-axfr-ips"].empty() || d_ng.match( (ComboAddress *) &q->remote ) ) 
    268268    return true; 
    269269 
  • trunk/pdns/pdns/tcpreceiver.hh

    r681 r762  
    4949 
    5050  static int sendDelPacket(DNSPacket *p, int outsock); 
    51   static int readLength(int fd, struct sockaddr_in *remote); 
    52   static void getQuestion(int fd, char *mesg, int pktlen, const struct sockaddr_in &remote); 
     51  static int readLength(int fd, ComboAddress *remote); 
     52  static void getQuestion(int fd, char *mesg, int pktlen, const ComboAddress& remote); 
    5353  static int doAXFR(const string &target, DNSPacket *q, int outsock); 
    5454  static bool canDoAXFR(DNSPacket *q);