Changeset 762
- Timestamp:
- 04/24/06 09:29:38 (4 years ago)
- Location:
- trunk/pdns/pdns
- Files:
-
- 14 modified
-
common_startup.cc (modified) (1 diff)
-
communicator.cc (modified) (2 diffs)
-
dnspacket.cc (modified) (4 diffs)
-
dnspacket.hh (modified) (4 diffs)
-
dnsproxy.cc (modified) (1 diff)
-
dnsscan.cc (modified) (1 diff)
-
iputils.hh (modified) (2 diffs)
-
nameserver.cc (modified) (1 diff)
-
nameserver.hh (modified) (6 diffs)
-
resolver.cc (modified) (2 diffs)
-
resolver.hh (modified) (3 diffs)
-
syncres.cc (modified) (1 diff)
-
tcpreceiver.cc (modified) (9 diffs)
-
tcpreceiver.hh (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/pdns/pdns/common_startup.cc
r686 r762 239 239 240 240 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); // inlined241 cached.setRemote(&P->remote); // inlined 242 242 cached.setSocket(P->getSocket()); // inlined 243 243 cached.spoofID(P->d.id); // inlined -
trunk/pdns/pdns/communicator.cc
r680 r762 291 291 int CommunicatorClass::doNotifications() 292 292 { 293 struct sockaddr_infrom;293 ComboAddress from; 294 294 Utility::socklen_t fromlen=sizeof(from); 295 295 char buffer[1500]; … … 301 301 DNSPacket p; 302 302 303 p.setRemote( (struct sockaddr *)&from, fromlen);303 p.setRemote(&from); 304 304 305 305 if(p.parse(buffer,size)<0) { -
trunk/pdns/pdns/dnspacket.cc
r726 r762 57 57 58 58 getsockname(d_socket, (struct sockaddr *)&sa, (socklen_t *)&addrlen); 59 return sockAddrToString( &sa);59 return sockAddrToString((struct sockaddr_in*)&sa); 60 60 } 61 61 … … 63 63 string DNSPacket::getRemote() const 64 64 { 65 return sockAddrToString((struct sockaddr_in *)remote);65 return remote.toString(); 66 66 } 67 67 68 68 uint16_t DNSPacket::getRemotePort() const 69 69 { 70 if(d_socklen==sizeof(sockaddr_in)) 71 return ((struct sockaddr_in*)remote)->sin_port; 72 return 0; 70 return remote.sin4.sin_port; 73 71 } 74 72 … … 84 82 DLOG(L<<"DNSPacket copy constructor called!"<<endl); 85 83 d_socket=orig.d_socket; 86 memcpy(remote, orig.remote, sizeof(remote));84 remote=orig.remote; 87 85 len=orig.len; 88 86 d_qlen=orig.d_qlen; … … 1401 1399 r->setSocket(d_socket); 1402 1400 1403 r->setRemote( (struct sockaddr *)remote, d_socklen);1401 r->setRemote(&remote); 1404 1402 r->setAnswer(true); // this implies the allocation of the header 1405 1403 r->setA(true); // and we are authoritative -
trunk/pdns/pdns/dnspacket.hh
r680 r762 32 32 #include <cstdlib> 33 33 #include <sys/types.h> 34 #include "iputils.hh" 34 35 35 36 #ifndef WIN32 … … 116 117 }; 117 118 118 inline void setRemote(const struct sockaddr *a, Utility::socklen_t socklen);119 inline void setRemote(const ComboAddress*); 119 120 string getLocal() const; 120 121 string getRemote() const; … … 239 240 //////// DATA ! 240 241 241 char remote[sizeof(sockaddr_in6)];242 ComboAddress remote; 242 243 Utility::socklen_t d_socklen; // 4 243 244 uint16_t len; //!< length of the raw binary packet 2 … … 334 335 335 336 //! 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; 337 inline void DNSPacket::setRemote(const ComboAddress *s) 338 { 339 remote=*s; 343 340 } 344 341 -
trunk/pdns/pdns/dnsproxy.cc
r726 r762 94 94 bool DNSProxy::recurseFor(DNSPacket* p) 95 95 { 96 return d_ng.match(( struct sockaddr_in*)&p->remote);96 return d_ng.match((ComboAddress *)&p->remote); 97 97 } 98 98 -
trunk/pdns/pdns/dnsscan.cc
r761 r762 27 27 try 28 28 { 29 PcapPacketReader pr(argv[1]);30 29 Socket sock(InterNetwork, Datagram); 31 30 31 /* 32 32 IPEndpoint remote(argc > 2 ? argv[2] : "127.0.0.1", 33 33 argc > 3 ? atoi(argv[3]) : 5300); 34 34 35 */ 35 36 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 44 57 } 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"; 46 65 // sock.sendTo(string(pr.d_payload, pr.d_payload + pr.d_len), remote); 47 48 66 } 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);57 67 } 58 68 } -
trunk/pdns/pdns/iputils.hh
r731 r762 1 1 /* 2 2 PowerDNS Versatile Database Driven Nameserver 3 Copyright (C) 2002 PowerDNS.COM BV3 Copyright (C) 2002 - 2006 PowerDNS.COM BV 4 4 5 5 This program is free software; you can redistribute it and/or modify … … 32 32 #include <functional> 33 33 #include "ahuexception.hh" 34 #include "misc.hh" 34 35 35 36 using namespace std; -
trunk/pdns/pdns/nameserver.cc
r680 r762 197 197 p->truncate(512); 198 198 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) 200 200 L<<Logger::Error<<"Error sending reply with sendto (socket="<<p->getSocket()<<"): "<<strerror(errno)<<endl; 201 201 delete p; 202 202 } 203 203 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) 205 205 L<<Logger::Error<<"Error sending reply with sendto (socket="<<p->getSocket()<<"): "<<strerror(errno)<<endl; 206 206 } -
trunk/pdns/pdns/nameserver.hh
r680 r762 86 86 inline DNSPacket *UDPNameserver::receive(DNSPacket *prefilled) 87 87 { 88 char remote[ sizeof(sockaddr_in6) ];88 ComboAddress remote; 89 89 extern StatBag S; 90 90 … … 94 94 Utility::sock_t sock=-1; 95 95 96 memset( remote, 0, sizeof( remote ));96 memset( &remote, 0, sizeof( remote )); 97 97 addrlen=sizeof(remote); 98 98 if(d_sockets.size()>1) { … … 110 110 // XXX FIXME this code could be using recvmsg + ip_pktinfo on platforms that support it 111 111 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) { 113 113 L<<Logger::Error<<"recvfrom gave error, ignoring: "<<strerror(errno)<<endl; 114 114 return 0; … … 124 124 125 125 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) { 127 127 L<<Logger::Error<<"recvfrom gave error, ignoring: "<<strerror(errno)<<endl; 128 128 return 0; … … 130 130 } 131 131 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); 133 133 134 134 DNSPacket *packet; … … 139 139 packet->d_dt.set(); // timing 140 140 packet->setSocket(sock); 141 packet->setRemote( (struct sockaddr *)remote, addrlen);141 packet->setRemote(&remote); 142 142 if(packet->parse(mesg, len)<0) { 143 143 S.inc("corrupt-packets"); -
trunk/pdns/pdns/resolver.cc
r680 r762 233 233 struct in_addr inp; 234 234 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; 239 239 240 240 d_sock=socket(AF_INET,SOCK_STREAM,0); … … 418 418 try { 419 419 DNSPacket p; 420 p.setRemote( (const sockaddr*)&d_toaddr, sizeof(d_toaddr));420 p.setRemote(&d_toaddr); 421 421 p.d_tcp = d_inaxfr; // fixes debian bug 330184 422 422 if(p.parse((char *)d_buf, d_len)<0) -
trunk/pdns/pdns/resolver.hh
r681 r762 1 1 /* 2 2 PowerDNS Versatile Database Driven Nameserver 3 Copyright (C) 2002 PowerDNS.COM BV3 Copyright (C) 2002 - 2006 PowerDNS.COM BV 4 4 5 5 This program is free software; you can redistribute it and/or modify … … 21 21 #include <vector> 22 22 #include <sys/types.h> 23 23 #include "iputils.hh" 24 24 #ifndef WIN32 25 25 … … 86 86 uint32_t d_ip; 87 87 bool d_inaxfr; 88 struct sockaddr_ind_toaddr;88 ComboAddress d_toaddr; 89 89 }; 90 90 -
trunk/pdns/pdns/syncres.cc
r756 r762 95 95 96 96 set<GetBestNSAnswer> beenthere; 97 int res=doResolve(qname, qtype, ret, 0,beenthere);97 int res=doResolve(qname, qtype, ret, 0, beenthere); 98 98 if(!res) 99 99 addCruft(qname, ret); -
trunk/pdns/pdns/tcpreceiver.cc
r685 r762 85 85 86 86 87 int TCPNameserver::readLength(int fd, struct sockaddr_in*remote)87 int TCPNameserver::readLength(int fd, ComboAddress *remote) 88 88 { 89 89 int bytesLeft=2; … … 96 96 int ret=waitForData(fd, s_timeout); 97 97 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()); 99 99 100 100 ret=recv(fd, reinterpret_cast< char * >( buf ) +2-bytesLeft, bytesLeft,0); 101 101 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()); 103 103 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"); 105 105 return -1; 106 106 } … … 110 110 } 111 111 112 void TCPNameserver::getQuestion(int fd, char *mesg, int pktlen, const struct sockaddr_in&remote)112 void TCPNameserver::getQuestion(int fd, char *mesg, int pktlen, const ComboAddress &remote) 113 113 { 114 114 int ret=0, bytesread=0; … … 123 123 err:; 124 124 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()); 126 126 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"); 128 128 } 129 129 … … 141 141 142 142 for(;;) { 143 struct sockaddr_inremote;143 ComboAddress remote; 144 144 145 145 int pktlen=readLength(fd, &remote); … … 148 148 149 149 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; 151 151 break; 152 152 } … … 160 160 packet=new DNSPacket; 161 161 162 packet->setRemote( (struct sockaddr *)&remote,sizeof(remote));162 packet->setRemote(&remote); 163 163 packet->d_tcp=true; 164 164 if(packet->parse(mesg, pktlen)<0) … … 199 199 DNSPacket* cached=new DNSPacket; 200 200 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); 202 202 cached->spoofID(packet->d.id); 203 203 if(sendDelPacket(cached, fd)<0) … … 265 265 return false; 266 266 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 ) ) 268 268 return true; 269 269 -
trunk/pdns/pdns/tcpreceiver.hh
r681 r762 49 49 50 50 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); 53 53 static int doAXFR(const string &target, DNSPacket *q, int outsock); 54 54 static bool canDoAXFR(DNSPacket *q);