diff --git a/src/anet.c b/src/anet.c index 963b6688..afa1d647 100644 --- a/src/anet.c +++ b/src/anet.c @@ -163,22 +163,26 @@ int anetTcpKeepAlive(char *err, int fd) return ANET_OK; } -int anetResolve(char *err, char *host, char *ipbuf) +int anetResolve(char *err, char *host, char *ipbuf, size_t ipbuf_len) { - struct sockaddr_in sa; + struct addrinfo hints, *info; + void *addr; + int rv; - sa.sin_family = AF_INET; - if (inet_aton(host, &sa.sin_addr) == 0) { - struct hostent *he; + memset(&hints,0,sizeof(hints)); + hints.ai_family = AF_INET; - he = gethostbyname(host); - if (he == NULL) { - anetSetError(err, "can't resolve: %s", host); - return ANET_ERR; - } - memcpy(&sa.sin_addr, he->h_addr, sizeof(struct in_addr)); + if ((rv = getaddrinfo(host, NULL, &hints, &info)) != 0) { + anetSetError(err, "%s", gai_strerror(rv)); + return ANET_ERR; } - strcpy(ipbuf,inet_ntoa(sa.sin_addr)); + if (info->ai_family == AF_INET) { + struct sockaddr_in *sa = (struct sockaddr_in *)info->ai_addr; + addr = &(sa->sin_addr); + } + + inet_ntop(info->ai_family, addr, ipbuf, ipbuf_len); + freeaddrinfo(info); return ANET_OK; } diff --git a/src/anet.h b/src/anet.h index 696c2c22..efaa2cc9 100644 --- a/src/anet.h +++ b/src/anet.h @@ -44,7 +44,7 @@ int anetTcpNonBlockConnect(char *err, char *addr, int port); 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 anetResolve(char *err, char *host, char *ipbuf, size_t ipbuf_len); int anetTcpServer(char *err, int port, char *bindaddr); int anetUnixServer(char *err, char *path, mode_t perm); int anetTcpAccept(char *err, int serversock, char *ip, int *port);