]> git.ipfire.org Git - thirdparty/pdns.git/blob - pdns/dumresp.cc
Merge pull request #2331 from rubenk/fix-typo-in-internals-docs
[thirdparty/pdns.git] / pdns / dumresp.cc
1 #ifdef HAVE_CONFIG_H
2 #include "config.h"
3 #endif
4 #include "iputils.hh"
5 #include "sstuff.hh"
6 #include "statbag.hh"
7
8 StatBag S;
9
10 int main(int argc, char** argv)
11 try
12 {
13 if(argc != 3) {
14 cerr<<"Syntax: dumresp local-address number-of-threads"<<endl;
15 exit(EXIT_FAILURE);
16 }
17
18 for(int i=1 ; i < atoi(argv[2]); ++i) {
19 if(!fork())
20 break;
21 }
22 Socket s(AF_INET, SOCK_DGRAM);
23 ComboAddress local(argv[1], 5300);
24
25 #ifdef SO_REUSEPORT
26 int one=1;
27 if(setsockopt(s.getHandle(), SOL_SOCKET, SO_REUSEPORT, &one, sizeof(one)) < 0)
28 unixDie("setsockopt for REUSEPORT");
29 #endif
30
31 s.bind(local);
32 char buffer[1500];
33 struct dnsheader* dh = (struct dnsheader*)buffer;
34 int len;
35 ComboAddress rem=local;
36 socklen_t socklen = rem.getSocklen();
37 for(;;) {
38 len=recvfrom(s.getHandle(), buffer, sizeof(buffer), 0, (struct sockaddr*)&rem, &socklen);
39 if(len < 0)
40 unixDie("recvfrom");
41
42 if(dh->qr)
43 continue;
44 dh->qr=1;
45 dh->ad=0;
46 if(sendto(s.getHandle(), buffer, len, 0, (struct sockaddr*)&rem, socklen) < 0)
47 unixDie("sendto");
48
49 }
50 }
51 catch(std::exception& e)
52 {
53 cerr<<"Fatal error: "<<e.what()<<endl;
54 exit(EXIT_FAILURE);
55 }