-proper data layout vpn record
authorMartin Schanzenbach <mschanzenbach@posteo.de>
Sat, 16 Jun 2012 19:22:49 +0000 (19:22 +0000)
committerMartin Schanzenbach <mschanzenbach@posteo.de>
Sat, 16 Jun 2012 19:22:49 +0000 (19:22 +0000)
src/gns/gnunet-service-gns_resolver.c
src/namestore/namestore_common.c

index 7ce45e651f0cb3bacc96f856ef3a479449b3af50..0753125d49be36b3ff903a428a27dac32489126f 100644 (file)
@@ -1593,6 +1593,8 @@ resolve_record_vpn (struct ResolverHandle *rh,
   struct GNUNET_CRYPTO_HashAsciiEncoded s_pid;
   struct GNUNET_HashCode serv_desc;
   struct GNUNET_CRYPTO_HashAsciiEncoded s_sd;
+  char* pos;
+  size_t len = (sizeof (uint32_t) * 2) + (sizeof (struct GNUNET_HashCode) * 2);
   
   /* We cancel here as to not include the ns lookup in the timeout */
   if (rh->timeout_task != GNUNET_SCHEDULER_NO_TASK)
@@ -1611,8 +1613,7 @@ resolve_record_vpn (struct ResolverHandle *rh,
   }
 
   /* Extracting VPN information FIXME rd parsing with NS API?*/
-  if (4 != SSCANF ((char*)rd, "%d:%d:%s:%s", &af, &proto,
-                   (char*)&s_pid, (char*)&s_sd))
+  if (len != rd->data_size)
   {
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                 "GNS_PHASE_REC_VPN-%llu: Error parsing VPN RR!\n",
@@ -1621,6 +1622,16 @@ resolve_record_vpn (struct ResolverHandle *rh,
     return;
   }
 
+  pos = (char*)rd;
+  memcpy (&af, pos, sizeof (uint32_t));
+  pos += sizeof (uint32_t);
+  memcpy (&proto, pos, sizeof (uint32_t));
+  pos += sizeof (uint32_t);
+  memcpy (&s_pid, pos, sizeof (struct GNUNET_HashCode));
+  pos += sizeof (struct GNUNET_HashCode);
+  memcpy (&s_sd, pos, sizeof (struct GNUNET_HashCode));
+
+
   if ((GNUNET_OK != GNUNET_CRYPTO_hash_from_string ((char*)&s_pid, &peer_id)) ||
       (GNUNET_OK != GNUNET_CRYPTO_hash_from_string ((char*)&s_sd, &serv_desc)))
   {
index 15a48cf36b60aa570b4d693440f2d9bab8e6ba70..2b34a84e7086fc5df982f4296fb834d9cea733d8 100644 (file)
@@ -319,6 +319,13 @@ GNUNET_NAMESTORE_value_to_string (uint32_t type,
   uint32_t soa_retry;
   uint32_t soa_expire;
   uint32_t soa_min;
+  uint32_t *af;
+  uint32_t *proto;
+  char* vpn_str;
+  struct GNUNET_HashCode *h_peer;
+  struct GNUNET_HashCode *h_serv;
+  struct GNUNET_CRYPTO_HashAsciiEncoded s_peer;
+  struct GNUNET_CRYPTO_HashAsciiEncoded s_serv;
 
   switch (type)
   {
@@ -377,7 +384,16 @@ GNUNET_NAMESTORE_value_to_string (uint32_t type,
   case GNUNET_NAMESTORE_TYPE_LEHO:
     return GNUNET_strndup (data, data_size);
   case GNUNET_NAMESTORE_TYPE_VPN:
-    return GNUNET_strndup (data, data_size);
+    af = (uint32_t*)data;
+    proto = (uint32_t*)((char*)af + sizeof (uint32_t));
+    h_peer = (struct GNUNET_HashCode*)((char*)proto + sizeof (struct GNUNET_HashCode));
+    h_serv = (struct GNUNET_HashCode*)((char*)h_peer + sizeof (struct GNUNET_HashCode));
+
+    GNUNET_CRYPTO_hash_to_enc (h_peer, &s_peer);
+    GNUNET_CRYPTO_hash_to_enc (h_serv, &s_serv);
+    if (GNUNET_OK != GNUNET_asprintf (&vpn_str, "%d:%d:%s:%s", af, proto, (char*)&s_peer, (char*)&s_serv))
+      return NULL;
+    return vpn_str;
   default:
     GNUNET_break (0);
   }
@@ -416,11 +432,12 @@ GNUNET_NAMESTORE_string_to_value (uint32_t type,
   uint32_t soa_retry;
   uint32_t soa_expire;
   uint32_t soa_min;
-  struct GNUNET_HashCode hash;
+  struct GNUNET_HashCode *h_peer;
+  struct GNUNET_HashCode *h_serv;
   struct GNUNET_CRYPTO_HashAsciiEncoded s_peer;
   struct GNUNET_CRYPTO_HashAsciiEncoded s_serv;
-  int af;
-  int proto;
+  uint32_t* af;
+  uint32_t* proto;
   
   switch (type)
   {
@@ -503,18 +520,26 @@ GNUNET_NAMESTORE_string_to_value (uint32_t type,
     *data_size = strlen (s);
     return GNUNET_OK;
   case GNUNET_NAMESTORE_TYPE_VPN:
+    
+    *data_size = sizeof (uint32_t) * 2;
+    *data_size += sizeof (struct GNUNET_HashCode) * 2;
+    *data = GNUNET_malloc (*data_size);
+    af = (uint32_t*)(*data);
+    proto = (uint32_t*) ((char*)af + sizeof (uint32_t));
+    h_peer = (struct GNUNET_HashCode*)((char*)proto + sizeof (uint32_t));
+    h_serv = (struct GNUNET_HashCode*)((char*)h_peer + sizeof (struct GNUNET_HashCode));
+    
     if (4 != SSCANF (s,"%d:%d:%s:%s",
-                     &af, &proto, (char*)&s_peer, (char*)&s_serv))
+                     af, proto, (char*)&s_peer, (char*)&s_serv))
     {
       return GNUNET_SYSERR;
     }
-    if ((GNUNET_OK != GNUNET_CRYPTO_hash_from_string ((char*)&s_peer, &hash)) ||
-        (GNUNET_OK != GNUNET_CRYPTO_hash_from_string ((char*)&s_serv, &hash)))
+    if ((GNUNET_OK != GNUNET_CRYPTO_hash_from_string ((char*)&s_peer, h_peer)) ||
+        (GNUNET_OK != GNUNET_CRYPTO_hash_from_string ((char*)&s_serv, h_serv)))
     {
+      GNUNET_free (*data);
       return GNUNET_SYSERR;
     }
-    *data = GNUNET_strdup (s);
-    *data_size = strlen (s);
     return GNUNET_OK;
   default:
     GNUNET_break (0);