gnunet-svn
[Top][All Lists]
Advanced

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

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


From: gnunet
Subject: [GNUnet-SVN] r17594 - gnunet/src/vpn
Date: Tue, 18 Oct 2011 20:41:20 +0200

Author: toelke
Date: 2011-10-18 20:41:19 +0200 (Tue, 18 Oct 2011)
New Revision: 17594

Modified:
   gnunet/src/vpn/gnunet-dns-parser.c
   gnunet/src/vpn/gnunet-dns-parser.h
Log:
allow "unparsing" of dns-packets

Modified: gnunet/src/vpn/gnunet-dns-parser.c
===================================================================
--- gnunet/src/vpn/gnunet-dns-parser.c  2011-10-18 18:41:16 UTC (rev 17593)
+++ gnunet/src/vpn/gnunet-dns-parser.c  2011-10-18 18:41:19 UTC (rev 17594)
@@ -135,6 +135,118 @@
   return ppkt;
 }                               /*}}} */
 
+static void
+unparse_dns_name(char* dest, char* src, size_t len)
+{
+  char *b = dest;
+  char cnt = 0;
+  dest++;
+  while (*src != 0)
+    {
+      while (*src != '.' && *src != 0)
+        {
+          *dest = *src;
+          src++;
+          dest++;
+          cnt++;
+        }
+      *b = cnt;
+      cnt = 0;
+      b = dest;
+      dest++;
+    }
+  *b = 0;
+}
+
+struct dns_pkt *
+unparse_dns_packet (struct dns_pkt_parsed* ppkt)
+{
+  size_t size = sizeof(struct dns_pkt) - 1;
+  int i;
+  for (i = 0; i < ppkt->s.qdcount; i++)
+    size += ppkt->queries[i]->namelen + 1;
+
+  for (i = 0; i < ppkt->s.ancount; i++)
+    {
+      size += ppkt->answers[i]->namelen + 1;
+      size += ppkt->answers[i]->data_len;
+    }
+  for (i = 0; i < ppkt->s.nscount; i++)
+    {
+      size += ppkt->nameservers[i]->namelen + 1;
+      size += ppkt->nameservers[i]->data_len;
+    }
+  for (i = 0; i < ppkt->s.arcount; i++)
+    {
+      size += ppkt->additional[i]->namelen + 1;
+      size += ppkt->additional[i]->data_len;
+    }
+
+  size += 4*ppkt->s.qdcount + 10*(
+                                  ppkt->s.ancount+
+                                  ppkt->s.arcount+
+                                  ppkt->s.nscount);
+
+  struct dns_pkt *pkt = GNUNET_malloc(size);
+  char *pkt_c = (char*)pkt;
+  memcpy(&pkt->s, &ppkt->s, sizeof ppkt->s);
+  size_t idx = sizeof ppkt->s;
+
+  for (i = 0; i < ppkt->s.qdcount; i++)
+    {
+      unparse_dns_name(&pkt_c[idx], ppkt->queries[i]->name, 
ppkt->queries[i]->namelen);
+      idx += ppkt->queries[i]->namelen;
+      struct dns_query_line *d = (struct dns_query_line*)&pkt_c[idx];
+      d->class = ppkt->queries[i]->qclass;
+      d->type = ppkt->queries[i]->qtype;
+      idx += sizeof(struct dns_query_line);
+    }
+
+  for (i = 0; i < ppkt->s.ancount; i++)
+    {
+      unparse_dns_name(&pkt_c[idx], ppkt->answers[i]->name, 
ppkt->answers[i]->namelen);
+      idx += ppkt->answers[i]->namelen;
+      struct dns_record_line *r = (struct dns_record_line*)&pkt_c[idx];
+      r->type = ppkt->answers[i]->type;
+      r->class = ppkt->answers[i]->class;
+      r->ttl = ppkt->answers[i]->ttl;
+      r->data_len = ppkt->answers[i]->data_len;
+      idx += sizeof(struct dns_record_line);
+      memcpy(&r->data, ppkt->answers[i]->data, ppkt->answers[i]->data_len);
+      idx += ppkt->answers[i]->data_len;
+    }
+
+  for (i = 0; i < ppkt->s.nscount; i++)
+    {
+      unparse_dns_name(&pkt_c[idx], ppkt->nameservers[i]->name, 
ppkt->nameservers[i]->namelen);
+      idx += ppkt->nameservers[i]->namelen;
+      struct dns_record_line *r = (struct dns_record_line*)&pkt_c[idx];
+      r->type = ppkt->nameservers[i]->type;
+      r->class = ppkt->nameservers[i]->class;
+      r->ttl = ppkt->nameservers[i]->ttl;
+      r->data_len = ppkt->nameservers[i]->data_len;
+      idx += sizeof(struct dns_record_line);
+      memcpy(&r->data, ppkt->nameservers[i]->data, 
ppkt->nameservers[i]->data_len);
+      idx += ppkt->nameservers[i]->data_len;
+    }
+
+  for (i = 0; i < ppkt->s.arcount; i++)
+    {
+      unparse_dns_name(&pkt_c[idx], ppkt->additional[i]->name, 
ppkt->additional[i]->namelen);
+      idx += ppkt->additional[i]->namelen;
+      struct dns_record_line *r = (struct dns_record_line*)&pkt_c[idx];
+      r->type = ppkt->additional[i]->type;
+      r->class = ppkt->additional[i]->class;
+      r->ttl = ppkt->additional[i]->ttl;
+      r->data_len = ppkt->additional[i]->data_len;
+      idx += sizeof(struct dns_record_line);
+      memcpy(&r->data, ppkt->additional[i]->data, 
ppkt->additional[i]->data_len);
+      idx += ppkt->additional[i]->data_len;
+    }
+
+  return pkt;
+}
+
 void
 free_parsed_dns_packet (struct dns_pkt_parsed *ppkt)
 {

Modified: gnunet/src/vpn/gnunet-dns-parser.h
===================================================================
--- gnunet/src/vpn/gnunet-dns-parser.h  2011-10-18 18:41:16 UTC (rev 17593)
+++ gnunet/src/vpn/gnunet-dns-parser.h  2011-10-18 18:41:19 UTC (rev 17594)
@@ -7,6 +7,9 @@
 struct dns_pkt_parsed *
 parse_dns_packet (struct dns_pkt *pkt);
 
+struct dns_pkt *
+unparse_dns_packet (struct dns_pkt_parsed *pkt);
+
 void
 free_parsed_dns_packet (struct dns_pkt_parsed *ppkt);
 




reply via email to

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