diff options
author | Philipp Tölke <toelke@in.tum.de> | 2010-11-17 08:55:36 +0000 |
---|---|---|
committer | Philipp Tölke <toelke@in.tum.de> | 2010-11-17 08:55:36 +0000 |
commit | fbbb198260d8de3021d8245670cd7e1d1adfe0e0 (patch) | |
tree | bdafe9ee7575e2db727c05f1495a65cfd33a3e7b /src | |
parent | c38f2bd388d3b7db9720118745862ac1c45a2ffe (diff) | |
download | gnunet-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.c | 59 |
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 | */ |
120 | static struct GNUNET_CONTAINER_MultiHashMap* hashmap; | 120 | static struct GNUNET_CONTAINER_MultiHashMap* hashmap; |
121 | 121 | ||
122 | struct 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 | |||
122 | static void helper_read(void* cls, const struct GNUNET_SCHEDULER_TaskContext* tsdkctx); | 131 | static void helper_read(void* cls, const struct GNUNET_SCHEDULER_TaskContext* tsdkctx); |
123 | static void dns_answer_handler(void* cls, const struct GNUNET_MessageHeader *msg); | 132 | static 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 | ||