]> git.ipfire.org Git - thirdparty/ldns.git/commitdiff
updated version - it also works
authorMiek Gieben <miekg@NLnetLabs.nl>
Mon, 6 Mar 2006 14:23:25 +0000 (14:23 +0000)
committerMiek Gieben <miekg@NLnetLabs.nl>
Mon, 6 Mar 2006 14:23:25 +0000 (14:23 +0000)
examples/Makefile.in
examples/ldns-pcat.c [moved from examples/ldns-cat-pcap.c with 69% similarity]

index fb0ffd39718672c4b95a2997da5b6cf0af3c1bf8..7df92c97bb61ab9354980ff2a334a0d4aac586f9 100644 (file)
@@ -47,7 +47,7 @@ PROGRAMS=$(SOURCES:.c=)
 
 all:   $(PROGRAMS)
 
-pcap:  ldns-cat-pcap
+pcap:  ldns-pcat
 
 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-cat-pcap:         ldns-cat-pcap.o
+ldns-pcat:     ldns-pcat.o
                $(LINK) -o $@ $+
 
 ldns-zsplit:   ldns-zsplit.o
similarity index 69%
rename from examples/ldns-cat-pcap.c
rename to examples/ldns-pcat.c
index 2efab9bac5b54c46b0417f565f1209da8bcab05f..b5766b85634c63516b6de12dd9334eba3bd3e26b 100644 (file)
@@ -13,7 +13,7 @@
 void
 usage(FILE *fp, char *progname)
 {
-       fprintf(fp, "%s: [-a IP] [-p PORT} PCAP_FILE\n\n");
+       fprintf(fp, "%s: [-a IP] [-p PORT} PCAP_FILE\n\n", progname);
        fprintf(fp, "   -a IP\tuse IP as nameserver\n");
        fprintf(fp, "   -p PORT\tuse POTR as port\n");
        fprintf(fp, "  PCAP_FILE\tuse this file as source\n");
@@ -62,14 +62,17 @@ int
 main(int argc, char **argv) 
 {
        char errbuf[PCAP_ERRBUF_SIZE];
+       char *progname;
        pcap_t *p;
        struct pcap_pkthdr h;
        const u_char *x;
        size_t i = 0;
        ldns_rdf *ip;
        ldns_pkt *rpkt;
+       int c;
 
        uint8_t *result;
+       uint16_t port;
        ldns_buffer *qpkt;
        size_t size;
        socklen_t tolen;
@@ -78,24 +81,63 @@ main(int argc, char **argv)
        struct sockaddr_storage *data;
        struct sockaddr_in  *data_in;
 
-       ip = ldns_rdf_new_frm_str(LDNS_RDF_TYPE_A, "127.0.0.1");
+       port = 0;
+       ip = NULL;
+       progname = strdup(argv[0]);
+
+       while ((c = getopt(argc, argv, "a:p:")) != -1) {
+               switch(c) {
+               case 'a':
+                       ip = ldns_rdf_new_frm_str(LDNS_RDF_TYPE_A, optarg);
+                       if (!ip) {
+                               fprintf(stderr, "-a requires an IP address\n");
+                               exit(EXIT_FAILURE);
+                       }
+                       break;
+               case 'p':
+                       port = atoi(optarg);
+                       if (port == 0) {
+                               fprintf(stderr, "-p requires a port number\n");
+                               exit(EXIT_FAILURE);
+                       }
+                       break;
+               default:
+                       usage(stdout, progname);
+                       exit(EXIT_FAILURE);
+               }
+       }
+       argc -= optind;
+       argv += optind;
+
+       if (port == 0)
+               port = 53;
+
+       if (!ip) 
+               ip = ldns_rdf_new_frm_str(LDNS_RDF_TYPE_A, "127.0.0.1");
+
+       if (argc < 1) {
+               /* no file given - use standard input */
+               p = pcap_fopen_offline(stdin, errbuf);
+       } else {
+               p = pcap_open_offline(argv[0], errbuf);
+       }
+       if (!p) {
+               fprintf(stderr, "Cannot open pcap lib %s\n", errbuf);
+               exit(EXIT_FAILURE);
+       }
+
+       qpkt = ldns_buffer_new(LDNS_MAX_PACKETLEN);
        data = LDNS_MALLOC(struct sockaddr_storage);
        timeout.tv_sec = 2;
        timeout.tv_usec = 0;
 
+       /* setup the socket */
        data->ss_family = AF_INET;
         data_in = (struct sockaddr_in*) data;
-        data_in->sin_port = (in_port_t)htons(53);
+        data_in->sin_port = (in_port_t)htons(port);
         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))) {
                ldns_buffer_write(qpkt,
                                pcap2ldns_pkt_ip(x, &h),
@@ -110,9 +152,8 @@ main(int argc, char **argv)
                ldns_buffer_clear(qpkt);
                
                i++;
-
-               printf("pkt seen %zd\n", i);
        }
+       fprintf(stderr, "%zd\n", i);
        pcap_close(p);
        return 0;
 }