From 5be83eecacb8b4a23e1822e81f77d765afbdb7b1 Mon Sep 17 00:00:00 2001 From: Geoff Garside Date: Sat, 18 Jun 2011 19:19:10 +0100 Subject: Update node2IpString to handle AF_INET6 addresses. Change the sockaddr_in to sockaddr_storage which is capable of storing both AF_INET and AF_INET6 sockets. Uses the sockaddr_storage ss_family to correctly return the printable IP address and port. Function makes the assumption that the buffer is of at least REDIS_CLUSTER_IPLEN bytes in size. --- src/cluster.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/cluster.c b/src/cluster.c index 9f789d940..575e46740 100644 --- a/src/cluster.c +++ b/src/cluster.c @@ -753,14 +753,21 @@ void clusterProcessGossipSection(clusterMsg *hdr, clusterLink *link) { } } -/* IP -> string conversion. 'buf' is supposed to at least be 16 bytes. */ +/* IP -> string conversion. 'buf' is supposed to at least be 46 bytes. */ void nodeIp2String(char *buf, clusterLink *link) { - struct sockaddr_in sa; + struct sockaddr_storage sa; socklen_t salen = sizeof(sa); if (getpeername(link->fd, (struct sockaddr*) &sa, &salen) == -1) redisPanic("getpeername() failed."); - inet_ntop(sa.sin_family,(void*)&(sa.sin_addr),buf,REDIS_CLUSTER_IPLEN); + + if (sa.ss_family == AF_INET) { + struct sockaddr_in *s = (struct sockaddr_in *)&sa; + inet_ntop(AF_INET,(void*)&(s->sin_addr),buf,REDIS_CLUSTER_IPLEN); + } else { + struct sockaddr_in6 *s = (struct sockaddr_in6 *)&sa; + inet_ntop(AF_INET6,(void*)&(s->sin6_addr),buf,REDIS_CLUSTER_IPLEN); + } } -- cgit v1.2.1