summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeoff Garside <geoff@geoffgarside.co.uk>2011-06-18 19:19:10 +0100
committerantirez <antirez@gmail.com>2013-07-08 15:57:23 +0200
commit5be83eecacb8b4a23e1822e81f77d765afbdb7b1 (patch)
treee1d4275c062ea99c00e9c718b5534f6ab2dbda1f
parent6181455ac614356fcc13a09e532d5ee65857c528 (diff)
downloadredis-5be83eecacb8b4a23e1822e81f77d765afbdb7b1.tar.gz
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.
-rw-r--r--src/cluster.c13
1 files 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);
+ }
}