]>
Commit | Line | Data |
---|---|---|
ff6a1e7b BH |
1 | #include "dnsparser.hh" |
2 | #include "sstuff.hh" | |
3 | #include "misc.hh" | |
4 | ||
5 | /** Write only packet generator */ | |
6 | class DNSPacketGenerator | |
7 | { | |
8 | public: | |
9 | DNSPacketGenerator(const string& qname, uint16_t qtype); // there is always a question | |
10 | const string getPacket(); | |
11 | dnsheader d_dnsheader; | |
12 | private: | |
13 | string d_content; | |
14 | }; | |
15 | ||
16 | const 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 | ||
32 | DNSPacketGenerator::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 | ||
45 | const string DNSPacketGenerator::getPacket() | |
46 | { | |
47 | return string((char*)&d_dnsheader, ((char*)&d_dnsheader)+sizeof(d_dnsheader))+d_content; | |
48 | } | |
49 | ||
50 | int main(int argc, char** argv) | |
51 | try | |
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 | } | |
73 | catch(exception &e) | |
74 | { | |
75 | cerr<<"Fatal: "<<e.what()<<endl; | |
76 | } | |
77 |