aboutsummaryrefslogtreecommitdiff
path: root/src/vpn
diff options
context:
space:
mode:
authorPhilipp Tölke <toelke@in.tum.de>2011-04-01 12:20:27 +0000
committerPhilipp Tölke <toelke@in.tum.de>2011-04-01 12:20:27 +0000
commit870fdbc3f64dc81f9d74aa6b541dfec33e7bc243 (patch)
tree6d1c820720637e4b9804e50cdfd3b023028f06a9 /src/vpn
parent3695f55c493a485a838b3defff6b15a63fddd987 (diff)
downloadgnunet-870fdbc3f64dc81f9d74aa6b541dfec33e7bc243.tar.gz
gnunet-870fdbc3f64dc81f9d74aa6b541dfec33e7bc243.zip
fix
Diffstat (limited to 'src/vpn')
-rw-r--r--src/vpn/gnunet-service-dns.c69
1 files changed, 43 insertions, 26 deletions
diff --git a/src/vpn/gnunet-service-dns.c b/src/vpn/gnunet-service-dns.c
index 3741a52c9..71164766b 100644
--- a/src/vpn/gnunet-service-dns.c
+++ b/src/vpn/gnunet-service-dns.c
@@ -506,6 +506,41 @@ out:
506 GNUNET_SERVER_receive_done(client, GNUNET_OK); 506 GNUNET_SERVER_receive_done(client, GNUNET_OK);
507} 507}
508 508
509static void read_response (void *cls,
510 const struct GNUNET_SCHEDULER_TaskContext *tc);
511
512static void
513open_port ()
514{
515 struct sockaddr_in addr;
516
517 dnsout = GNUNET_NETWORK_socket_create (AF_INET, SOCK_DGRAM, 0);
518 if (dnsout == NULL)
519 return;
520 memset (&addr, 0, sizeof (struct sockaddr_in));
521
522 int err = GNUNET_NETWORK_socket_bind (dnsout,
523 (struct sockaddr *) &addr,
524 sizeof (struct sockaddr_in));
525
526 if (err != GNUNET_YES)
527 {
528 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
529 "Could not bind a port, exiting\n");
530 return;
531 }
532
533 /* Read the port we bound to */
534 socklen_t addrlen = sizeof (struct sockaddr_in);
535 err = getsockname (GNUNET_NETWORK_get_fd (dnsout),
536 (struct sockaddr *) &addr, &addrlen);
537
538 dnsoutport = htons (addr.sin_port);
539
540 GNUNET_SCHEDULER_add_read_net (GNUNET_TIME_UNIT_FOREVER_REL, dnsout,
541 &read_response, NULL);
542}
543
509/** 544/**
510 * Read a response-packet of the UDP-Socket 545 * Read a response-packet of the UDP-Socket
511 */ 546 */
@@ -528,7 +563,13 @@ read_response (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) {
528 (struct sockaddr*)&addr, 563 (struct sockaddr*)&addr,
529 &addrlen); 564 &addrlen);
530 565
531 /* if (r < 0) FIXME */ 566 if (r < 0)
567 {
568 unhijack(dnsoutport);
569 open_port();
570 GNUNET_SCHEDULER_add_delayed(GNUNET_TIME_UNIT_SECONDS, hijack, NULL);
571 return;
572 }
532 573
533 if (query_states[dns->s.id].valid == GNUNET_YES) { 574 if (query_states[dns->s.id].valid == GNUNET_YES) {
534 query_states[dns->s.id].valid = GNUNET_NO; 575 query_states[dns->s.id].valid = GNUNET_NO;
@@ -821,34 +862,10 @@ run (void *cls,
821 862
822 dht = GNUNET_DHT_connect(cfg, 1024); 863 dht = GNUNET_DHT_connect(cfg, 1024);
823 864
824 struct sockaddr_in addr; 865 open_port();
825
826 dnsout = GNUNET_NETWORK_socket_create (AF_INET, SOCK_DGRAM, 0);
827 if (dnsout == NULL)
828 return;
829 memset(&addr, 0, sizeof(struct sockaddr_in));
830
831 int err = GNUNET_NETWORK_socket_bind (dnsout,
832 (struct sockaddr*)&addr,
833 sizeof(struct sockaddr_in));
834
835 if (err != GNUNET_YES) {
836 GNUNET_log(GNUNET_ERROR_TYPE_ERROR, "Could not bind a port, exiting\n");
837 return;
838 }
839
840 /* Read the port we bound to */
841 socklen_t addrlen = sizeof(struct sockaddr_in);
842 err = getsockname(GNUNET_NETWORK_get_fd(dnsout),
843 (struct sockaddr*) &addr,
844 &addrlen);
845
846 dnsoutport = htons(addr.sin_port);
847 866
848 GNUNET_SCHEDULER_add_now (publish_names, NULL); 867 GNUNET_SCHEDULER_add_now (publish_names, NULL);
849 868
850 GNUNET_SCHEDULER_add_read_net(GNUNET_TIME_UNIT_FOREVER_REL, dnsout, &read_response, NULL);
851
852 GNUNET_SERVER_add_handlers (server, handlers); 869 GNUNET_SERVER_add_handlers (server, handlers);
853 GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL, 870 GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL,
854 &cleanup_task, 871 &cleanup_task,