]> git.ipfire.org Git - thirdparty/pdns.git/blob - pdns/dnspcap.hh
actually make things work
[thirdparty/pdns.git] / pdns / dnspcap.hh
1 #ifndef PDNS_DNSPCAP_HH
2 #define PDNS_DNSPCAP_HH
3 #include <cstdio>
4 #include <stdexcept>
5 #include <string>
6 #include "misc.hh"
7 #include <iostream>
8
9 #include <netinet/ip.h>
10 #include <netinet/udp.h>
11 #include <netinet/ether.h>
12 #include <vector>
13 #include <pcap.h>
14 #include <boost/format.hpp>
15 using namespace std;
16
17 class PcapPacketReader
18 {
19 public:
20 class EofException : public runtime_error
21 {
22 public:
23 EofException(const string& str="") : runtime_error(str)
24 {
25 }
26 };
27
28 PcapPacketReader(const string& fname);
29
30 ~PcapPacketReader();
31
32 template<typename T>
33 void checkedFread(T* ptr)
34 {
35 checkedFreadSize(ptr, sizeof(*ptr));
36 }
37
38 void checkedFreadSize(void* ptr, size_t size) ;
39
40 bool getUDPPacket();
41
42 struct ether_header* d_ether;
43 struct iphdr *d_ip;
44 const struct tcphdr *d_tcp;
45 const struct udphdr *d_udp;
46 const uint8_t* d_payload;
47 int d_len;
48 struct pcap_pkthdr d_pheader;
49
50 pcap_file_header d_pfh;
51 unsigned int d_runts, d_oversized, d_correctpackets, d_nonetheripudp;
52 char d_buffer[5000];
53 private:
54 FILE* d_fp;
55 string d_fname;
56 };
57
58 class PcapPacketWriter
59 {
60 public:
61 PcapPacketWriter(const string& fname, PcapPacketReader& ppr);
62
63 void write();
64
65 ~PcapPacketWriter();
66
67 private:
68 string d_fname;
69 const PcapPacketReader& d_ppr;
70
71 FILE *d_fp;
72 };
73
74 #endif // DNSPCAP_HH