aboutsummaryrefslogtreecommitdiff
path: root/src/transport/plugin_transport_udp.c
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2013-05-16 08:38:05 +0000
committerChristian Grothoff <christian@grothoff.org>2013-05-16 08:38:05 +0000
commit5190ddf683d4ac95ae33f7000bd5229b13a3d15f (patch)
treee76b396a332bf3a56b64a00ff1f0a503420ad92f /src/transport/plugin_transport_udp.c
parent112ff7c641aae1c65c81074f1353075eb80a741b (diff)
downloadgnunet-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.c199
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 */
2667static int 2671static int
2668setup_sockets (struct Plugin *plugin, struct sockaddr_in6 *bind_v6, struct sockaddr_in *bind_v4) 2672setup_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 ();