]> git.ipfire.org Git - thirdparty/pdns.git/blob - pdns/sdig.cc
and the final bit of whitespace/tab cleanup
[thirdparty/pdns.git] / pdns / sdig.cc
1 #include "dnsparser.hh"
2 #include "sstuff.hh"
3 #include "misc.hh"
4 #include "dnswriter.hh"
5 #include "dnsrecords.hh"
6 #include "statbag.hh"
7 StatBag S;
8
9 int main(int argc, char** argv)
10 try
11 {
12 reportAllTypes();
13
14 if(argc < 4) {
15 cerr<<"Syntax: sdig IP-address port question question-type\n";
16 exit(EXIT_FAILURE);
17 }
18
19 vector<uint8_t> packet;
20
21 DNSPacketWriter pw(packet, argv[3], DNSRecordContent::TypeToNumber(argv[4]));
22
23 // pw.setRD(true);
24
25 /*
26 pw.startRecord("powerdns.com", DNSRecordContent::TypeToNumber("NS"));
27 NSRecordContent nrc("ns1.powerdns.com");
28 nrc.toPacket(pw);
29
30 pw.startRecord("powerdns.com", DNSRecordContent::TypeToNumber("NS"));
31 NSRecordContent nrc2("ns2.powerdns.com");
32 nrc2.toPacket(pw);
33 */
34
35 string ping("hallo!");
36 /* DNSPacketWriter::optvect_t opts;
37
38 opts.push_back(make_pair(5, ping));
39 pw.addOpt(5200, 0, 0x8000, opts);
40 pw.commit();
41 */
42
43 Socket sock(InterNetwork, Datagram);
44 ComboAddress dest(argv[1] + (*argv[1]=='@'), atoi(argv[2]));
45 sock.sendTo(string((char*)&*packet.begin(), (char*)&*packet.end()), dest);
46
47 string reply;
48 sock.recvFrom(reply, dest);
49
50 MOADNSParser mdp(reply);
51 cout<<"Reply to question for qname='"<<mdp.d_qname<<"', qtype="<<DNSRecordContent::NumberToType(mdp.d_qtype)<<endl;
52 cout<<"Rcode: "<<mdp.d_header.rcode<<", RD: "<<mdp.d_header.rd<<", QR: "<<mdp.d_header.qr;
53 cout<<", TC: "<<mdp.d_header.tc<<", AA: "<<mdp.d_header.aa<<", opcode: "<<mdp.d_header.opcode<<endl;
54
55 for(MOADNSParser::answers_t::const_iterator i=mdp.d_answers.begin(); i!=mdp.d_answers.end(); ++i) {
56 cout<<i->first.d_place-1<<"\t"<<i->first.d_label<<"\tIN\t"<<DNSRecordContent::NumberToType(i->first.d_type);
57 cout<<"\t"<<i->first.d_ttl<<"\t"<< i->first.d_content->getZoneRepresentation()<<"\n";
58 }
59
60 EDNSOpts edo;
61 if(getEDNSOpts(mdp, &edo)) {
62
63 cerr<<"Have "<<edo.d_options.size()<<" options!"<<endl;
64 for(vector<pair<uint16_t, string> >::const_iterator iter = edo.d_options.begin();
65 iter != edo.d_options.end();
66 ++iter) {
67 if(iter->first == 5) {// 'EDNS PING'
68 cerr<<"Have ednsping: '"<<iter->second<<"'\n";
69 if(iter->second == ping)
70 cerr<<"It is correct!"<<endl;
71 }
72 else {
73 cerr<<"Have unknown option "<<(int)iter->first<<endl;
74 }
75 }
76
77 }
78
79 }
80 catch(std::exception &e)
81 {
82 cerr<<"Fatal: "<<e.what()<<endl;
83 }