diff options
author | Philipp Tölke <toelke@in.tum.de> | 2011-11-02 10:13:59 +0000 |
---|---|---|
committer | Philipp Tölke <toelke@in.tum.de> | 2011-11-02 10:13:59 +0000 |
commit | 205e3bf8b151fcce80e8682fa5dc722356b11689 (patch) | |
tree | 5ddec1a75547a5c46f018d22bc2400bad7afe0cd /src/vpn/gnunet-service-dns.c | |
parent | 41cf51c0ed0dfc2f0a932575bd69651a12ae56b6 (diff) | |
download | gnunet-205e3bf8b151fcce80e8682fa5dc722356b11689.tar.gz gnunet-205e3bf8b151fcce80e8682fa5dc722356b11689.zip |
handle client connections
fix #1855
Diffstat (limited to 'src/vpn/gnunet-service-dns.c')
-rw-r--r-- | src/vpn/gnunet-service-dns.c | 54 |
1 files changed, 41 insertions, 13 deletions
diff --git a/src/vpn/gnunet-service-dns.c b/src/vpn/gnunet-service-dns.c index 806c4745a..6f9d0f1ad 100644 --- a/src/vpn/gnunet-service-dns.c +++ b/src/vpn/gnunet-service-dns.c | |||
@@ -125,6 +125,27 @@ struct tunnel_state | |||
125 | struct GNUNET_MESH_TransmitHandle *th; | 125 | struct GNUNET_MESH_TransmitHandle *th; |
126 | }; | 126 | }; |
127 | 127 | ||
128 | static void | ||
129 | client_disconnect(void* cls, struct GNUNET_SERVER_Client *client) | ||
130 | { | ||
131 | if (NULL == head) return; | ||
132 | |||
133 | struct answer_packet_list *element = head; | ||
134 | while (element != NULL) | ||
135 | { | ||
136 | if (element->client == client) | ||
137 | { | ||
138 | GNUNET_SERVER_client_drop(client); | ||
139 | GNUNET_CONTAINER_DLL_remove(head, tail, element); | ||
140 | struct answer_packet_list* t = element; | ||
141 | element = element->next; | ||
142 | GNUNET_free(t); | ||
143 | } | ||
144 | else | ||
145 | element = element->next; | ||
146 | } | ||
147 | } | ||
148 | |||
128 | /** | 149 | /** |
129 | * Hijack all outgoing DNS-Traffic but for traffic leaving "our" port. | 150 | * Hijack all outgoing DNS-Traffic but for traffic leaving "our" port. |
130 | */ | 151 | */ |
@@ -238,14 +259,14 @@ send_answer (void *cls, size_t size, void *buf) | |||
238 | 259 | ||
239 | GNUNET_CONTAINER_DLL_remove (head, tail, query); | 260 | GNUNET_CONTAINER_DLL_remove (head, tail, query); |
240 | 261 | ||
241 | GNUNET_free (query); | ||
242 | |||
243 | /* When more data is to be sent, reschedule */ | 262 | /* When more data is to be sent, reschedule */ |
244 | if (head != NULL) | 263 | if (head != NULL) |
245 | server_notify = GNUNET_SERVER_notify_transmit_ready (cls, ntohs (head->pkt.hdr.size), | 264 | server_notify = GNUNET_SERVER_notify_transmit_ready (head->client, ntohs (head->pkt.hdr.size), |
246 | GNUNET_TIME_UNIT_FOREVER_REL, | 265 | GNUNET_TIME_UNIT_FOREVER_REL, |
247 | &send_answer, cls); | 266 | &send_answer, NULL); |
248 | 267 | ||
268 | GNUNET_SERVER_client_drop(query->client); | ||
269 | GNUNET_free (query); | ||
249 | return len; | 270 | return len; |
250 | } | 271 | } |
251 | 272 | ||
@@ -496,7 +517,7 @@ receive_mesh_answer (void *cls | |||
496 | + sizeof (struct dns_record_line) - 1 + 16; /* To hold the IPv6-Address */ | 517 | + sizeof (struct dns_record_line) - 1 + 16; /* To hold the IPv6-Address */ |
497 | 518 | ||
498 | struct answer_packet_list *answer = | 519 | struct answer_packet_list *answer = |
499 | GNUNET_malloc (len + 2 * sizeof (struct answer_packet_list *)); | 520 | GNUNET_malloc (len + sizeof(struct answer_packet_list) - sizeof(struct answer_packet)); |
500 | 521 | ||
501 | answer->pkt.hdr.type = htons (GNUNET_MESSAGE_TYPE_VPN_DNS_LOCAL_RESPONSE_DNS); | 522 | answer->pkt.hdr.type = htons (GNUNET_MESSAGE_TYPE_VPN_DNS_LOCAL_RESPONSE_DNS); |
502 | answer->pkt.hdr.size = htons (len); | 523 | answer->pkt.hdr.size = htons (len); |
@@ -599,12 +620,13 @@ receive_mesh_answer (void *cls | |||
599 | (unsigned long) (&answer->pkt))); | 620 | (unsigned long) (&answer->pkt))); |
600 | 621 | ||
601 | GNUNET_CONTAINER_DLL_insert_after (head, tail, tail, answer); | 622 | GNUNET_CONTAINER_DLL_insert_after (head, tail, tail, answer); |
623 | answer->client = query_states[dns->s.id].client; | ||
602 | 624 | ||
603 | if (server_notify == NULL) | 625 | if (server_notify == NULL) |
604 | server_notify = GNUNET_SERVER_notify_transmit_ready (query_states[dns->s.id].client, len, | 626 | server_notify = GNUNET_SERVER_notify_transmit_ready (query_states[dns->s.id].client, len, |
605 | GNUNET_TIME_UNIT_FOREVER_REL, | 627 | GNUNET_TIME_UNIT_FOREVER_REL, |
606 | &send_answer, | 628 | &send_answer, |
607 | query_states[dns->s.id].client); | 629 | NULL); |
608 | 630 | ||
609 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 631 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |
610 | "Sent answer of length %d on to client, addroffset = %d\n", len, | 632 | "Sent answer of length %d on to client, addroffset = %d\n", len, |
@@ -639,7 +661,7 @@ send_rev_query (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) | |||
639 | 2 /* We do not know the lenght of the answer yet */ ; | 661 | 2 /* We do not know the lenght of the answer yet */ ; |
640 | 662 | ||
641 | struct answer_packet_list *answer = | 663 | struct answer_packet_list *answer = |
642 | GNUNET_malloc (len + 2 * sizeof (struct answer_packet_list *)); | 664 | GNUNET_malloc (len + sizeof(struct answer_packet_list) - sizeof(struct answer_packet)); |
643 | 665 | ||
644 | answer->pkt.hdr.type = htons (GNUNET_MESSAGE_TYPE_VPN_DNS_LOCAL_RESPONSE_DNS); | 666 | answer->pkt.hdr.type = htons (GNUNET_MESSAGE_TYPE_VPN_DNS_LOCAL_RESPONSE_DNS); |
645 | answer->pkt.hdr.size = htons (len); | 667 | answer->pkt.hdr.size = htons (len); |
@@ -692,11 +714,12 @@ send_rev_query (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) | |||
692 | (unsigned long) (&answer->pkt))); | 714 | (unsigned long) (&answer->pkt))); |
693 | 715 | ||
694 | GNUNET_CONTAINER_DLL_insert_after (head, tail, tail, answer); | 716 | GNUNET_CONTAINER_DLL_insert_after (head, tail, tail, answer); |
717 | answer->client = query_states[id].client; | ||
695 | 718 | ||
696 | if (server_notify == NULL) | 719 | if (server_notify == NULL) |
697 | server_notify = GNUNET_SERVER_notify_transmit_ready (query_states[id].client, len, | 720 | server_notify = GNUNET_SERVER_notify_transmit_ready (query_states[id].client, len, |
698 | GNUNET_TIME_UNIT_FOREVER_REL, | 721 | GNUNET_TIME_UNIT_FOREVER_REL, |
699 | &send_answer, query_states[id].client); | 722 | &send_answer, NULL); |
700 | } | 723 | } |
701 | 724 | ||
702 | /** | 725 | /** |
@@ -739,11 +762,13 @@ receive_dht (void *cls, struct GNUNET_TIME_Absolute exp | |||
739 | + sizeof (struct dns_record_line) - 1 + 16; /* To hold the IPv6-Address */ | 762 | + sizeof (struct dns_record_line) - 1 + 16; /* To hold the IPv6-Address */ |
740 | 763 | ||
741 | struct answer_packet_list *answer = | 764 | struct answer_packet_list *answer = |
742 | GNUNET_malloc (len + 2 * sizeof (struct answer_packet_list *)); | 765 | GNUNET_malloc (len + |
766 | sizeof(struct answer_packet_list) - sizeof(struct answer_packet)); | ||
743 | 767 | ||
744 | answer->pkt.hdr.type = htons (GNUNET_MESSAGE_TYPE_VPN_DNS_LOCAL_RESPONSE_DNS); | 768 | answer->pkt.hdr.type = htons (GNUNET_MESSAGE_TYPE_VPN_DNS_LOCAL_RESPONSE_DNS); |
745 | answer->pkt.hdr.size = htons (len); | 769 | answer->pkt.hdr.size = htons (len); |
746 | answer->pkt.subtype = GNUNET_DNS_ANSWER_TYPE_SERVICE; | 770 | answer->pkt.subtype = GNUNET_DNS_ANSWER_TYPE_SERVICE; |
771 | answer->client = query_states[id].client; | ||
747 | 772 | ||
748 | GNUNET_CRYPTO_hash (&rec->peer, | 773 | GNUNET_CRYPTO_hash (&rec->peer, |
749 | sizeof (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded), | 774 | sizeof (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded), |
@@ -808,9 +833,9 @@ receive_dht (void *cls, struct GNUNET_TIME_Absolute exp | |||
808 | GNUNET_CONTAINER_DLL_insert_after (head, tail, tail, answer); | 833 | GNUNET_CONTAINER_DLL_insert_after (head, tail, tail, answer); |
809 | 834 | ||
810 | if (server_notify == NULL) | 835 | if (server_notify == NULL) |
811 | server_notify = GNUNET_SERVER_notify_transmit_ready (query_states[id].client, len, | 836 | server_notify = GNUNET_SERVER_notify_transmit_ready (answer->client, len, |
812 | GNUNET_TIME_UNIT_FOREVER_REL, | 837 | GNUNET_TIME_UNIT_FOREVER_REL, |
813 | &send_answer, query_states[id].client); | 838 | &send_answer, NULL); |
814 | } | 839 | } |
815 | 840 | ||
816 | /** | 841 | /** |
@@ -841,6 +866,7 @@ receive_query (void *cls | |||
841 | 866 | ||
842 | query_states[dns->s.id].valid = GNUNET_YES; | 867 | query_states[dns->s.id].valid = GNUNET_YES; |
843 | query_states[dns->s.id].client = client; | 868 | query_states[dns->s.id].client = client; |
869 | GNUNET_SERVER_client_keep(client); | ||
844 | memcpy(query_states[dns->s.id].local_ip, pkt->orig_from, pkt->addrlen); | 870 | memcpy(query_states[dns->s.id].local_ip, pkt->orig_from, pkt->addrlen); |
845 | query_states[dns->s.id].addrlen = pkt->addrlen; | 871 | query_states[dns->s.id].addrlen = pkt->addrlen; |
846 | query_states[dns->s.id].local_port = pkt->src_port; | 872 | query_states[dns->s.id].local_port = pkt->src_port; |
@@ -1329,7 +1355,7 @@ handle_response(struct dns_pkt* dns, struct sockaddr *addr, socklen_t addrlen, i | |||
1329 | 1355 | ||
1330 | size_t len = sizeof (struct answer_packet) + r - 1; /* 1 for the unsigned char data[1]; */ | 1356 | size_t len = sizeof (struct answer_packet) + r - 1; /* 1 for the unsigned char data[1]; */ |
1331 | struct answer_packet_list *answer = | 1357 | struct answer_packet_list *answer = |
1332 | GNUNET_malloc (len + 2 * sizeof (struct answer_packet_list *)); | 1358 | GNUNET_malloc (len + sizeof(struct answer_packet_list) - (sizeof(struct answer_packet))); |
1333 | answer->pkt.hdr.type = | 1359 | answer->pkt.hdr.type = |
1334 | htons (GNUNET_MESSAGE_TYPE_VPN_DNS_LOCAL_RESPONSE_DNS); | 1360 | htons (GNUNET_MESSAGE_TYPE_VPN_DNS_LOCAL_RESPONSE_DNS); |
1335 | answer->pkt.hdr.size = htons (len); | 1361 | answer->pkt.hdr.size = htons (len); |
@@ -1355,6 +1381,7 @@ handle_response(struct dns_pkt* dns, struct sockaddr *addr, socklen_t addrlen, i | |||
1355 | GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "sending answer with addrlen = %d\n", addrlen); | 1381 | GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "sending answer with addrlen = %d\n", addrlen); |
1356 | answer->pkt.dst_port = query_states[dns->s.id].local_port; | 1382 | answer->pkt.dst_port = query_states[dns->s.id].local_port; |
1357 | memcpy (answer->pkt.data, dns, r); | 1383 | memcpy (answer->pkt.data, dns, r); |
1384 | answer->client = query_states[dns->s.id].client; | ||
1358 | 1385 | ||
1359 | GNUNET_CONTAINER_DLL_insert_after (head, tail, tail, answer); | 1386 | GNUNET_CONTAINER_DLL_insert_after (head, tail, tail, answer); |
1360 | 1387 | ||
@@ -1362,7 +1389,7 @@ handle_response(struct dns_pkt* dns, struct sockaddr *addr, socklen_t addrlen, i | |||
1362 | server_notify = GNUNET_SERVER_notify_transmit_ready (query_states[dns->s.id].client, | 1389 | server_notify = GNUNET_SERVER_notify_transmit_ready (query_states[dns->s.id].client, |
1363 | len, GNUNET_TIME_UNIT_FOREVER_REL, | 1390 | len, GNUNET_TIME_UNIT_FOREVER_REL, |
1364 | &send_answer, | 1391 | &send_answer, |
1365 | query_states[dns->s.id].client); | 1392 | NULL); |
1366 | } | 1393 | } |
1367 | } | 1394 | } |
1368 | GNUNET_free(addr); | 1395 | GNUNET_free(addr); |
@@ -1662,6 +1689,7 @@ run (void *cls, struct GNUNET_SERVER_Handle *server, | |||
1662 | dht = GNUNET_DHT_connect (cfg, 1024); | 1689 | dht = GNUNET_DHT_connect (cfg, 1024); |
1663 | GNUNET_SCHEDULER_add_now (publish_names, NULL); | 1690 | GNUNET_SCHEDULER_add_now (publish_names, NULL); |
1664 | GNUNET_SERVER_add_handlers (server, handlers); | 1691 | GNUNET_SERVER_add_handlers (server, handlers); |
1692 | GNUNET_SERVER_disconnect_notify(server, &client_disconnect, NULL); | ||
1665 | GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL, &cleanup_task, | 1693 | GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL, &cleanup_task, |
1666 | cls); | 1694 | cls); |
1667 | } | 1695 | } |