-fix mx records postprocessing
authorMartin Schanzenbach <mschanzenbach@posteo.de>
Mon, 19 Mar 2012 12:20:30 +0000 (12:20 +0000)
committerMartin Schanzenbach <mschanzenbach@posteo.de>
Mon, 19 Mar 2012 12:20:30 +0000 (12:20 +0000)
src/gns/gnunet-service-gns_interceptor.c
src/gns/gnunet-service-gns_resolver.c
src/gns/test_gns_simple_mx_lookup.c

index 25cad7ead21f42e7aae192208d71a36219e8176f..4160893ad4393ae274faf4e2d00a89d1b354fa9a 100644 (file)
@@ -114,8 +114,25 @@ reply_to_dns(void* cls, uint32_t rd_count,
     {
       answer_records[i].name = ilh->query->name;
       answer_records[i].type = rd[i].record_type;
-      answer_records[i].data.raw.data_len = rd[i].data_size;
-      answer_records[i].data.raw.data = (char*)rd[i].data;
+      switch(rd[i].record_type)
+      {
+       case GNUNET_GNS_RECORD_TYPE_NS:
+       case GNUNET_GNS_RECORD_TYPE_CNAME:
+       case GNUNET_GNS_RECORD_TYPE_PTR:
+         answer_records[i].data.hostname = (char*)rd[i].data;
+         break;
+       case GNUNET_GNS_RECORD_TYPE_SOA:
+         answer_records[i].data.soa =
+           (struct GNUNET_DNSPARSER_SoaRecord *)rd[i].data;
+         break;
+       case GNUNET_GNS_RECORD_MX:
+         answer_records[i].data.mx =
+           (struct GNUNET_DNSPARSER_MxRecord *)rd[i].data;
+         break;
+       default:
+        answer_records[i].data.raw.data_len = rd[i].data_size;
+        answer_records[i].data.raw.data = (char*)rd[i].data;
+      }
       answer_records[i].expiration_time = rd[i].expiration;
       answer_records[i].class = GNUNET_DNSPARSER_CLASS_INTERNET;//hmmn
     }
index f30f67b571d27894a76977cace23b1ff698525f8..077dca03996b816fb5263be803e7c6e42fa6eebc 100644 (file)
@@ -954,10 +954,12 @@ finish_lookup(struct ResolverHandle *rh,
   int i;
   char* s_value;
   char new_s_value[256];
+  char new_mx_value[sizeof(struct GNUNET_DNSPARSER_MxRecord)+256];
   int s_len;
   struct GNUNET_NAMESTORE_RecordData p_rd[rd_count];
   char* pos;
   char* trailer;
+  struct GNUNET_DNSPARSER_MxRecord *mx;
 
   if (rd_count > 0)
     memcpy(p_rd, rd, rd_count*sizeof(struct GNUNET_NAMESTORE_RecordData));
@@ -978,11 +980,21 @@ finish_lookup(struct ResolverHandle *rh,
      * also try to resolve the A/AAAA records (RFC1035)
      * FIXME
      */
-    s_value = (char*)rd[i].data;
-    s_len = rd[i].data_size;
+    if (rd[i].record_type == GNUNET_GNS_RECORD_MX)
+    {
+      mx = (struct GNUNET_DNSPARSER_MxRecord*)rd[i].data;
+      s_value = (char*)&mx[1];
+    }
+    else
+    {
+      s_value = (char*)rd[i].data;
+    }
+    
+    s_len = strlen(s_value)+1;
 
     if (s_len < 3)
     {
+      /* no postprocessing */
       p_rd[i].data = rd[i].data;
       continue;
     }
@@ -1007,8 +1019,24 @@ finish_lookup(struct ResolverHandle *rh,
       pos = new_s_value+s_len-2;
       strcpy(pos, trailer);
       pos += strlen(trailer);
-      p_rd[i].data = new_s_value;
-      p_rd[i].data_size = strlen(new_s_value)+1;
+      if (rd[i].record_type == GNUNET_GNS_RECORD_MX)
+      {
+
+        p_rd[i].data_size = sizeof(struct GNUNET_DNSPARSER_MxRecord)
+          +strlen(new_s_value)+1;
+        
+        p_rd[i].data = new_mx_value;
+        mx = (struct GNUNET_DNSPARSER_MxRecord*)p_rd[i].data;
+        mx->preference =
+          ((struct GNUNET_DNSPARSER_MxRecord*)rd[i].data)->preference;
+        memcpy((char*)&mx[1], new_s_value, strlen(new_s_value)+1);
+        mx->mxhost = (char*)&mx[1];
+      }
+      else
+      {
+        p_rd[i].data = new_s_value;
+        p_rd[i].data_size = strlen(new_s_value)+1;
+      }
       GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
                  "Expanded to %s\n", new_s_value);
     }
index 1f39b175fef91fda71a79f0c35ba7c3cb9c7329a..7f854c6f32d3813b4d5fe4578e67a828669d828c 100644 (file)
@@ -97,7 +97,7 @@ on_lookup_result(void *cls, uint32_t rd_count,
   char* addr;
   int mx_found = 0;
   int ip_found = 0;
-  char* mx;
+  struct GNUNET_DNSPARSER_MxRecord *mx;
   
   if (rd_count == 0)
   {
@@ -126,8 +126,11 @@ on_lookup_result(void *cls, uint32_t rd_count,
       }
       else if (rd[i].record_type == GNUNET_GNS_RECORD_MX)
       {
-        mx = (char*)rd[i].data;
-        if (0 == strcmp(mx, TEST_EXPECTED_MX))
+        mx = (struct GNUNET_DNSPARSER_MxRecord*)rd[i].data;
+        mx->mxhost = (char*)&mx[1];
+        GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+                    "Got MX %s\n", mx->mxhost);
+        if (0 == strcmp(mx->mxhost, TEST_EXPECTED_MX))
         {
           GNUNET_log (GNUNET_ERROR_TYPE_INFO,
                       "%s correctly resolved to %s!\n", TEST_DOMAIN,
@@ -250,6 +253,7 @@ do_lookup(void *cls, const struct GNUNET_PeerIdentity *id,
   struct GNUNET_NAMESTORE_RecordData rd;
   char* ip = TEST_IP;
   struct in_addr *mail = GNUNET_malloc(sizeof(struct in_addr));
+  struct GNUNET_DNSPARSER_MxRecord *mx_record;
   rd.expiration = GNUNET_TIME_absolute_get_forever ();
   GNUNET_assert(1 == inet_pton (AF_INET, ip, mail));
   
@@ -283,9 +287,13 @@ do_lookup(void *cls, const struct GNUNET_PeerIdentity *id,
                                sig,
                                NULL,
                                NULL);
-
-  rd.data_size = strlen(TEST_MX_NAME)+1;
-  rd.data = TEST_MX_NAME;
+  
+  rd.data_size = sizeof(struct GNUNET_DNSPARSER_MxRecord)+strlen(TEST_MX_NAME)+1;
+  mx_record = GNUNET_malloc(rd.data_size);
+  mx_record->preference = 1;
+  mx_record->mxhost = (char*)&mx_record[1];
+  strcpy(mx_record->mxhost, TEST_MX_NAME);
+  rd.data = mx_record;
   rd.record_type = GNUNET_GNS_RECORD_MX;
   sig = GNUNET_NAMESTORE_create_signature(bob_key,
                                           GNUNET_TIME_absolute_get_forever(),
@@ -300,6 +308,7 @@ do_lookup(void *cls, const struct GNUNET_PeerIdentity *id,
                                sig,
                                &commence_testing,
                                NULL);
+  GNUNET_free(mx_record);
   GNUNET_free(mail);
   GNUNET_free(sig);
   GNUNET_CRYPTO_rsa_key_free(bob_key);