mirror of
https://github.com/fluencelabs/redis
synced 2025-03-19 17:10:50 +00:00
Use getaddrinfo(3) in anetTcpGenericConnect.
Change anetTcpGenericConnect() function to use getaddrinfo(3) to perform address resolution, socket creation and connection. Resolved addresses are limited to those reachable by the AF_INET family.
This commit is contained in:
parent
580b7dce9b
commit
0e01ce1b13
52
src/anet.c
52
src/anet.c
@ -217,38 +217,52 @@ static int anetCreateSocket(char *err, int domain) {
|
|||||||
#define ANET_CONNECT_NONBLOCK 1
|
#define ANET_CONNECT_NONBLOCK 1
|
||||||
static int anetTcpGenericConnect(char *err, char *addr, int port, int flags)
|
static int anetTcpGenericConnect(char *err, char *addr, int port, int flags)
|
||||||
{
|
{
|
||||||
int s;
|
int s, rv;
|
||||||
struct sockaddr_in sa;
|
char _port[6]; /* strlen("65535"); */
|
||||||
|
struct addrinfo hints, *servinfo, *p;
|
||||||
|
|
||||||
if ((s = anetCreateSocket(err,AF_INET)) == ANET_ERR)
|
snprintf(_port,6,"%d",port);
|
||||||
return ANET_ERR;
|
memset(&hints,0,sizeof(hints));
|
||||||
|
hints.ai_family = AF_INET;
|
||||||
|
hints.ai_socktype = SOCK_STREAM;
|
||||||
|
|
||||||
sa.sin_family = AF_INET;
|
if ((rv = getaddrinfo(addr,_port,&hints,&servinfo)) != 0) {
|
||||||
sa.sin_port = htons(port);
|
anetSetError(err, "%s", gai_strerror(rv));
|
||||||
if (inet_aton(addr, &sa.sin_addr) == 0) {
|
|
||||||
struct hostent *he;
|
|
||||||
|
|
||||||
he = gethostbyname(addr);
|
|
||||||
if (he == NULL) {
|
|
||||||
anetSetError(err, "can't resolve: %s", addr);
|
|
||||||
close(s);
|
|
||||||
return ANET_ERR;
|
return ANET_ERR;
|
||||||
}
|
}
|
||||||
memcpy(&sa.sin_addr, he->h_addr, sizeof(struct in_addr));
|
for (p = servinfo; p != NULL; p = p->ai_next) {
|
||||||
|
if ((s = socket(p->ai_family,p->ai_socktype,p->ai_protocol)) == -1)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* if we set err then goto cleanup, otherwise next */
|
||||||
|
if (anetSetReuseAddr(err,s) == ANET_ERR) {
|
||||||
|
goto error;
|
||||||
}
|
}
|
||||||
if (flags & ANET_CONNECT_NONBLOCK) {
|
if (flags & ANET_CONNECT_NONBLOCK) {
|
||||||
if (anetNonBlock(err,s) != ANET_OK)
|
if (anetNonBlock(err,s) != ANET_OK)
|
||||||
return ANET_ERR;
|
goto error;
|
||||||
}
|
}
|
||||||
if (connect(s, (struct sockaddr*)&sa, sizeof(sa)) == -1) {
|
if (connect(s,p->ai_addr,p->ai_addrlen) == -1) {
|
||||||
if (errno == EINPROGRESS &&
|
if (errno == EINPROGRESS &&
|
||||||
flags & ANET_CONNECT_NONBLOCK)
|
flags & ANET_CONNECT_NONBLOCK)
|
||||||
return s;
|
goto end;
|
||||||
|
|
||||||
anetSetError(err, "connect: %s", strerror(errno));
|
|
||||||
close(s);
|
close(s);
|
||||||
return ANET_ERR;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* break with the socket */
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
if (p == NULL) {
|
||||||
|
anetSetError(err, "creating socket: %s", strerror(errno));
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
error:
|
||||||
|
s = ANET_ERR;
|
||||||
|
end:
|
||||||
|
freeaddrinfo(servinfo);
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user