Ecore-con: Test for IPV6 availability

SVN revision: 63680
This commit is contained in:
Youness Alaoui 2011-09-29 21:04:54 +00:00
parent ed03a201ef
commit 1fc4a13f80
3 changed files with 63 additions and 2 deletions

View File

@ -1303,6 +1303,22 @@ have_openssl="no"
have_cares="no" have_cares="no"
if test "x${have_ecore_con}" = "xyes" ; then if test "x${have_ecore_con}" = "xyes" ; then
# Verify IPV6 availability in headers
have_ipv6="no"
AC_CHECK_TYPES([struct ipv6_mreq], [have_ipv6="yes"], [have_ipv6="no"],
[[
#ifdef HAVE_NETINET_IN_H
# include <netinet/in.h>
#endif
#ifdef HAVE_WS2TCPIP_H
# include <ws2tcpip.h>
#endif
]])
if test "x${have_ipv6}" = "xyes" ; then
AC_DEFINE(HAVE_IPV6, 1, [Define if IPV6 is supported])
fi
ECORE_CHECK_CURL([${want_curl}], ECORE_CHECK_CURL([${want_curl}],
[ [
have_curl="yes" have_curl="yes"

View File

@ -869,7 +869,11 @@ ecore_con_client_port_get(Ecore_Con_Client *cl)
} }
if (cl->client_addr->sa_family == AF_INET) if (cl->client_addr->sa_family == AF_INET)
return ((struct sockaddr_in*)cl->client_addr)->sin_port; return ((struct sockaddr_in*)cl->client_addr)->sin_port;
#ifdef HAVE_IPV6
return ((struct sockaddr_in6*)cl->client_addr)->sin6_port; return ((struct sockaddr_in6*)cl->client_addr)->sin6_port;
#else
return -1;
#endif
} }
EAPI double EAPI double
@ -1440,7 +1444,9 @@ _ecore_con_cb_udp_listen(void *data,
Ecore_Con_Server *svr; Ecore_Con_Server *svr;
Ecore_Con_Type type; Ecore_Con_Type type;
struct ip_mreq mreq; struct ip_mreq mreq;
#ifdef HAVE_IPV6
struct ipv6_mreq mreq6; struct ipv6_mreq mreq6;
#endif
const int on = 1; const int on = 1;
svr = data; svr = data;
@ -1477,6 +1483,7 @@ _ecore_con_cb_udp_listen(void *data,
goto error; goto error;
} }
} }
#ifdef HAVE_IPV6
else if (net_info->info.ai_family == AF_INET6) else if (net_info->info.ai_family == AF_INET6)
{ {
if (!inet_pton(net_info->info.ai_family, net_info->ip, if (!inet_pton(net_info->info.ai_family, net_info->ip,
@ -1493,6 +1500,7 @@ _ecore_con_cb_udp_listen(void *data,
goto error; goto error;
} }
} }
#endif
} }
if (setsockopt(svr->fd, SOL_SOCKET, SO_REUSEADDR, (const void *)&on, sizeof(on)) != 0) if (setsockopt(svr->fd, SOL_SOCKET, SO_REUSEADDR, (const void *)&on, sizeof(on)) != 0)
@ -1765,6 +1773,9 @@ static const char *
_ecore_con_pretty_ip(struct sockaddr *client_addr, _ecore_con_pretty_ip(struct sockaddr *client_addr,
socklen_t size) socklen_t size)
{ {
#ifndef HAVE_IPV6
char ipbuf[INET_ADDRSTRLEN + 1];
#else
char ipbuf[INET6_ADDRSTRLEN + 1]; char ipbuf[INET6_ADDRSTRLEN + 1];
/* show v4mapped address in pretty form */ /* show v4mapped address in pretty form */
@ -1783,6 +1794,7 @@ _ecore_con_pretty_ip(struct sockaddr *client_addr,
return eina_stringshare_add(ipbuf); return eina_stringshare_add(ipbuf);
} }
} }
#endif
if (getnameinfo(client_addr, size, ipbuf, sizeof (ipbuf), NULL, 0, NI_NUMERICHOST)) if (getnameinfo(client_addr, size, ipbuf, sizeof (ipbuf), NULL, 0, NI_NUMERICHOST))
return eina_stringshare_add("0.0.0.0"); return eina_stringshare_add("0.0.0.0");

View File

@ -41,7 +41,9 @@ struct _Ecore_Con_CAres
union { union {
struct in_addr v4; struct in_addr v4;
#ifdef HAVE_IPV6
struct in6_addr v6; struct in6_addr v6;
#endif
} addr; } addr;
Eina_Bool byaddr : 1; Eina_Bool byaddr : 1;
@ -124,7 +126,11 @@ ecore_con_info_tcp_connect(Ecore_Con_Server *svr,
struct addrinfo hints; struct addrinfo hints;
memset(&hints, 0, sizeof(struct addrinfo)); memset(&hints, 0, sizeof(struct addrinfo));
#ifdef HAVE_IPV6
hints.ai_family = AF_INET6; hints.ai_family = AF_INET6;
#else
hints.ai_family = AF_INET;
#endif
hints.ai_socktype = SOCK_STREAM; hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_CANONNAME; hints.ai_flags = AI_CANONNAME;
hints.ai_protocol = IPPROTO_TCP; hints.ai_protocol = IPPROTO_TCP;
@ -143,7 +149,11 @@ ecore_con_info_tcp_listen(Ecore_Con_Server *svr,
struct addrinfo hints; struct addrinfo hints;
memset(&hints, 0, sizeof(struct addrinfo)); memset(&hints, 0, sizeof(struct addrinfo));
#ifdef HAVE_IPV6
hints.ai_family = AF_INET6; hints.ai_family = AF_INET6;
#else
hints.ai_family = AF_INET;
#endif
hints.ai_socktype = SOCK_STREAM; hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_PASSIVE; hints.ai_flags = AI_PASSIVE;
hints.ai_protocol = IPPROTO_TCP; hints.ai_protocol = IPPROTO_TCP;
@ -162,7 +172,11 @@ ecore_con_info_udp_connect(Ecore_Con_Server *svr,
struct addrinfo hints; struct addrinfo hints;
memset(&hints, 0, sizeof(struct addrinfo)); memset(&hints, 0, sizeof(struct addrinfo));
#ifdef HAVE_IPV6
hints.ai_family = AF_INET6; hints.ai_family = AF_INET6;
#else
hints.ai_family = AF_INET;
#endif
hints.ai_socktype = SOCK_DGRAM; hints.ai_socktype = SOCK_DGRAM;
hints.ai_flags = AI_CANONNAME; hints.ai_flags = AI_CANONNAME;
hints.ai_protocol = IPPROTO_UDP; hints.ai_protocol = IPPROTO_UDP;
@ -181,7 +195,11 @@ ecore_con_info_udp_listen(Ecore_Con_Server *svr,
struct addrinfo hints; struct addrinfo hints;
memset(&hints, 0, sizeof(struct addrinfo)); memset(&hints, 0, sizeof(struct addrinfo));
#ifdef HAVE_IPV6
hints.ai_family = AF_INET6; hints.ai_family = AF_INET6;
#else
hints.ai_family = AF_INET;
#endif
hints.ai_socktype = SOCK_DGRAM; hints.ai_socktype = SOCK_DGRAM;
hints.ai_flags = AI_PASSIVE; hints.ai_flags = AI_PASSIVE;
hints.ai_protocol = IPPROTO_UDP; hints.ai_protocol = IPPROTO_UDP;
@ -200,7 +218,11 @@ ecore_con_info_mcast_listen(Ecore_Con_Server *svr,
struct addrinfo hints; struct addrinfo hints;
memset(&hints, 0, sizeof(struct addrinfo)); memset(&hints, 0, sizeof(struct addrinfo));
#ifdef HAVE_IPV6
hints.ai_family = AF_INET6; hints.ai_family = AF_INET6;
#else
hints.ai_family = AF_INET;
#endif
hints.ai_socktype = SOCK_DGRAM; hints.ai_socktype = SOCK_DGRAM;
hints.ai_flags = 0; hints.ai_flags = 0;
hints.ai_protocol = IPPROTO_UDP; hints.ai_protocol = IPPROTO_UDP;
@ -262,7 +284,11 @@ ecore_con_info_get(Ecore_Con_Server *svr,
struct addrinfo *hints) struct addrinfo *hints)
{ {
Ecore_Con_CAres *cares; Ecore_Con_CAres *cares;
#ifdef HAVE_IPV6
int ai_family = AF_INET6; int ai_family = AF_INET6;
#else
int ai_family = AF_INET;
#endif
cares = calloc(1, sizeof(Ecore_Con_CAres)); cares = calloc(1, sizeof(Ecore_Con_CAres));
if (!cares) if (!cares)
@ -288,6 +314,7 @@ ecore_con_info_get(Ecore_Con_Server *svr,
(ares_host_callback)_ecore_con_info_ares_host_cb, (ares_host_callback)_ecore_con_info_ares_host_cb,
cares); cares);
} }
#ifdef HAVE_IPV6
else if (inet_pton(AF_INET6, svr->name, &cares->addr.v6) == 1) else if (inet_pton(AF_INET6, svr->name, &cares->addr.v6) == 1)
{ {
cares->byaddr = EINA_TRUE; cares->byaddr = EINA_TRUE;
@ -298,6 +325,7 @@ ecore_con_info_get(Ecore_Con_Server *svr,
(ares_host_callback)_ecore_con_info_ares_host_cb, (ares_host_callback)_ecore_con_info_ares_host_cb,
cares); cares);
} }
#endif
else else
{ {
cares->byaddr = EINA_FALSE; cares->byaddr = EINA_FALSE;
@ -432,7 +460,7 @@ _ecore_con_info_ares_host_cb(Ecore_Con_CAres *arg,
addr = (struct sockaddr *)addri; addr = (struct sockaddr *)addri;
break; break;
} }
#ifdef HAVE_IPV6
case AF_INET6: case AF_INET6:
{ {
struct sockaddr_in6 *addri6; struct sockaddr_in6 *addri6;
@ -454,7 +482,7 @@ _ecore_con_info_ares_host_cb(Ecore_Con_CAres *arg,
addr = (struct sockaddr *)addri6; addr = (struct sockaddr *)addri6;
break; break;
} }
#endif
default: default:
ERR("Unknown addrtype %i", hostent->h_addrtype); ERR("Unknown addrtype %i", hostent->h_addrtype);
goto on_error; goto on_error;
@ -470,6 +498,7 @@ _ecore_con_info_ares_host_cb(Ecore_Con_CAres *arg,
case ARES_ENOTFOUND: /* address notfound */ case ARES_ENOTFOUND: /* address notfound */
if (arg->byaddr) if (arg->byaddr)
{ {
#ifdef HAVE_IPV6
/* This happen when host doesn't have a reverse. */ /* This happen when host doesn't have a reverse. */
if (arg->isv6) if (arg->isv6)
{ {
@ -492,6 +521,7 @@ _ecore_con_info_ares_host_cb(Ecore_Con_CAres *arg,
addr = (struct sockaddr *)addri6; addr = (struct sockaddr *)addri6;
} }
else else
#endif
{ {
struct sockaddr_in *addri; struct sockaddr_in *addri;
@ -511,8 +541,11 @@ _ecore_con_info_ares_host_cb(Ecore_Con_CAres *arg,
} }
if (!_ecore_con_info_ares_getnameinfo(arg, if (!_ecore_con_info_ares_getnameinfo(arg,
#ifdef HAVE_IPV6
arg->isv6 ? AF_INET6 : arg->isv6 ? AF_INET6 :
#else
AF_INET, AF_INET,
#endif
NULL, addr, NULL, addr,
addrlen)) addrlen))
goto on_error; goto on_error;