]> git.ipfire.org Git - thirdparty/ldns.git/commitdiff
cpap 2 dnsserver
authorMiek Gieben <miekg@NLnetLabs.nl>
Mon, 6 Mar 2006 13:49:42 +0000 (13:49 +0000)
committerMiek Gieben <miekg@NLnetLabs.nl>
Mon, 6 Mar 2006 13:49:42 +0000 (13:49 +0000)
examples/Makefile.in
examples/ldns-cat-pcap.c [moved from examples/ldns-pcap-drill.c with 51% similarity]

index ab95e0507f4598d88e42bcab0286fa9d1a733020..fb0ffd39718672c4b95a2997da5b6cf0af3c1bf8 100644 (file)
@@ -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
similarity index 51%
rename from examples/ldns-pcap-drill.c
rename to examples/ldns-cat-pcap.c
index f595c3cce988d78f453a5ae98f5d6073a80e102d..271d17231b7a1d334e6e6b726c19a975a1460599 100644 (file)
  * 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;
 }
-