From: Miek Gieben Date: Mon, 6 Mar 2006 13:49:42 +0000 (+0000) Subject: cpap 2 dnsserver X-Git-Tag: release-1.1.0~328 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=91671d150f3bb499edbd1b6f09d216b4deb875dc;p=thirdparty%2Fldns.git cpap 2 dnsserver --- diff --git a/examples/Makefile.in b/examples/Makefile.in index ab95e050..fb0ffd39 100644 --- a/examples/Makefile.in +++ b/examples/Makefile.in @@ -47,7 +47,7 @@ PROGRAMS=$(SOURCES:.c=) all: $(PROGRAMS) -pcap: ldns-pcap-drill +pcap: ldns-cat-pcap ldns-read-zone: ldns-read-zone.o $(LINK) -o $@ $+ @@ -82,7 +82,7 @@ ldns-walk: ldns-walk.o ldns-dpa: ldns-dpa.o $(LINK) -o $@ $+ -ldns-pcap-drill: ldns-pcap-drill.o +ldns-cat-pcap: ldns-cat-pcap.o $(LINK) -o $@ $+ ldns-zsplit: ldns-zsplit.o diff --git a/examples/ldns-pcap-drill.c b/examples/ldns-cat-pcap.c similarity index 51% rename from examples/ldns-pcap-drill.c rename to examples/ldns-cat-pcap.c index f595c3cc..271d1723 100644 --- a/examples/ldns-pcap-drill.c +++ b/examples/ldns-cat-pcap.c @@ -21,19 +21,21 @@ * also write this with pcap_dump */ -int +u_char * pcap2ldns_pkt_ip(const u_char *packet, struct pcap_pkthdr *h) { - ldns_pkt *dns; + h->caplen=-DNS_OFFSET; + return (u_char*)(packet + DNS_OFFSET); +#if 0 if (ldns_wire2pkt(&dns, packet + DNS_OFFSET , (h->caplen - DNS_OFFSET)) == LDNS_STATUS_OK) { ldns_pkt_print(stdout, dns); } - return 0; +#endif } -int +u_char * pcap2ldns_pkt(const u_char *packet, struct pcap_pkthdr *h) { struct ether_header *eptr; @@ -44,9 +46,6 @@ pcap2ldns_pkt(const u_char *packet, struct pcap_pkthdr *h) return pcap2ldns_pkt_ip(packet, h); break; case ETHERTYPE_IPV6: - /* - return pcap2ldns_pkt_ip6(packet, h); - */ break; case ETHERTYPE_ARP: fprintf(stderr, "ARP pkt, dropping\n"); @@ -66,17 +65,53 @@ main(int argc, char **argv) struct pcap_pkthdr h; const u_char *x; size_t i = 0; + ldns_rdf *ip; + ldns_pkt *rpkt; + + uint8_t *result; + ldns_buffer *qpkt; + size_t size; + socklen_t tolen; + + struct timeval timeout; + struct sockaddr_storage *data; + struct sockaddr_in *data_in; + + ip = ldns_rdf_new_frm_str(LDNS_RDF_TYPE_A, "127.0.0.1"); + data = LDNS_MALLOC(struct sockaddr_storage); + timeout.tv_sec = 2; + timeout.tv_usec = 0; - if (!(p = pcap_open_offline("/tmp/K/20011009-134418-q50000.pkt", errbuf))) { - printf("Cannot open pcap lib %s\n", errbuf); + data->ss_family = AF_INET; + data_in = (struct sockaddr_in*) data; + data_in->sin_port = (in_port_t)htons(53); + memcpy(&(data_in->sin_addr), ldns_rdf_data(ip), ldns_rdf_size(ip)); + tolen = sizeof(struct sockaddr_in); + + if (!(p = pcap_open_offline("./20011009-134418-q50000.pkt", errbuf))) { + fprintf(stderr, "Cannot open pcap lib %s\n", errbuf); + exit(EXIT_FAILURE); } + qpkt = ldns_buffer_new(LDNS_MAX_PACKETLEN); + while ((x = pcap_next(p, &h))) { - pcap2ldns_pkt_ip(x, &h); + ldns_buffer_write(qpkt, + pcap2ldns_pkt_ip(x, &h), + h.caplen); + + if (ldns_udp_send(&result, qpkt, data, tolen, timeout, &size) == + LDNS_STATUS_OK) { + ldns_wire2pkt(&rpkt, result, size); + ldns_pkt_print(stdout, rpkt); + } + + ldns_buffer_clear(qpkt); + i++; - printf("pkt seen %zd\n", i); + + printf("pkt seen %zd\n", i); } pcap_close(p); return 0; } -