diff options
author | Christian Grothoff <christian@grothoff.org> | 2011-04-06 07:57:31 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2011-04-06 07:57:31 +0000 |
commit | ff0bde35c789ef8ada1c6aa6235c58b05886ed40 (patch) | |
tree | f0bf3a79504ebd084e8dfd6c1fbfeb712cd8b319 /src/vpn | |
parent | c013ea31649c63804599cc16253fa34d160e818d (diff) | |
download | gnunet-ff0bde35c789ef8ada1c6aa6235c58b05886ed40.tar.gz gnunet-ff0bde35c789ef8ada1c6aa6235c58b05886ed40.zip |
1k buffers
Diffstat (limited to 'src/vpn')
-rw-r--r-- | src/vpn/gnunet-service-dns.c | 87 |
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 | */ |
100 | struct receive_dht_cls { | 100 | struct 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 | */ |
546 | static void | 546 | static void |
547 | read_response (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) { | 547 | read_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, |