diff options
author | Christian Grothoff <christian@grothoff.org> | 2013-05-16 08:38:05 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2013-05-16 08:38:05 +0000 |
commit | 5190ddf683d4ac95ae33f7000bd5229b13a3d15f (patch) | |
tree | e76b396a332bf3a56b64a00ff1f0a503420ad92f /src/transport/plugin_transport_udp.c | |
parent | 112ff7c641aae1c65c81074f1353075eb80a741b (diff) | |
download | gnunet-5190ddf683d4ac95ae33f7000bd5229b13a3d15f.tar.gz gnunet-5190ddf683d4ac95ae33f7000bd5229b13a3d15f.zip |
-fix error reporting
Diffstat (limited to 'src/transport/plugin_transport_udp.c')
-rw-r--r-- | src/transport/plugin_transport_udp.c | 199 |
1 files changed, 104 insertions, 95 deletions
diff --git a/src/transport/plugin_transport_udp.c b/src/transport/plugin_transport_udp.c index 228eaeb6c..ae7346ef9 100644 --- a/src/transport/plugin_transport_udp.c +++ b/src/transport/plugin_transport_udp.c | |||
@@ -2664,8 +2664,14 @@ udp_plugin_select_v6 (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) | |||
2664 | } | 2664 | } |
2665 | 2665 | ||
2666 | 2666 | ||
2667 | /** | ||
2668 | * | ||
2669 | * @return number of sockets that were successfully bound | ||
2670 | */ | ||
2667 | static int | 2671 | static int |
2668 | setup_sockets (struct Plugin *plugin, struct sockaddr_in6 *bind_v6, struct sockaddr_in *bind_v4) | 2672 | setup_sockets (struct Plugin *plugin, |
2673 | const struct sockaddr_in6 *bind_v6, | ||
2674 | const struct sockaddr_in *bind_v4) | ||
2669 | { | 2675 | { |
2670 | int tries; | 2676 | int tries; |
2671 | int sockets_created = 0; | 2677 | int sockets_created = 0; |
@@ -2675,8 +2681,10 @@ setup_sockets (struct Plugin *plugin, struct sockaddr_in6 *bind_v6, struct socka | |||
2675 | struct sockaddr *addrs[2]; | 2681 | struct sockaddr *addrs[2]; |
2676 | socklen_t addrlens[2]; | 2682 | socklen_t addrlens[2]; |
2677 | socklen_t addrlen; | 2683 | socklen_t addrlen; |
2684 | int eno; | ||
2678 | 2685 | ||
2679 | /* Create IPv6 socket */ | 2686 | /* Create IPv6 socket */ |
2687 | eno = EINVAL; | ||
2680 | if (plugin->enable_ipv6 == GNUNET_YES) | 2688 | if (plugin->enable_ipv6 == GNUNET_YES) |
2681 | { | 2689 | { |
2682 | plugin->sockv6 = GNUNET_NETWORK_socket_create (PF_INET6, SOCK_DGRAM, 0); | 2690 | plugin->sockv6 = GNUNET_NETWORK_socket_create (PF_INET6, SOCK_DGRAM, 0); |
@@ -2698,36 +2706,34 @@ setup_sockets (struct Plugin *plugin, struct sockaddr_in6 *bind_v6, struct socka | |||
2698 | serverAddrv6.sin6_addr = in6addr_any; | 2706 | serverAddrv6.sin6_addr = in6addr_any; |
2699 | 2707 | ||
2700 | if (0 == plugin->port) | 2708 | if (0 == plugin->port) |
2701 | /* autodetect */ | 2709 | /* autodetect */ |
2702 | serverAddrv6.sin6_port = htons (GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_STRONG, 33537) + 32000); | 2710 | serverAddrv6.sin6_port = htons (GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_STRONG, 33537) + 32000); |
2703 | else | 2711 | else |
2704 | serverAddrv6.sin6_port = htons (plugin->port); | 2712 | serverAddrv6.sin6_port = htons (plugin->port); |
2705 | |||
2706 | |||
2707 | addrlen = sizeof (struct sockaddr_in6); | 2713 | addrlen = sizeof (struct sockaddr_in6); |
2708 | serverAddr = (struct sockaddr *) &serverAddrv6; | 2714 | serverAddr = (struct sockaddr *) &serverAddrv6; |
2709 | 2715 | ||
2710 | tries = 0; | 2716 | tries = 0; |
2711 | while (tries < 10) | 2717 | while (tries < 10) |
2712 | { | 2718 | { |
2713 | LOG (GNUNET_ERROR_TYPE_DEBUG, "Binding to IPv6 `%s'\n", | 2719 | LOG (GNUNET_ERROR_TYPE_DEBUG, "Binding to IPv6 `%s'\n", |
2714 | GNUNET_a2s (serverAddr, addrlen)); | 2720 | GNUNET_a2s (serverAddr, addrlen)); |
2715 | 2721 | ||
2716 | /* binding */ | 2722 | /* binding */ |
2717 | if (GNUNET_OK == GNUNET_NETWORK_socket_bind (plugin->sockv6, serverAddr, addrlen)) | 2723 | if (GNUNET_OK == GNUNET_NETWORK_socket_bind (plugin->sockv6, serverAddr, addrlen)) |
2718 | break; | 2724 | break; |
2719 | 2725 | eno = errno; | |
2720 | if (0 != plugin->port) | 2726 | if (0 != plugin->port) |
2721 | { | 2727 | { |
2722 | tries = 10; /* fail */ | 2728 | tries = 10; /* fail */ |
2723 | break; /* bind failed on specific port */ | 2729 | break; /* bind failed on specific port */ |
2724 | } | 2730 | } |
2725 | 2731 | ||
2726 | /* autodetect */ | 2732 | /* autodetect */ |
2727 | serverAddrv6.sin6_port = htons (GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_STRONG, 33537) + 32000); | 2733 | serverAddrv6.sin6_port = htons (GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_STRONG, 33537) + 32000); |
2728 | tries ++; | 2734 | tries ++; |
2729 | } | 2735 | } |
2730 | 2736 | ||
2731 | if (tries >= 10) | 2737 | if (tries >= 10) |
2732 | { | 2738 | { |
2733 | GNUNET_NETWORK_socket_close (plugin->sockv6); | 2739 | GNUNET_NETWORK_socket_close (plugin->sockv6); |
@@ -2746,85 +2752,88 @@ setup_sockets (struct Plugin *plugin, struct sockaddr_in6 *bind_v6, struct socka | |||
2746 | else | 2752 | else |
2747 | { | 2753 | { |
2748 | LOG (GNUNET_ERROR_TYPE_ERROR, | 2754 | LOG (GNUNET_ERROR_TYPE_ERROR, |
2749 | "Failed to create IPv6 socket created on %s\n", | 2755 | "Failed to bind UDP socket to %s: %s\n", |
2750 | GNUNET_a2s (serverAddr, addrlen)); | 2756 | GNUNET_a2s (serverAddr, addrlen), |
2757 | STRERROR (eno)); | ||
2751 | } | 2758 | } |
2752 | } | 2759 | } |
2753 | } | 2760 | } |
2754 | 2761 | ||
2755 | /* Create IPv4 socket */ | 2762 | /* Create IPv4 socket */ |
2756 | plugin->sockv4 = GNUNET_NETWORK_socket_create (PF_INET, SOCK_DGRAM, 0); | 2763 | eno = EINVAL; |
2757 | if (NULL == plugin->sockv4) | 2764 | plugin->sockv4 = GNUNET_NETWORK_socket_create (PF_INET, SOCK_DGRAM, 0); |
2758 | { | 2765 | if (NULL == plugin->sockv4) |
2759 | LOG (GNUNET_ERROR_TYPE_WARNING, "Failed to create IPv4 socket!\n"); | 2766 | { |
2760 | return sockets_created; | 2767 | LOG_STRERROR (GNUNET_ERROR_TYPE_WARNING, "socket"); |
2761 | } | 2768 | return sockets_created; |
2762 | else | 2769 | } |
2763 | { | 2770 | else |
2764 | memset (&serverAddrv4, '\0', sizeof (struct sockaddr_in)); | 2771 | { |
2772 | memset (&serverAddrv4, '\0', sizeof (struct sockaddr_in)); | ||
2765 | #if HAVE_SOCKADDR_IN_SIN_LEN | 2773 | #if HAVE_SOCKADDR_IN_SIN_LEN |
2766 | serverAddrv4.sin_len = sizeof (struct sockaddr_in); | 2774 | serverAddrv4.sin_len = sizeof (struct sockaddr_in); |
2767 | #endif | 2775 | #endif |
2768 | serverAddrv4.sin_family = AF_INET; | 2776 | serverAddrv4.sin_family = AF_INET; |
2769 | if (NULL != bind_v4) | 2777 | if (NULL != bind_v4) |
2770 | serverAddrv4.sin_addr = bind_v4->sin_addr; | 2778 | serverAddrv4.sin_addr = bind_v4->sin_addr; |
2771 | else | 2779 | else |
2772 | serverAddrv4.sin_addr.s_addr = INADDR_ANY; | 2780 | serverAddrv4.sin_addr.s_addr = INADDR_ANY; |
2773 | 2781 | ||
2774 | if (0 == plugin->port) | 2782 | if (0 == plugin->port) |
2775 | /* autodetect */ | 2783 | /* autodetect */ |
2776 | serverAddrv4.sin_port = htons (GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_STRONG, 33537) + 32000); | 2784 | serverAddrv4.sin_port = htons (GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_STRONG, 33537) + 32000); |
2777 | else | 2785 | else |
2778 | serverAddrv4.sin_port = htons (plugin->port); | 2786 | serverAddrv4.sin_port = htons (plugin->port); |
2779 | 2787 | ||
2780 | 2788 | ||
2781 | addrlen = sizeof (struct sockaddr_in); | 2789 | addrlen = sizeof (struct sockaddr_in); |
2782 | serverAddr = (struct sockaddr *) &serverAddrv4; | 2790 | serverAddr = (struct sockaddr *) &serverAddrv4; |
2783 | 2791 | ||
2784 | tries = 0; | 2792 | tries = 0; |
2785 | while (tries < 10) | 2793 | while (tries < 10) |
2786 | { | 2794 | { |
2787 | LOG (GNUNET_ERROR_TYPE_DEBUG, "Binding to IPv4 `%s'\n", | 2795 | LOG (GNUNET_ERROR_TYPE_DEBUG, "Binding to IPv4 `%s'\n", |
2788 | GNUNET_a2s (serverAddr, addrlen)); | 2796 | GNUNET_a2s (serverAddr, addrlen)); |
2789 | 2797 | ||
2790 | /* binding */ | 2798 | /* binding */ |
2791 | if (GNUNET_OK == GNUNET_NETWORK_socket_bind (plugin->sockv4, serverAddr, addrlen)) | 2799 | if (GNUNET_OK == GNUNET_NETWORK_socket_bind (plugin->sockv4, serverAddr, addrlen)) |
2792 | break; | 2800 | break; |
2793 | 2801 | eno = errno; | |
2794 | if (0 != plugin->port) | 2802 | if (0 != plugin->port) |
2795 | { | 2803 | { |
2796 | tries = 10; /* fail */ | 2804 | tries = 10; /* fail */ |
2797 | break; /* bind failed on specific port */ | 2805 | break; /* bind failed on specific port */ |
2798 | } | 2806 | } |
2799 | 2807 | ||
2800 | /* autodetect */ | 2808 | /* autodetect */ |
2801 | serverAddrv4.sin_port = htons (GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_STRONG, 33537) + 32000); | 2809 | serverAddrv4.sin_port = htons (GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_STRONG, 33537) + 32000); |
2802 | tries ++; | 2810 | tries ++; |
2803 | } | 2811 | } |
2804 | 2812 | ||
2805 | if (tries >= 10) | 2813 | if (tries >= 10) |
2806 | { | 2814 | { |
2807 | GNUNET_NETWORK_socket_close (plugin->sockv4); | 2815 | GNUNET_NETWORK_socket_close (plugin->sockv4); |
2808 | plugin->sockv4 = NULL; | 2816 | plugin->sockv4 = NULL; |
2809 | } | 2817 | } |
2810 | 2818 | ||
2811 | if (plugin->sockv4 != NULL) | 2819 | if (plugin->sockv4 != NULL) |
2812 | { | 2820 | { |
2813 | LOG (GNUNET_ERROR_TYPE_DEBUG, | 2821 | LOG (GNUNET_ERROR_TYPE_DEBUG, |
2814 | "IPv4 socket created on port %s\n", | 2822 | "IPv4 socket created on port %s\n", |
2815 | GNUNET_a2s (serverAddr, addrlen)); | 2823 | GNUNET_a2s (serverAddr, addrlen)); |
2816 | addrs[sockets_created] = (struct sockaddr *) &serverAddrv4; | 2824 | addrs[sockets_created] = (struct sockaddr *) &serverAddrv4; |
2817 | addrlens[sockets_created] = sizeof (struct sockaddr_in); | 2825 | addrlens[sockets_created] = sizeof (struct sockaddr_in); |
2818 | sockets_created++; | 2826 | sockets_created++; |
2819 | } | 2827 | } |
2820 | else | 2828 | else |
2821 | { | 2829 | { |
2822 | LOG (GNUNET_ERROR_TYPE_ERROR, | 2830 | LOG (GNUNET_ERROR_TYPE_ERROR, |
2823 | "Failed to create IPv4 socket created on %s\n", | 2831 | "Failed to bind UDP socket to %s: %s\n", |
2824 | GNUNET_a2s (serverAddr, addrlen)); | 2832 | GNUNET_a2s (serverAddr, addrlen), |
2825 | } | 2833 | STRERROR (eno)); |
2826 | } | 2834 | } |
2827 | 2835 | } | |
2836 | |||
2828 | /* Create file descriptors */ | 2837 | /* Create file descriptors */ |
2829 | plugin->rs_v4 = GNUNET_NETWORK_fdset_create (); | 2838 | plugin->rs_v4 = GNUNET_NETWORK_fdset_create (); |
2830 | plugin->ws_v4 = GNUNET_NETWORK_fdset_create (); | 2839 | plugin->ws_v4 = GNUNET_NETWORK_fdset_create (); |