diff options
author | Philipp Tölke <toelke@in.tum.de> | 2011-04-01 12:20:27 +0000 |
---|---|---|
committer | Philipp Tölke <toelke@in.tum.de> | 2011-04-01 12:20:27 +0000 |
commit | 870fdbc3f64dc81f9d74aa6b541dfec33e7bc243 (patch) | |
tree | 6d1c820720637e4b9804e50cdfd3b023028f06a9 /src/vpn | |
parent | 3695f55c493a485a838b3defff6b15a63fddd987 (diff) | |
download | gnunet-870fdbc3f64dc81f9d74aa6b541dfec33e7bc243.tar.gz gnunet-870fdbc3f64dc81f9d74aa6b541dfec33e7bc243.zip |
fix
Diffstat (limited to 'src/vpn')
-rw-r--r-- | src/vpn/gnunet-service-dns.c | 69 |
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 | ||
509 | static void read_response (void *cls, | ||
510 | const struct GNUNET_SCHEDULER_TaskContext *tc); | ||
511 | |||
512 | static void | ||
513 | open_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, |