aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPhilipp Tölke <toelke@in.tum.de>2010-11-17 08:55:36 +0000
committerPhilipp Tölke <toelke@in.tum.de>2010-11-17 08:55:36 +0000
commitfbbb198260d8de3021d8245670cd7e1d1adfe0e0 (patch)
treebdafe9ee7575e2db727c05f1495a65cfd33a3e7b /src
parentc38f2bd388d3b7db9720118745862ac1c45a2ffe (diff)
downloadgnunet-fbbb198260d8de3021d8245670cd7e1d1adfe0e0.tar.gz
gnunet-fbbb198260d8de3021d8245670cd7e1d1adfe0e0.zip
Answer Reverse-DNS with the real data
Diffstat (limited to 'src')
-rw-r--r--src/vpn/gnunet-daemon-vpn.c59
1 files changed, 47 insertions, 12 deletions
diff --git a/src/vpn/gnunet-daemon-vpn.c b/src/vpn/gnunet-daemon-vpn.c
index 51c9d1e87..023209e8f 100644
--- a/src/vpn/gnunet-daemon-vpn.c
+++ b/src/vpn/gnunet-daemon-vpn.c
@@ -119,6 +119,15 @@ static struct answer_packet_list *answer_proc_tail;
119 */ 119 */
120static struct GNUNET_CONTAINER_MultiHashMap* hashmap; 120static struct GNUNET_CONTAINER_MultiHashMap* hashmap;
121 121
122struct map_entry {
123 struct GNUNET_vpn_service_descriptor desc;
124 uint16_t namelen;
125 /**
126 * In DNS-Format!
127 */
128 char name[1];
129};
130
122static void helper_read(void* cls, const struct GNUNET_SCHEDULER_TaskContext* tsdkctx); 131static void helper_read(void* cls, const struct GNUNET_SCHEDULER_TaskContext* tsdkctx);
123static void dns_answer_handler(void* cls, const struct GNUNET_MessageHeader *msg); 132static void dns_answer_handler(void* cls, const struct GNUNET_MessageHeader *msg);
124 133
@@ -544,8 +553,14 @@ process_answer(void* cls, const struct GNUNET_SCHEDULER_TaskContext* tc) {
544 memset(&key, 0, sizeof(GNUNET_HashCode)); 553 memset(&key, 0, sizeof(GNUNET_HashCode));
545 new_ip6addr((char*)&key, pkt); 554 new_ip6addr((char*)&key, pkt);
546 555
547 struct GNUNET_vpn_service_descriptor* value = GNUNET_malloc(sizeof(struct GNUNET_vpn_service_descriptor)); 556 uint16_t namelen = strlen((char*)pkt->data+12)+1;
548 memcpy(value, &pkt->service_descr, sizeof(struct GNUNET_vpn_service_descriptor)); 557
558 struct map_entry* value = GNUNET_malloc(sizeof(struct GNUNET_vpn_service_descriptor) + 2 + namelen);
559
560 value->namelen = namelen;
561 memcpy(value->name, pkt->data+12, namelen);
562
563 memcpy(&value->desc, &pkt->service_descr, sizeof(struct GNUNET_vpn_service_descriptor));
549 564
550 if (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put(hashmap, 565 if (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put(hashmap,
551 &key, 566 &key,
@@ -557,24 +572,44 @@ process_answer(void* cls, const struct GNUNET_SCHEDULER_TaskContext* tc) {
557 572
558 memcpy(((char*)pkt)+ntohs(pkt->addroffset), &key, 16); 573 memcpy(((char*)pkt)+ntohs(pkt->addroffset), &key, 16);
559 574
560 /*FIXME:
561 * -save DNS_Record into hashmap, pointed to by ip
562 * -regularily walk through hashmap, deleting old entries
563 * when is an entry old?
564 * have a last-used field
565 * don't remove if last-used "recent", ask dht again if record expired
566 */
567
568 list = GNUNET_malloc(htons(pkt->hdr.size) + 2*sizeof(struct answer_packet_list*)); 575 list = GNUNET_malloc(htons(pkt->hdr.size) + 2*sizeof(struct answer_packet_list*));
569 576
570 memcpy(&list->pkt, pkt, htons(pkt->hdr.size)); 577 memcpy(&list->pkt, pkt, htons(pkt->hdr.size));
578
571 } 579 }
572 else if (pkt->subtype == GNUNET_DNS_ANSWER_TYPE_REV) 580 else if (pkt->subtype == GNUNET_DNS_ANSWER_TYPE_REV)
573 { 581 {
582 GNUNET_HashCode key;
583 memset(&key, 0, sizeof key);
584 unsigned char* k = (unsigned char*)&key;
585 unsigned char* s = pkt->data+12;
586 int i = 0;
587 /* Whoever designed the reverse IPv6-lookup is batshit insane */
588 for (i = 0; i < 16; i++)
589 {
590 unsigned char c1 = s[(4*i)+1];
591 unsigned char c2 = s[(4*i)+3];
592 if (c1 <= '9')
593 k[15-i] = c1 - '0';
594 else
595 k[15-i] = c1 - 87; /* 87 is the difference between 'a' and 10 */
596 if (c2 <= '9')
597 k[15-i] += 16*(c2 - '0');
598 else
599 k[15-i] += 16*(c2 - 87);
600 }
601
602 struct map_entry* map_entry = GNUNET_CONTAINER_multihashmap_get(hashmap, &key);
574 unsigned short offset = ntohs(pkt->addroffset); 603 unsigned short offset = ntohs(pkt->addroffset);
575 604
576 unsigned short namelen = htons(22); /* calculate the length of the answer */ 605 if (map_entry == NULL)
577 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}; 606 {
607 GNUNET_free(pkt);
608 return;
609 }
610
611 unsigned short namelen = htons(map_entry->namelen);
612 char* name = map_entry->name;
578 613
579 list = GNUNET_malloc(2*sizeof(struct answer_packet_list*) + offset + 2 + ntohs(namelen)); 614 list = GNUNET_malloc(2*sizeof(struct answer_packet_list*) + offset + 2 + ntohs(namelen));
580 615