summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeoff Garside <geoff@geoffgarside.co.uk>2011-06-18 16:20:08 +0100
committerantirez <antirez@gmail.com>2013-07-08 15:57:22 +0200
commit23f4d905ceb35aaa84a5d851842f6ab98f25d8a6 (patch)
tree098d17b80058732a870c31aca2ca0417853a8450
parentfa723d98d6d4a76a8c64fdc4324f2a25cd4c104b (diff)
downloadredis-23f4d905ceb35aaa84a5d851842f6ab98f25d8a6.tar.gz
Update anetPeerToString to handle AF_INET6 addrs.
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.
-rw-r--r--src/anet.c26
1 files changed, 20 insertions, 6 deletions
diff --git a/src/anet.c b/src/anet.c
index 0d6a358e3..1996a487b 100644
--- a/src/anet.c
+++ b/src/anet.c
@@ -463,7 +463,7 @@ int anetUnixAccept(char *err, int s) {
}
int anetPeerToString(int fd, char *ip, size_t ip_len, int *port) {
- struct sockaddr_in sa;
+ struct sockaddr_storage sa;
socklen_t salen = sizeof(sa);
if (getpeername(fd,(struct sockaddr*)&sa,&salen) == -1) {
@@ -472,13 +472,20 @@ int anetPeerToString(int fd, char *ip, size_t ip_len, int *port) {
ip[1] = '\0';
return -1;
}
- if (ip) inet_ntop(sa.sin_family,(void*)&(sa.sin_addr),ip,ip_len);
- if (port) *port = ntohs(sa.sin_port);
+ if (sa.ss_family == AF_INET) {
+ struct sockaddr_in *s = (struct sockaddr_in *)&sa;
+ if (ip) inet_ntop(AF_INET,(void*)&(s->sin_addr),ip,ip_len);
+ if (port) *port = ntohs(s->sin_port);
+ } else {
+ struct sockaddr_in6 *s = (struct sockaddr_in6 *)&sa;
+ if (ip) inet_ntop(AF_INET6,(void*)&(s->sin6_addr),ip,ip_len);
+ if (port) *port = ntohs(s->sin6_port);
+ }
return 0;
}
int anetSockName(int fd, char *ip, size_t ip_len, int *port) {
- struct sockaddr_in sa;
+ struct sockaddr_storage sa;
socklen_t salen = sizeof(sa);
if (getsockname(fd,(struct sockaddr*)&sa,&salen) == -1) {
@@ -487,7 +494,14 @@ int anetSockName(int fd, char *ip, size_t ip_len, int *port) {
ip[1] = '\0';
return -1;
}
- if (ip) inet_ntop(sa.sin_family,(void*)&(sa.sin_addr),ip,ip_len);
- if (port) *port = ntohs(sa.sin_port);
+ if (sa.ss_family == AF_INET) {
+ struct sockaddr_in *s = (struct sockaddr_in *)&sa;
+ if (ip) inet_ntop(AF_INET,(void*)&(s->sin_addr),ip,ip_len);
+ if (port) *port = ntohs(s->sin_port);
+ } else {
+ struct sockaddr_in6 *s = (struct sockaddr_in6 *)&sa;
+ if (ip) inet_ntop(AF_INET6,(void*)&(s->sin6_addr),ip,ip_len);
+ if (port) *port = ntohs(s->sin6_port);
+ }
return 0;
}