aboutsummaryrefslogtreecommitdiff
path: root/src/vpn
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2011-04-06 07:57:31 +0000
committerChristian Grothoff <christian@grothoff.org>2011-04-06 07:57:31 +0000
commitff0bde35c789ef8ada1c6aa6235c58b05886ed40 (patch)
treef0bf3a79504ebd084e8dfd6c1fbfeb712cd8b319 /src/vpn
parentc013ea31649c63804599cc16253fa34d160e818d (diff)
downloadgnunet-ff0bde35c789ef8ada1c6aa6235c58b05886ed40.tar.gz
gnunet-ff0bde35c789ef8ada1c6aa6235c58b05886ed40.zip
1k buffers
Diffstat (limited to 'src/vpn')
-rw-r--r--src/vpn/gnunet-service-dns.c87
1 files changed, 52 insertions, 35 deletions
diff --git a/src/vpn/gnunet-service-dns.c b/src/vpn/gnunet-service-dns.c
index d4ef371e7..a2bf13674 100644
--- a/src/vpn/gnunet-service-dns.c
+++ b/src/vpn/gnunet-service-dns.c
@@ -98,7 +98,7 @@ static struct {
98 * closure to receive_dht 98 * closure to receive_dht
99 */ 99 */
100struct receive_dht_cls { 100struct receive_dht_cls {
101 unsigned short id; 101 uint16_t id;
102 struct GNUNET_DHT_GetHandle* handle; 102 struct GNUNET_DHT_GetHandle* handle;
103}; 103};
104 104
@@ -545,53 +545,70 @@ open_port ()
545 */ 545 */
546static void 546static void
547read_response (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) { 547read_response (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) {
548 unsigned char buf[65536]; 548 struct sockaddr_in addr;
549 struct dns_pkt* dns = (struct dns_pkt*)buf; 549 socklen_t addrlen = sizeof (addr);
550 int r;
551 int len;
550 552
551 if (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN) 553 if (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN)
552 return; 554 return;
553 555
554 struct sockaddr_in addr;
555 memset(&addr, 0, sizeof addr); 556 memset(&addr, 0, sizeof addr);
556 socklen_t addrlen = sizeof addr;
557
558 int r;
559 r = GNUNET_NETWORK_socket_recvfrom(dnsout,
560 buf,
561 65536,
562 (struct sockaddr*)&addr,
563 &addrlen);
564 557
565 if (r < 0) 558#ifndef MINGW
559 if (0 != ioctl (GNUNET_NETWORK_get_fd (dnsout),
560 FIONREAD, &len))
566 { 561 {
567 unhijack(dnsoutport); 562 unhijack(dnsoutport);
568 open_port(); 563 open_port();
569 GNUNET_SCHEDULER_add_delayed(GNUNET_TIME_UNIT_SECONDS, hijack, NULL); 564 GNUNET_SCHEDULER_add_delayed(GNUNET_TIME_UNIT_SECONDS, hijack, NULL);
570 return; 565 return;
571 } 566 }
572 567#else
573 if (query_states[dns->s.id].valid == GNUNET_YES) { 568 /* port the code above? */
574 query_states[dns->s.id].valid = GNUNET_NO; 569 len = 65536;
575 570#endif
576 size_t len = sizeof(struct answer_packet) + r - 1; /* 1 for the unsigned char data[1]; */ 571 {
577 struct answer_packet_list* answer = GNUNET_malloc(len + 2*sizeof(struct answer_packet_list*)); 572 unsigned char buf[len];
578 answer->pkt.hdr.type = htons(GNUNET_MESSAGE_TYPE_LOCAL_RESPONSE_DNS); 573 struct dns_pkt* dns = (struct dns_pkt*)buf;
579 answer->pkt.hdr.size = htons(len); 574
580 answer->pkt.subtype = GNUNET_DNS_ANSWER_TYPE_IP; 575 r = GNUNET_NETWORK_socket_recvfrom (dnsout,
581 answer->pkt.from = addr.sin_addr.s_addr; 576 buf,
582 answer->pkt.to = query_states[dns->s.id].local_ip; 577 sizeof (buf),
583 answer->pkt.dst_port = query_states[dns->s.id].local_port; 578 (struct sockaddr*)&addr,
584 memcpy(answer->pkt.data, buf, r); 579 &addrlen);
585 580
586 GNUNET_CONTAINER_DLL_insert_after(head, tail, tail, answer); 581 if (r < 0)
587 582 {
588 GNUNET_SERVER_notify_transmit_ready(query_states[dns->s.id].client, 583 unhijack(dnsoutport);
589 len, 584 open_port();
590 GNUNET_TIME_UNIT_FOREVER_REL, 585 GNUNET_SCHEDULER_add_delayed(GNUNET_TIME_UNIT_SECONDS, hijack, NULL);
591 &send_answer, 586 return;
592 query_states[dns->s.id].client); 587 }
588
589 if (query_states[dns->s.id].valid == GNUNET_YES)
590 {
591 query_states[dns->s.id].valid = GNUNET_NO;
592
593 size_t len = sizeof(struct answer_packet) + r - 1; /* 1 for the unsigned char data[1]; */
594 struct answer_packet_list* answer = GNUNET_malloc(len + 2*sizeof(struct answer_packet_list*));
595 answer->pkt.hdr.type = htons(GNUNET_MESSAGE_TYPE_LOCAL_RESPONSE_DNS);
596 answer->pkt.hdr.size = htons(len);
597 answer->pkt.subtype = GNUNET_DNS_ANSWER_TYPE_IP;
598 answer->pkt.from = addr.sin_addr.s_addr;
599 answer->pkt.to = query_states[dns->s.id].local_ip;
600 answer->pkt.dst_port = query_states[dns->s.id].local_port;
601 memcpy(answer->pkt.data, buf, r);
602
603 GNUNET_CONTAINER_DLL_insert_after(head, tail, tail, answer);
604
605 GNUNET_SERVER_notify_transmit_ready(query_states[dns->s.id].client,
606 len,
607 GNUNET_TIME_UNIT_FOREVER_REL,
608 &send_answer,
609 query_states[dns->s.id].client);
610 }
593 } 611 }
594
595 GNUNET_SCHEDULER_add_read_net(GNUNET_TIME_UNIT_FOREVER_REL, 612 GNUNET_SCHEDULER_add_read_net(GNUNET_TIME_UNIT_FOREVER_REL,
596 dnsout, 613 dnsout,
597 &read_response, 614 &read_response,