aboutsummaryrefslogtreecommitdiff
path: root/src/gns/gnunet-gns-proxy.c
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2013-10-11 12:07:44 +0000
committerChristian Grothoff <christian@grothoff.org>2013-10-11 12:07:44 +0000
commit15ec6e9eb5e1ec86c1db2135b62abe0ac36f8daf (patch)
treeb8a6405319cd9b8cfd60088d1f4894abc0df91e9 /src/gns/gnunet-gns-proxy.c
parentb2df23c644d39454ab03f58671fd9a2e0951c8aa (diff)
downloadgnunet-15ec6e9eb5e1ec86c1db2135b62abe0ac36f8daf.tar.gz
gnunet-15ec6e9eb5e1ec86c1db2135b62abe0ac36f8daf.zip
-fix #3037: support IPv6
Diffstat (limited to 'src/gns/gnunet-gns-proxy.c')
-rw-r--r--src/gns/gnunet-gns-proxy.c108
1 files changed, 82 insertions, 26 deletions
diff --git a/src/gns/gnunet-gns-proxy.c b/src/gns/gnunet-gns-proxy.c
index 276ea70b0..a28ab98dc 100644
--- a/src/gns/gnunet-gns-proxy.c
+++ b/src/gns/gnunet-gns-proxy.c
@@ -26,7 +26,6 @@
26 * 26 *
27 * TODO: 27 * TODO:
28 * - double-check queueing logic 28 * - double-check queueing logic
29 * - improve IPv6 support (#3037)
30 * - actually check SSL certificates (#3038) 29 * - actually check SSL certificates (#3038)
31 */ 30 */
32#include "platform.h" 31#include "platform.h"
@@ -1232,7 +1231,7 @@ curl_task_download (void *cls,
1232 case CURLE_GOT_NOTHING: 1231 case CURLE_GOT_NOTHING:
1233 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 1232 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1234 "CURL download completed.\n"); 1233 "CURL download completed.\n");
1235 s5r->state = SOCKS5_SOCKET_DOWNLOAD_DONE; 1234 s5r->state = SOCKS5_SOCKET_DOWNLOAD_DONE;
1236 run_mhd_now (s5r->hd); 1235 run_mhd_now (s5r->hd);
1237 break; 1236 break;
1238 default: 1237 default:
@@ -1241,7 +1240,7 @@ curl_task_download (void *cls,
1241 curl_easy_strerror (msg->data.result)); 1240 curl_easy_strerror (msg->data.result));
1242 /* FIXME: indicate error somehow? close MHD connection badly as well? */ 1241 /* FIXME: indicate error somehow? close MHD connection badly as well? */
1243 s5r->state = SOCKS5_SOCKET_DOWNLOAD_DONE; 1242 s5r->state = SOCKS5_SOCKET_DOWNLOAD_DONE;
1244 run_mhd_now (s5r->hd); 1243 run_mhd_now (s5r->hd);
1245 break; 1244 break;
1246 } 1245 }
1247 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 1246 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
@@ -2426,8 +2425,8 @@ do_s5r_read (void *cls,
2426 { 2425 {
2427 const uint8_t *dom_len; 2426 const uint8_t *dom_len;
2428 const char *dom_name; 2427 const char *dom_name;
2429 const uint16_t *port; 2428 const uint16_t *port;
2430 2429
2431 dom_len = (const uint8_t *) &c_req[1]; 2430 dom_len = (const uint8_t *) &c_req[1];
2432 alen = *dom_len + 1; 2431 alen = *dom_len + 1;
2433 if (s5r->rbuf_len < sizeof (struct Socks5ClientRequestMessage) + 2432 if (s5r->rbuf_len < sizeof (struct Socks5ClientRequestMessage) +
@@ -2449,7 +2448,7 @@ do_s5r_read (void *cls,
2449 GNUNET_NO /* only cached */, 2448 GNUNET_NO /* only cached */,
2450 (GNUNET_YES == do_shorten) ? &local_shorten_zone : NULL, 2449 (GNUNET_YES == do_shorten) ? &local_shorten_zone : NULL,
2451 &handle_gns_result, 2450 &handle_gns_result,
2452 s5r); 2451 s5r);
2453 break; 2452 break;
2454 } 2453 }
2455 default: 2454 default:
@@ -2469,7 +2468,7 @@ do_s5r_read (void *cls,
2469 GNUNET_break_op (0); 2468 GNUNET_break_op (0);
2470 signal_socks_failure (s5r, 2469 signal_socks_failure (s5r,
2471 SOCKS5_STATUS_GENERAL_FAILURE); 2470 SOCKS5_STATUS_GENERAL_FAILURE);
2472 return; 2471 return;
2473 } 2472 }
2474 if (SOCKS5_DATA_TRANSFER == s5r->state) 2473 if (SOCKS5_DATA_TRANSFER == s5r->state)
2475 { 2474 {
@@ -2593,34 +2592,90 @@ do_shutdown (void *cls,
2593 2592
2594 2593
2595/** 2594/**
2595 * Create an IPv4 listen socket bound to our port.
2596 *
2597 * @return NULL on error
2598 */
2599static struct GNUNET_NETWORK_Handle *
2600bind_v4 ()
2601{
2602 struct GNUNET_NETWORK_Handle *ls;
2603 struct sockaddr_in sa4;
2604 int eno;
2605
2606 memset (&sa4, 0, sizeof (sa4));
2607 sa4.sin_family = AF_INET;
2608 sa4.sin_port = htons (port);
2609#if HAVE_SOCKADDR_IN_SIN_LEN
2610 sa4.sin_len = sizeof (sa4);
2611#endif
2612 ls = GNUNET_NETWORK_socket_create (AF_INET,
2613 SOCK_STREAM,
2614 0);
2615 if (NULL == ls)
2616 return NULL;
2617 if (GNUNET_OK !=
2618 GNUNET_NETWORK_socket_bind (ls, (const struct sockaddr *) &sa4,
2619 sizeof (sa4)))
2620 {
2621 eno = errno;
2622 GNUNET_NETWORK_socket_close (ls);
2623 errno = eno;
2624 return NULL;
2625 }
2626 return ls;
2627}
2628
2629
2630/**
2631 * Create an IPv6 listen socket bound to our port.
2632 *
2633 * @return NULL on error
2634 */
2635static struct GNUNET_NETWORK_Handle *
2636bind_v6 ()
2637{
2638 struct GNUNET_NETWORK_Handle *ls;
2639 struct sockaddr_in6 sa6;
2640 int eno;
2641
2642 memset (&sa6, 0, sizeof (sa6));
2643 sa6.sin6_family = AF_INET6;
2644 sa6.sin6_port = htons (port);
2645#if HAVE_SOCKADDR_IN_SIN_LEN
2646 sa6.sin6_len = sizeof (sa6);
2647#endif
2648 ls = GNUNET_NETWORK_socket_create (AF_INET6,
2649 SOCK_STREAM,
2650 0);
2651 if (NULL == ls)
2652 return NULL;
2653 if (GNUNET_OK !=
2654 GNUNET_NETWORK_socket_bind (ls, (const struct sockaddr *) &sa6,
2655 sizeof (sa6)))
2656 {
2657 eno = errno;
2658 GNUNET_NETWORK_socket_close (ls);
2659 errno = eno;
2660 return NULL;
2661 }
2662 return ls;
2663}
2664
2665
2666/**
2596 * Continue initialization after we have our zone information. 2667 * Continue initialization after we have our zone information.
2597 */ 2668 */
2598static void 2669static void
2599run_cont () 2670run_cont ()
2600{ 2671{
2601 struct MhdHttpList *hd; 2672 struct MhdHttpList *hd;
2602 struct sockaddr_in sa;
2603 2673
2604 /* Open listen socket for socks proxy */ 2674 /* Open listen socket for socks proxy */
2605 /* FIXME: support IPv6! */ 2675 lsock = bind_v6 ();
2606 memset (&sa, 0, sizeof (sa)); 2676 if (NULL == lsock)
2607 sa.sin_family = AF_INET; 2677 lsock = bind_v4 ();
2608 sa.sin_port = htons (port);
2609#if HAVE_SOCKADDR_IN_SIN_LEN
2610 sa.sin_len = sizeof (sa);
2611#endif
2612 lsock = GNUNET_NETWORK_socket_create (AF_INET,
2613 SOCK_STREAM,
2614 0);
2615 if (NULL == lsock) 2678 if (NULL == lsock)
2616 {
2617 GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "socket");
2618 GNUNET_SCHEDULER_shutdown ();
2619 return;
2620 }
2621 if (GNUNET_OK !=
2622 GNUNET_NETWORK_socket_bind (lsock, (const struct sockaddr *) &sa,
2623 sizeof (sa), 0))
2624 { 2679 {
2625 GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "bind"); 2680 GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "bind");
2626 GNUNET_SCHEDULER_shutdown (); 2681 GNUNET_SCHEDULER_shutdown ();
@@ -2629,6 +2684,7 @@ run_cont ()
2629 if (GNUNET_OK != GNUNET_NETWORK_socket_listen (lsock, 5)) 2684 if (GNUNET_OK != GNUNET_NETWORK_socket_listen (lsock, 5))
2630 { 2685 {
2631 GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "listen"); 2686 GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "listen");
2687 GNUNET_SCHEDULER_shutdown ();
2632 return; 2688 return;
2633 } 2689 }
2634 ltask = GNUNET_SCHEDULER_add_read_net (GNUNET_TIME_UNIT_FOREVER_REL, 2690 ltask = GNUNET_SCHEDULER_add_read_net (GNUNET_TIME_UNIT_FOREVER_REL,