From 2bda225433762f78c09c2a751b321eb9d94c37c6 Mon Sep 17 00:00:00 2001 From: Corentin Chary Date: Tue, 27 Oct 2009 12:57:35 +0000 Subject: transport/name.c: refine the address resolution logic when listen-host is not specified. - when listen-host is not specified and there are are no interfaces having adresses belonging to the address-family specified, listen at 0.0.0.0/::0. - this patch is necessary since with AI_ADDRCONFIG, getaddrinfo fails if there are no active interfaces for the address family specified and when listen-host is specified we still want the functionality provided with usage of AI_ADDRCONFIG. Signed-off-by: Corentin Chary Signed-off-by: Anand V. Avati BUG: 339 (glusterfsd fails to start when there are no active interfaces having address in the address family configured.) URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=339 --- transport/ib-verbs/src/name.c | 20 +++++++++++++++++--- transport/socket/src/name.c | 21 ++++++++++++++++++--- 2 files changed, 35 insertions(+), 6 deletions(-) (limited to 'transport') diff --git a/transport/ib-verbs/src/name.c b/transport/ib-verbs/src/name.c index 6c7ea33092a..a3e18481458 100644 --- a/transport/ib-verbs/src/name.c +++ b/transport/ib-verbs/src/name.c @@ -360,7 +360,21 @@ af_inet_server_get_local_sockaddr (transport_t *this, if (listen_port_data) { listen_port = data_to_uint16 (listen_port_data); - } + } else { + if (addr->sa_family == AF_INET6) { + struct sockaddr_in6 *in = (struct sockaddr_in6 *) addr; + in->sin6_addr = in6addr_any; + in->sin6_port = htons(listen_port); + *addr_len = sizeof(struct sockaddr_in6); + goto out; + } else if (addr->sa_family == AF_INET) { + struct sockaddr_in *in = (struct sockaddr_in *) addr; + in->sin_addr.s_addr = htonl(INADDR_ANY); + in->sin_port = htons(listen_port); + *addr_len = sizeof(struct sockaddr_in); + goto out; + } + } if (listen_port == (uint16_t) -1) listen_port = GF_DEFAULT_IBVERBS_LISTEN_PORT; @@ -386,7 +400,7 @@ af_inet_server_get_local_sockaddr (transport_t *this, "getaddrinfo failed for host %s, service %s (%s)", listen_host, service, gai_strerror (ret)); ret = -1; - goto err; + goto out; } memcpy (addr, res->ai_addr, res->ai_addrlen); @@ -394,7 +408,7 @@ af_inet_server_get_local_sockaddr (transport_t *this, freeaddrinfo (res); -err: +out: return ret; } diff --git a/transport/socket/src/name.c b/transport/socket/src/name.c index db7878830f1..712f5a3ffe3 100644 --- a/transport/socket/src/name.c +++ b/transport/socket/src/name.c @@ -19,6 +19,7 @@ #include #include +#include #include #include #include @@ -368,7 +369,21 @@ af_inet_server_get_local_sockaddr (transport_t *this, if (listen_host_data) { listen_host = data_to_str (listen_host_data); - } + } else { + if (addr->sa_family == AF_INET6) { + struct sockaddr_in6 *in = (struct sockaddr_in6 *) addr; + in->sin6_addr = in6addr_any; + in->sin6_port = htons(listen_port); + *addr_len = sizeof(struct sockaddr_in6); + goto out; + } else if (addr->sa_family == AF_INET) { + struct sockaddr_in *in = (struct sockaddr_in *) addr; + in->sin_addr.s_addr = htonl(INADDR_ANY); + in->sin_port = htons(listen_port); + *addr_len = sizeof(struct sockaddr_in); + goto out; + } + } memset (service, 0, sizeof (service)); sprintf (service, "%d", listen_port); @@ -384,7 +399,7 @@ af_inet_server_get_local_sockaddr (transport_t *this, "getaddrinfo failed for host %s, service %s (%s)", listen_host, service, gai_strerror (ret)); ret = -1; - goto err; + goto out; } memcpy (addr, res->ai_addr, res->ai_addrlen); @@ -392,7 +407,7 @@ af_inet_server_get_local_sockaddr (transport_t *this, freeaddrinfo (res); -err: +out: return ret; } -- cgit