diff options
author | Christian Grothoff <christian@grothoff.org> | 2013-10-11 12:07:44 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2013-10-11 12:07:44 +0000 |
commit | 15ec6e9eb5e1ec86c1db2135b62abe0ac36f8daf (patch) | |
tree | b8a6405319cd9b8cfd60088d1f4894abc0df91e9 /src/gns/gnunet-gns-proxy.c | |
parent | b2df23c644d39454ab03f58671fd9a2e0951c8aa (diff) | |
download | gnunet-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.c | 108 |
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 | */ | ||
2599 | static struct GNUNET_NETWORK_Handle * | ||
2600 | bind_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 | */ | ||
2635 | static struct GNUNET_NETWORK_Handle * | ||
2636 | bind_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 | */ |
2598 | static void | 2669 | static void |
2599 | run_cont () | 2670 | run_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, |