gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r22812 - gnunet/src/gns


From: gnunet
Subject: [GNUnet-SVN] r22812 - gnunet/src/gns
Date: Sat, 21 Jul 2012 15:55:14 +0200

Author: grothoff
Date: 2012-07-21 15:55:13 +0200 (Sat, 21 Jul 2012)
New Revision: 22812

Modified:
   gnunet/src/gns/gnunet-dns2gns.c
Log:
-more work on dns2gns

Modified: gnunet/src/gns/gnunet-dns2gns.c
===================================================================
--- gnunet/src/gns/gnunet-dns2gns.c     2012-07-20 20:18:49 UTC (rev 22811)
+++ gnunet/src/gns/gnunet-dns2gns.c     2012-07-21 13:55:13 UTC (rev 22812)
@@ -175,8 +175,10 @@
 {
   struct Request *request = cls;
 
-  GNUNET_DNSPARSER_free_packet (request->packet);
-  GNUNET_GNS_cancel_lookup_request (request->lookup);
+  if (NULL != request->packet)
+    GNUNET_DNSPARSER_free_packet (request->packet);
+  if (NULL != request->lookup)
+    GNUNET_GNS_cancel_lookup_request (request->lookup);
   GNUNET_free (request);
 }
 
@@ -196,12 +198,57 @@
                  const struct GNUNET_NAMESTORE_RecordData *rd)
 {
   struct Request *request = cls;
+  struct GNUNET_DNSPARSER_Packet *packet;
+  uint32_t i;
+  struct GNUNET_DNSPARSER_Record rec;
 
-  // FIXME: is 'processor' called only once or
-  // possibly more than once?
   request->lookup = NULL;
-  GNUNET_break (0);
-  // FIXME: convert 'rd' to response here...
+  packet = request->packet;
+  packet->flags.query_or_response = 1;
+  packet->flags.return_code = GNUNET_DNSPARSER_RETURN_CODE_NO_ERROR;
+  packet->flags.checking_disabled = 0;
+  packet->flags.authenticated_data = 1;
+  packet->flags.zero = 0;
+  packet->flags.recursion_available = 1;
+  packet->flags.message_truncated = 0;
+  packet->flags.authoritative_answer = 0;
+  packet->flags.opcode = GNUNET_DNSPARSER_OPCODE_STATUS; // ???
+  for (i=0;i<rd_count;i++)
+    {
+      switch (rd[i].record_type)
+       {
+       case GNUNET_DNSPARSER_TYPE_A:
+         GNUNET_assert (sizeof (struct in_addr) == rd[i].data_size);
+         rec.name = GNUNET_strdup (packet->queries[0].name);
+         rec.data.raw.data = GNUNET_malloc (sizeof (struct in_addr));
+         memcpy (rec.data.raw.data,
+                 rd[i].data,
+                 rd[i].data_size);
+         rec.data.raw.data_len = sizeof (struct in_addr);
+         GNUNET_array_append (packet->answers,
+                              packet->num_answers,
+                              rec);
+         break;
+       case GNUNET_DNSPARSER_TYPE_AAAA:
+         GNUNET_assert (sizeof (struct in6_addr) == rd[i].data_size);
+         rec.name = GNUNET_strdup ("foo"); // request->name
+         rec.data.raw.data = GNUNET_malloc (sizeof (struct in6_addr));
+         memcpy (rec.data.raw.data,
+                 rd[i].data,
+                 rd[i].data_size);
+         rec.data.raw.data_len = sizeof (struct in6_addr);
+         GNUNET_array_append (packet->answers,
+                              packet->num_answers,
+                              rec);
+         break;
+       case GNUNET_DNSPARSER_TYPE_CNAME:
+         GNUNET_break (0); // FIXME: not implemented!
+         break;
+       default:
+         /* skip */
+         break;
+       }
+    }
   send_response (request);
 }
 
@@ -224,6 +271,9 @@
 {
   struct Request *request;
   struct GNUNET_DNSPARSER_Packet *packet;
+  char *name;
+  size_t name_len;
+  enum GNUNET_GNS_RecordType type;
 
   packet = GNUNET_DNSPARSER_parse (udp_msg, udp_msg_size);
   if (NULL == packet)
@@ -233,6 +283,25 @@
                  GNUNET_a2s (addr, addr_len));
       return;
     }
+  if ( (0 != packet->flags.query_or_response) || 
+       (0 != packet->num_answers) ||
+       (0 != packet->num_authority_records) ||
+       (0 != packet->num_additional_records) )
+    {
+      GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                 _("Received malformed DNS request from %s\n"),
+                 GNUNET_a2s (addr, addr_len));
+      GNUNET_DNSPARSER_free_packet (packet);
+      return;
+    }
+  if ( (1 != packet->num_queries) )
+    {
+      GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                 _("Received unsupported DNS request from %s\n"),
+                 GNUNET_a2s (addr, addr_len));
+      GNUNET_DNSPARSER_free_packet (packet);
+      return;
+    }
   request = GNUNET_malloc (sizeof (struct Request) + addr_len);
   request->lsock = lsock;
   request->packet = packet;
@@ -242,16 +311,38 @@
   request->timeout_task = GNUNET_SCHEDULER_add_delayed (TIMEOUT,
                                                        &do_timeout,
                                                        request);
-  // FIXME: extract name and type from 'request->packet'
-  const char *name = "foo";
-  enum GNUNET_GNS_RecordType type = GNUNET_GNS_RECORD_A;
-  request->lookup = GNUNET_GNS_lookup (gns,
-                                      name,
-                                      type,
-                                      GNUNET_NO,
-                                      NULL,
-                                      &result_processor,
-                                      request);
+  name = GNUNET_strdup (packet->queries[0].name);
+  name_len = strlen (name);
+  if ( (name_len > strlen (".zkey.eu")) &&
+       (0 == strcasecmp (".zkey.eu",
+                        &name[name_len - strlen (".zkey.eu")])) )
+    {
+      name[name_len - strlen (".zkey.eu")] = '\0';
+      strcat (name, ".gnunet"); /* little hack, only works because
+                                  ".zkey.eu" is longer than ".gnunet" */
+      name_len = strlen (name);
+    }
+  if ( (name_len > strlen (".gnunet")) &&
+       (0 == strcasecmp (".gnunet",
+                        &name[name_len - strlen (".gnunet")])) )
+    {
+      type = packet->queries[0].type;
+      request->lookup = GNUNET_GNS_lookup (gns,
+                                          name,
+                                          type,
+                                          GNUNET_NO,
+                                          NULL,
+                                          &result_processor,
+                                          request);
+    }
+  else
+    {
+      /* FIXME: do traditional *DNS* lookup; note that
+        gnunet-service-dns already has code to do this;
+        factor into library to share! */
+      GNUNET_break (0);
+    }
+  GNUNET_free (name);
 }
 
 




reply via email to

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