From 870fdbc3f64dc81f9d74aa6b541dfec33e7bc243 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Philipp=20T=C3=B6lke?= Date: Fri, 1 Apr 2011 12:20:27 +0000 Subject: [PATCH] fix --- src/vpn/gnunet-service-dns.c | 69 ++++++++++++++++++++++-------------- 1 file 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: GNUNET_SERVER_receive_done(client, GNUNET_OK); } +static void read_response (void *cls, + const struct GNUNET_SCHEDULER_TaskContext *tc); + +static void +open_port () +{ + struct sockaddr_in addr; + + dnsout = GNUNET_NETWORK_socket_create (AF_INET, SOCK_DGRAM, 0); + if (dnsout == NULL) + return; + memset (&addr, 0, sizeof (struct sockaddr_in)); + + int err = GNUNET_NETWORK_socket_bind (dnsout, + (struct sockaddr *) &addr, + sizeof (struct sockaddr_in)); + + if (err != GNUNET_YES) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + "Could not bind a port, exiting\n"); + return; + } + + /* Read the port we bound to */ + socklen_t addrlen = sizeof (struct sockaddr_in); + err = getsockname (GNUNET_NETWORK_get_fd (dnsout), + (struct sockaddr *) &addr, &addrlen); + + dnsoutport = htons (addr.sin_port); + + GNUNET_SCHEDULER_add_read_net (GNUNET_TIME_UNIT_FOREVER_REL, dnsout, + &read_response, NULL); +} + /** * Read a response-packet of the UDP-Socket */ @@ -528,7 +563,13 @@ read_response (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) { (struct sockaddr*)&addr, &addrlen); - /* if (r < 0) FIXME */ + if (r < 0) + { + unhijack(dnsoutport); + open_port(); + GNUNET_SCHEDULER_add_delayed(GNUNET_TIME_UNIT_SECONDS, hijack, NULL); + return; + } if (query_states[dns->s.id].valid == GNUNET_YES) { query_states[dns->s.id].valid = GNUNET_NO; @@ -821,34 +862,10 @@ run (void *cls, dht = GNUNET_DHT_connect(cfg, 1024); - struct sockaddr_in addr; - - dnsout = GNUNET_NETWORK_socket_create (AF_INET, SOCK_DGRAM, 0); - if (dnsout == NULL) - return; - memset(&addr, 0, sizeof(struct sockaddr_in)); - - int err = GNUNET_NETWORK_socket_bind (dnsout, - (struct sockaddr*)&addr, - sizeof(struct sockaddr_in)); - - if (err != GNUNET_YES) { - GNUNET_log(GNUNET_ERROR_TYPE_ERROR, "Could not bind a port, exiting\n"); - return; - } - - /* Read the port we bound to */ - socklen_t addrlen = sizeof(struct sockaddr_in); - err = getsockname(GNUNET_NETWORK_get_fd(dnsout), - (struct sockaddr*) &addr, - &addrlen); - - dnsoutport = htons(addr.sin_port); + open_port(); GNUNET_SCHEDULER_add_now (publish_names, NULL); - GNUNET_SCHEDULER_add_read_net(GNUNET_TIME_UNIT_FOREVER_REL, dnsout, &read_response, NULL); - GNUNET_SERVER_add_handlers (server, handlers); GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL, &cleanup_task, -- 2.25.1