gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r13052 - gnunet/src/vpn


From: gnunet
Subject: [GNUnet-SVN] r13052 - gnunet/src/vpn
Date: Tue, 21 Sep 2010 15:49:08 +0200

Author: toelke
Date: 2010-09-21 15:49:08 +0200 (Tue, 21 Sep 2010)
New Revision: 13052

Modified:
   gnunet/src/vpn/gnunet-vpn-pretty-print.c
Log:
print all fields of a dns-rr

Modified: gnunet/src/vpn/gnunet-vpn-pretty-print.c
===================================================================
--- gnunet/src/vpn/gnunet-vpn-pretty-print.c    2010-09-21 13:30:05 UTC (rev 
13051)
+++ gnunet/src/vpn/gnunet-vpn-pretty-print.c    2010-09-21 13:49:08 UTC (rev 
13052)
@@ -259,6 +259,29 @@
        return 0;
 }}}
 
+unsigned int parse_dns_name(unsigned char* d, const unsigned char* src, 
unsigned short idx) {/*{{{*/
+       unsigned char* dest = d;
+
+       int len = src[idx++];
+       while (len != 0) {
+               if (len & 0xC0) { /* Compressed name, offset in this and the 
next octet */
+                       unsigned short offset = ((len & 0x3F) << 8) | 
src[idx++];
+                       parse_dns_name(dest, src, offset - 12);
+                       return idx;
+               }
+               memcpy(dest, src+idx, len);
+               idx += len;
+               dest += len;
+               *dest = '.';
+               dest++;
+               len = src[idx++];
+       };
+       *dest = 0;
+
+       return idx;
+}
+/*}}}*/
+
 void pkt_printf_dns(struct dns_pkt* pkt) {{{
        printf("DNS-Packet:\n");
        printf("\tid: %d\n", ntohs(pkt->id));
@@ -266,36 +289,105 @@
        printf("\top: %s\n", (char*[]){"query", "inverse q.", "status", 
"inval"}[pkt->op]);
        printf("\trecursion is%s desired\n", pkt->rd == 0 ? " not" : "");
        unsigned short qdcount = ntohs(pkt->qdcount);
+       unsigned short ancount = ntohs(pkt->ancount);
+       unsigned short nscount = ntohs(pkt->nscount);
+       unsigned short arcount = ntohs(pkt->arcount);
        printf("\t#qd: %d\n", qdcount);
-       printf("\t#an: %d\n", ntohs(pkt->ancount));
-       printf("\t#ns: %d\n", ntohs(pkt->nscount));
-       printf("\t#ar: %d\n", ntohs(pkt->arcount));
+       printf("\t#an: %d\n", ancount);
+       printf("\t#ns: %d\n", nscount);
+       printf("\t#ar: %d\n", arcount);
        
        struct dns_query** queries = alloca(qdcount*sizeof(struct dns_query*));
-       unsigned int idx = 0;
+       struct dns_record** answers = alloca(ancount*sizeof(struct 
dns_record*));
+       struct dns_record** nameserver = alloca(nscount*sizeof(struct 
dns_record*));
+       struct dns_record** additional = alloca(arcount*sizeof(struct 
dns_record*));
+       unsigned short idx = 0;
 
        int i;
-       for (i = 0; i < qdcount; i++) {
+       for (i = 0; i < qdcount; i++) { /*{{{*/
                queries[i] = alloca(sizeof(struct dns_query));
                queries[i]->name = alloca(255); // see RFC1035
                unsigned char* name = queries[i]->name;
-               int len = pkt->data[idx++];
-               while (len != 0) {
-                       memcpy(name, pkt->data+idx, len);
-                       idx += len;
-                       name += len;
-                       *name = '.';
-                       name++;
-                       len = pkt->data[idx++];
-               };
+
+               idx = parse_dns_name(name, pkt->data, idx);
+
                printf("%d\n", idx);
-               *name = 0;
                queries[i]->qtype = *((unsigned short*)(pkt->data+idx));
                idx += 2;
                queries[i]->qclass = *((unsigned short*)(pkt->data+idx));
                idx += 2;
                printf("query for %s type=%d (%s) class=%d (%s)\n", 
queries[i]->name, ntohs(queries[i]->qtype), 
dns_types(ntohs(queries[i]->qtype)), ntohs(queries[i]->qclass), 
dns_classes(ntohs(queries[i]->qclass)));
        }
+       /*}}}*/
+       for (i = 0; i < ancount; i++) { /*{{{*/
+               answers[i] = alloca(sizeof(struct dns_record));
+               answers[i]->name = alloca(255); // see RFC1035
+               unsigned char* name = answers[i]->name;
+
+               idx = parse_dns_name(name, pkt->data, idx);
+
+               printf("%d\n", idx);
+               answers[i]->type = *((unsigned short*)(pkt->data+idx));
+               idx += 2;
+               answers[i]->class = *((unsigned short*)(pkt->data+idx));
+               idx += 2;
+               answers[i]->ttl = *((unsigned int*)(pkt->data+idx));
+               idx += 4;
+               answers[i]->data_len = *((unsigned short*)(pkt->data+idx));
+               idx += 2;
+               answers[i]->data = alloca(ntohs(answers[i]->data_len));
+               memcpy(answers[i]->data, pkt->data+idx, 
ntohs(answers[i]->data_len));
+               idx += ntohs(answers[i]->data_len);
+
+               printf("answer for %s type=%d (%s) class=%d (%s) ttl=%d 
data_len=%d\n", answers[i]->name, ntohs(answers[i]->type), 
dns_types(ntohs(answers[i]->type)), ntohs(answers[i]->class), 
dns_classes(ntohs(answers[i]->class)), ntohl(answers[i]->ttl), 
ntohs(answers[i]->data_len));
+       }
+       /*}}}*/
+       for (i = 0; i < nscount; i++) { /*{{{*/
+               nameserver[i] = alloca(sizeof(struct dns_record));
+               nameserver[i]->name = alloca(255); // see RFC1035
+               unsigned char* name = nameserver[i]->name;
+
+               idx = parse_dns_name(name, pkt->data, idx);
+
+               printf("%d\n", idx);
+               nameserver[i]->type = *((unsigned short*)(pkt->data+idx));
+               idx += 2;
+               nameserver[i]->class = *((unsigned short*)(pkt->data+idx));
+               idx += 2;
+               nameserver[i]->ttl = *((unsigned int*)(pkt->data+idx));
+               idx += 4;
+               nameserver[i]->data_len = *((unsigned short*)(pkt->data+idx));
+               idx += 2;
+               nameserver[i]->data = alloca(ntohs(nameserver[i]->data_len));
+               memcpy(nameserver[i]->data, pkt->data+idx, 
ntohs(nameserver[i]->data_len));
+               idx += ntohs(nameserver[i]->data_len);
+
+               printf("nameserver for %s type=%d (%s) class=%d (%s) ttl=%d 
data_len=%d\n", nameserver[i]->name, ntohs(nameserver[i]->type), 
dns_types(ntohs(nameserver[i]->type)), ntohs(nameserver[i]->class), 
dns_classes(ntohs(nameserver[i]->class)), ntohl(nameserver[i]->ttl), 
ntohs(nameserver[i]->data_len));
+       }
+       /*}}}*/
+       for (i = 0; i < arcount; i++) { /*{{{*/
+               additional[i] = alloca(sizeof(struct dns_query));
+               additional[i]->name = alloca(255); // see RFC1035
+               unsigned char* name = additional[i]->name;
+
+               idx = parse_dns_name(name, pkt->data, idx);
+
+               printf("%d\n", idx);
+               additional[i]->type = *((unsigned short*)(pkt->data+idx));
+               idx += 2;
+               additional[i]->class = *((unsigned short*)(pkt->data+idx));
+               idx += 2;
+               additional[i]->ttl = *((unsigned int*)(pkt->data+idx));
+               idx += 4;
+               additional[i]->data_len = *((unsigned short*)(pkt->data+idx));
+               idx += 2;
+               additional[i]->data = alloca(ntohs(additional[i]->data_len));
+               memcpy(additional[i]->data, pkt->data+idx, 
ntohs(additional[i]->data_len));
+               idx += ntohs(additional[i]->data_len);
+
+               printf("additional record for %s type=%d (%s) class=%d (%s) 
ttl=%d data_len=%d\n", additional[i]->name, ntohs(additional[i]->type), 
dns_types(ntohs(additional[i]->type)), ntohs(additional[i]->class), 
dns_classes(ntohs(additional[i]->class)), ntohl(additional[i]->ttl), 
ntohs(additional[i]->data_len));
+       }
+       /*}}}*/
 }}}
 
 void pkt_printf_udp_dns(struct udp_dns* pkt) {{{




reply via email to

[Prev in Thread] Current Thread [Next in Thread]