}
}
}
-catch(std::exception& e)
+catch(const std::exception& e)
{
cerr<<"Error parsing response records: "<<e.what()<<endl;
}
+catch(const PDNSException& e)
+{
+ cerr<<"Error parsing response records: "<<e.reason<<endl;
+}
void usage()
{
}
int main(int argc, char **argv)
-{
+try {
for(int n=1 ; n < argc; ++n) {
if ((string) argv[n] == "--help") {
usage();
std::map<uint16_t,boost::uuids::uuid> ids;
boost::uuids::random_generator uuidGenerator;
- while (pr.getUDPPacket()) {
- const dnsheader* dh=(dnsheader*)pr.d_payload;
- if (!dh->qdcount)
- continue;
-
- if (pr.d_len < sizeof(dnsheader))
- continue;
-
- if(!dh->rd)
- continue;
-
- uint16_t qtype, qclass;
- DNSName qname;
- try {
- qname=DNSName((const char*)pr.d_payload, pr.d_len, sizeof(dnsheader), false, &qtype, &qclass);
- }
- catch(const std::exception& e) {
- cerr<<"Error while parsing qname: "<<e.what()<<endl;
- continue;
- }
+ try {
+ while (pr.getUDPPacket()) {
+ const dnsheader* dh=(dnsheader*)pr.d_payload;
+ if (!dh->qdcount)
+ continue;
+
+ if (pr.d_len < sizeof(dnsheader))
+ continue;
+
+ if(!dh->rd)
+ continue;
+
+ uint16_t qtype, qclass;
+ DNSName qname;
+ try {
+ qname=DNSName((const char*)pr.d_payload, pr.d_len, sizeof(dnsheader), false, &qtype, &qclass);
+ }
+ catch(const std::exception& e) {
+ cerr<<"Error while parsing qname: "<<e.what()<<endl;
+ continue;
+ }
- PBDNSMessage message;
- message.set_timesec(pr.d_pheader.ts.tv_sec);
- message.set_timeusec(pr.d_pheader.ts.tv_usec);
- message.set_id(ntohs(dh->id));
- message.set_type(dh->qr ? PBDNSMessage_Type_DNSResponseType : PBDNSMessage_Type_DNSQueryType);
- const ComboAddress requestor = dh->qr ? pr.getDest() : pr.getSource();
- const ComboAddress responder = dh->qr ? pr.getSource() : pr.getDest();
-
- *((char*)&requestor.sin4.sin_addr.s_addr)|=ind;
- *((char*)&responder.sin4.sin_addr.s_addr)|=ind;
- message.set_socketfamily(requestor.sin4.sin_family == AF_INET ? PBDNSMessage_SocketFamily_INET : PBDNSMessage_SocketFamily_INET6);
- // we handle UDP packets only for now
- message.set_socketprotocol(PBDNSMessage_SocketProtocol_UDP);
- if (requestor.sin4.sin_family == AF_INET) {
- message.set_from(&requestor.sin4.sin_addr.s_addr, sizeof(requestor.sin4.sin_addr.s_addr));
- }
- else if (requestor.sin4.sin_family == AF_INET6) {
- message.set_from(&requestor.sin6.sin6_addr.s6_addr, sizeof(requestor.sin6.sin6_addr.s6_addr));
- }
- if (responder.sin4.sin_family == AF_INET) {
- message.set_to(&responder.sin4.sin_addr.s_addr, sizeof(responder.sin4.sin_addr.s_addr));
- }
- else if (responder.sin4.sin_family == AF_INET6) {
- message.set_to(&responder.sin6.sin6_addr.s6_addr, sizeof(responder.sin6.sin6_addr.s6_addr));
- }
- message.set_inbytes(pr.d_len);
+ PBDNSMessage message;
+ message.set_timesec(pr.d_pheader.ts.tv_sec);
+ message.set_timeusec(pr.d_pheader.ts.tv_usec);
+ message.set_id(ntohs(dh->id));
+ message.set_type(dh->qr ? PBDNSMessage_Type_DNSResponseType : PBDNSMessage_Type_DNSQueryType);
+ const ComboAddress requestor = dh->qr ? pr.getDest() : pr.getSource();
+ const ComboAddress responder = dh->qr ? pr.getSource() : pr.getDest();
+
+ *((char*)&requestor.sin4.sin_addr.s_addr)|=ind;
+ *((char*)&responder.sin4.sin_addr.s_addr)|=ind;
+ message.set_socketfamily(requestor.sin4.sin_family == AF_INET ? PBDNSMessage_SocketFamily_INET : PBDNSMessage_SocketFamily_INET6);
+ // we handle UDP packets only for now
+ message.set_socketprotocol(PBDNSMessage_SocketProtocol_UDP);
+ if (requestor.sin4.sin_family == AF_INET) {
+ message.set_from(&requestor.sin4.sin_addr.s_addr, sizeof(requestor.sin4.sin_addr.s_addr));
+ }
+ else if (requestor.sin4.sin_family == AF_INET6) {
+ message.set_from(&requestor.sin6.sin6_addr.s6_addr, sizeof(requestor.sin6.sin6_addr.s6_addr));
+ }
+ if (responder.sin4.sin_family == AF_INET) {
+ message.set_to(&responder.sin4.sin_addr.s_addr, sizeof(responder.sin4.sin_addr.s_addr));
+ }
+ else if (responder.sin4.sin_family == AF_INET6) {
+ message.set_to(&responder.sin6.sin6_addr.s6_addr, sizeof(responder.sin6.sin6_addr.s6_addr));
+ }
+ message.set_inbytes(pr.d_len);
- PBDNSMessage_DNSQuestion* question = message.mutable_question();
- PBDNSMessage_DNSResponse* response = message.mutable_response();
+ PBDNSMessage_DNSQuestion* question = message.mutable_question();
+ PBDNSMessage_DNSResponse* response = message.mutable_response();
- if (!dh->qr) {
- boost::uuids::uuid uniqueId = uuidGenerator();
- ids[dh->id] = uniqueId;
- std::string* messageId = message.mutable_messageid();
- messageId->resize(uniqueId.size());
- std::copy(uniqueId.begin(), uniqueId.end(), messageId->begin());
- }
- else {
- const auto& it = ids.find(dh->id);
- if (it != ids.end()) {
+ if (!dh->qr) {
+ boost::uuids::uuid uniqueId = uuidGenerator();
+ ids[dh->id] = uniqueId;
std::string* messageId = message.mutable_messageid();
- messageId->resize(it->second.size());
- std::copy(it->second.begin(), it->second.end(), messageId->begin());
+ messageId->resize(uniqueId.size());
+ std::copy(uniqueId.begin(), uniqueId.end(), messageId->begin());
+ }
+ else {
+ const auto& it = ids.find(dh->id);
+ if (it != ids.end()) {
+ std::string* messageId = message.mutable_messageid();
+ messageId->resize(it->second.size());
+ std::copy(it->second.begin(), it->second.end(), messageId->begin());
+ }
+
+ response->set_rcode(dh->rcode);
+ addRRs((const char*) dh, pr.d_len, response);
}
- response->set_rcode(dh->rcode);
- addRRs((const char*) dh, pr.d_len, response);
- }
-
- question->set_qname(qname.toString());
- question->set_qtype(qtype);
- question->set_qclass(qclass);
+ question->set_qname(qname.toString());
+ question->set_qtype(qtype);
+ question->set_qclass(qclass);
- std::string str;
- //cerr<<message.DebugString()<<endl;
- message.SerializeToString(&str);
- uint16_t mlen = htons(str.length());
- fwrite(&mlen, 1, sizeof(mlen), fp);
- fwrite(str.c_str(), 1, str.length(), fp);
+ std::string str;
+ //cerr<<message.DebugString()<<endl;
+ message.SerializeToString(&str);
+ uint16_t mlen = htons(str.length());
+ fwrite(&mlen, 1, sizeof(mlen), fp);
+ fwrite(str.c_str(), 1, str.length(), fp);
+ }
+ }
+ catch (const std::exception& e) {
+ cerr<<"Error while parsing the PCAP file: "<<e.what()<<endl;
+ fclose(fp);
+ exit(EXIT_FAILURE);
}
+
fclose(fp);
}
+catch(const std::exception& e) {
+ cerr<<"Error opening PCAP file: "<<e.what()<<endl;
+ exit(EXIT_FAILURE);
+}