[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r13713 - gnunet/src/vpn
From: |
gnunet |
Subject: |
[GNUnet-SVN] r13713 - gnunet/src/vpn |
Date: |
Wed, 17 Nov 2010 09:55:36 +0100 |
Author: toelke
Date: 2010-11-17 09:55:36 +0100 (Wed, 17 Nov 2010)
New Revision: 13713
Modified:
gnunet/src/vpn/gnunet-daemon-vpn.c
Log:
Answer Reverse-DNS with the real data
Modified: gnunet/src/vpn/gnunet-daemon-vpn.c
===================================================================
--- gnunet/src/vpn/gnunet-daemon-vpn.c 2010-11-17 08:55:35 UTC (rev 13712)
+++ gnunet/src/vpn/gnunet-daemon-vpn.c 2010-11-17 08:55:36 UTC (rev 13713)
@@ -119,6 +119,15 @@
*/
static struct GNUNET_CONTAINER_MultiHashMap* hashmap;
+struct map_entry {
+ struct GNUNET_vpn_service_descriptor desc;
+ uint16_t namelen;
+ /**
+ * In DNS-Format!
+ */
+ char name[1];
+};
+
static void helper_read(void* cls, const struct GNUNET_SCHEDULER_TaskContext*
tsdkctx);
static void dns_answer_handler(void* cls, const struct GNUNET_MessageHeader
*msg);
@@ -544,9 +553,15 @@
memset(&key, 0, sizeof(GNUNET_HashCode));
new_ip6addr((char*)&key, pkt);
- struct GNUNET_vpn_service_descriptor* value =
GNUNET_malloc(sizeof(struct GNUNET_vpn_service_descriptor));
- memcpy(value, &pkt->service_descr, sizeof(struct
GNUNET_vpn_service_descriptor));
+ uint16_t namelen = strlen((char*)pkt->data+12)+1;
+ struct map_entry* value = GNUNET_malloc(sizeof(struct
GNUNET_vpn_service_descriptor) + 2 + namelen);
+
+ value->namelen = namelen;
+ memcpy(value->name, pkt->data+12, namelen);
+
+ memcpy(&value->desc, &pkt->service_descr, sizeof(struct
GNUNET_vpn_service_descriptor));
+
if (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put(hashmap,
&key,
value,
@@ -557,25 +572,45 @@
memcpy(((char*)pkt)+ntohs(pkt->addroffset), &key, 16);
- /*FIXME:
- * -save DNS_Record into hashmap, pointed to by ip
- * -regularily walk through hashmap, deleting old entries
- * when is an entry old?
- * have a last-used field
- * don't remove if last-used "recent", ask dht again if record
expired
- */
-
list = GNUNET_malloc(htons(pkt->hdr.size) + 2*sizeof(struct
answer_packet_list*));
memcpy(&list->pkt, pkt, htons(pkt->hdr.size));
+
}
else if (pkt->subtype == GNUNET_DNS_ANSWER_TYPE_REV)
{
+ GNUNET_HashCode key;
+ memset(&key, 0, sizeof key);
+ unsigned char* k = (unsigned char*)&key;
+ unsigned char* s = pkt->data+12;
+ int i = 0;
+ /* Whoever designed the reverse IPv6-lookup is batshit insane */
+ for (i = 0; i < 16; i++)
+ {
+ unsigned char c1 = s[(4*i)+1];
+ unsigned char c2 = s[(4*i)+3];
+ if (c1 <= '9')
+ k[15-i] = c1 - '0';
+ else
+ k[15-i] = c1 - 87; /* 87 is the difference between 'a' and 10 */
+ if (c2 <= '9')
+ k[15-i] += 16*(c2 - '0');
+ else
+ k[15-i] += 16*(c2 - 87);
+ }
+
+ struct map_entry* map_entry =
GNUNET_CONTAINER_multihashmap_get(hashmap, &key);
unsigned short offset = ntohs(pkt->addroffset);
- unsigned short namelen = htons(22); /* calculate the length of the
answer */
- char name[22] = {13, 'p', 'h', 'i', 'l', 'i', 'p', 'p', 't', 'o', 'e',
'l', 'k', 'e', 6, 'g', 'n', 'u', 'n', 'e', 't', 0};
+ if (map_entry == NULL)
+ {
+ GNUNET_free(pkt);
+ return;
+ }
+ unsigned short namelen = htons(map_entry->namelen);
+ char* name = map_entry->name;
+
list = GNUNET_malloc(2*sizeof(struct answer_packet_list*) + offset + 2
+ ntohs(namelen));
struct answer_packet* rpkt = &list->pkt;
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r13713 - gnunet/src/vpn,
gnunet <=