]> git.ipfire.org Git - thirdparty/pdns.git/blame - pdns/sdig.cc
add getText for NAPTR and TXT
[thirdparty/pdns.git] / pdns / sdig.cc
CommitLineData
ff6a1e7b
BH
1#include "dnsparser.hh"
2#include "sstuff.hh"
3#include "misc.hh"
4
5/** Write only packet generator */
6class DNSPacketGenerator
7{
8public:
9 DNSPacketGenerator(const string& qname, uint16_t qtype); // there is always a question
10 const string getPacket();
11 dnsheader d_dnsheader;
12private:
13 string d_content;
14};
15
16const string EncodeDNSLabel(const string& input)
17{
18 typedef vector<string> parts_t;
19 parts_t parts;
20 stringtok(parts,input,".");
21
22 string ret;
23 for(parts_t::const_iterator i=parts.begin(); i!=parts.end(); ++i) {
24 ret.append(1,(char)i->length());
25 ret.append(*i);
26 }
27 ret.append(1,(char)0);
28 return ret;
29
30}
31
32DNSPacketGenerator::DNSPacketGenerator(const string& qname, uint16_t qtype)
33{
34 memset(&d_dnsheader, 0, sizeof(d_dnsheader));
35 d_dnsheader.id=random();
36 d_dnsheader.qdcount=htons(1);
37
38 d_content=EncodeDNSLabel(qname);
39 qtype=htons(qtype);
40 d_content.append((char*)&qtype, 2);
41 qtype=htons(1);
42 d_content.append((char*)&qtype,2);
43}
44
45const string DNSPacketGenerator::getPacket()
46{
47 return string((char*)&d_dnsheader, ((char*)&d_dnsheader)+sizeof(d_dnsheader))+d_content;
48}
49
50int main(int argc, char** argv)
51try
52{
7fc69fd0 53 DNSPacketGenerator dpg(argv[3], DNSRecordContent::TypeToNumber(argv[4]));
ff6a1e7b
BH
54
55 Socket sock(InterNetwork, Datagram);
7fc69fd0 56 IPEndpoint dest(argv[1] + (*argv[1]=='@'), atoi(argv[2]));
ff6a1e7b
BH
57 sock.sendTo(dpg.getPacket(), dest);
58
59 string reply;
60 sock.recvFrom(reply, dest);
61
62 MOADNSParser mdp(reply);
7fc69fd0 63 cout<<"Reply to question for qname='"<<mdp.d_qname<<"', qtype="<<DNSRecordContent::NumberToType(mdp.d_qtype)<<endl;
512c8492 64 cout<<"Rcode: "<<mdp.d_header.rcode<<", RD: "<<mdp.d_header.rd;
7fc69fd0 65 cout<<", TC: "<<mdp.d_header.tc<<", AA: "<<mdp.d_header.aa<<", opcode: "<<mdp.d_header.opcode<<endl;
945a9ad4 66
ff6a1e7b 67 for(MOADNSParser::answers_t::const_iterator i=mdp.d_answers.begin(); i!=mdp.d_answers.end(); ++i) {
945a9ad4 68 cout<<i->first.d_place<<"\t"<<i->first.d_label<<"\tIN\t"<<DNSRecordContent::NumberToType(i->first.d_type)<<"\t"<<i->first.d_ttl<<"\t"<< i->first.d_content->getZoneRepresentation()<<endl;
ff6a1e7b
BH
69 }
70
71
72}
73catch(exception &e)
74{
75 cerr<<"Fatal: "<<e.what()<<endl;
76}
77