diff options
author | antirez <antirez@gmail.com> | 2013-07-04 18:48:46 +0200 |
---|---|---|
committer | antirez <antirez@gmail.com> | 2013-07-04 18:48:46 +0200 |
commit | bd234d62bbfe9feb735fd6d1cdb8f5ce811f54b4 (patch) | |
tree | 25663ffad36dda9e7da7805a2f6f44566db0f702 | |
parent | 585b0a61ce0cc7ddf136c1c4e462a0d4ad2a8fc7 (diff) | |
download | redis-bd234d62bbfe9feb735fd6d1cdb8f5ce811f54b4.tar.gz |
anet.c: Allow creation of TCP listening sockets bound to N addresses.
-rw-r--r-- | src/anet.c | 23 | ||||
-rw-r--r-- | src/anet.h | 2 |
2 files changed, 16 insertions, 9 deletions
diff --git a/src/anet.c b/src/anet.c index 963b6688e..7a6b7d4bf 100644 --- a/src/anet.c +++ b/src/anet.c @@ -331,9 +331,9 @@ static int anetListen(char *err, int s, struct sockaddr *sa, socklen_t len) { return ANET_OK; } -int anetTcpServer(char *err, int port, char *bindaddr) +int anetTcpServer(char *err, int port, char **bindaddr, int bindaddr_count) { - int s; + int s, j; struct sockaddr_in sa; if ((s = anetCreateSocket(err,AF_INET)) == ANET_ERR) @@ -343,13 +343,20 @@ int anetTcpServer(char *err, int port, char *bindaddr) sa.sin_family = AF_INET; sa.sin_port = htons(port); sa.sin_addr.s_addr = htonl(INADDR_ANY); - if (bindaddr && inet_aton(bindaddr, &sa.sin_addr) == 0) { - anetSetError(err, "invalid bind address"); - close(s); - return ANET_ERR; + if (bindaddr_count) { + for (j = 0; j < bindaddr_count; j++) { + if (inet_aton(bindaddr[j], &sa.sin_addr) == 0) { + anetSetError(err, "invalid bind address"); + close(s); + return ANET_ERR; + } + if (anetListen(err,s,(struct sockaddr*)&sa,sizeof(sa)) == ANET_ERR) + return ANET_ERR; + } + } else { + if (anetListen(err,s,(struct sockaddr*)&sa,sizeof(sa)) == ANET_ERR) + return ANET_ERR; } - if (anetListen(err,s,(struct sockaddr*)&sa,sizeof(sa)) == ANET_ERR) - return ANET_ERR; return s; } diff --git a/src/anet.h b/src/anet.h index 696c2c225..bf76dd24d 100644 --- a/src/anet.h +++ b/src/anet.h @@ -45,7 +45,7 @@ int anetUnixConnect(char *err, char *path); int anetUnixNonBlockConnect(char *err, char *path); int anetRead(int fd, char *buf, int count); int anetResolve(char *err, char *host, char *ipbuf); -int anetTcpServer(char *err, int port, char *bindaddr); +int anetTcpServer(char *err, int port, char **bindaddr, int bindaddr_count); int anetUnixServer(char *err, char *path, mode_t perm); int anetTcpAccept(char *err, int serversock, char *ip, int *port); int anetUnixAccept(char *err, int serversock); |