diff --git a/src/lib/w32/posixio.c b/src/lib/w32/posixio.c index 6af4b9b7..c332b577 100644 --- a/src/lib/w32/posixio.c +++ b/src/lib/w32/posixio.c @@ -322,31 +322,36 @@ posix_socket(int domain, int type, int protocol) #ifdef HAVE_GETADDRINFO const char * -inet_ntop(int af, const void *source, char *dest, socklen_t len) +inet_ntop(int af, const void *src, char *dst, socklen_t len) { - if (af == AF_INET) - { - struct sockaddr_in in; - memset(&in, 0, sizeof(in)); - in.sin_family = AF_INET; - memcpy(&in.sin_addr, source, sizeof(struct in_addr)); - getnameinfo((struct sockaddr *)&in, - sizeof(struct sockaddr_in), dest, len, - NULL, 0, NI_NUMERICHOST); - return dest; + struct sockaddr *sa; + struct sockaddr_in sin; + struct sockaddr_in6 sin6; + size_t salen; + + if (af == AF_INET) { + memset(&sin, 0, sizeof(sin)); + sin.sin_family = af; + memcpy(&sin.sin_addr, src, sizeof(sin.sin_addr)); + sa = (struct sockaddr *)&sin; + salen = sizeof(sin); + } else if (af == AF_INET6) { + memset(&sin6, 0, sizeof(sin6)); + sin6.sin6_family = af; + memcpy(&sin6.sin6_addr, src, sizeof(sin6.sin6_addr)); + sa = (struct sockaddr *)&sin6; + salen = sizeof(sin6); + } else { + errno = EAFNOSUPPORT; + return NULL; } - else if (af == AF_INET6) - { - struct sockaddr_in6 in; - memset(&in, 0, sizeof(in)); - in.sin6_family = AF_INET6; - memcpy(&in.sin6_addr, source, sizeof(struct in_addr6)); - getnameinfo((struct sockaddr *)&in, - sizeof(struct sockaddr_in6), dest, len, - NULL, 0, NI_NUMERICHOST); - return dest; + + if (getnameinfo(sa, salen, dst, len, NULL, 0, NI_NUMERICHOST)) { + errno = EAFNOSUPPORT; + return NULL; } - return NULL; + + return dst; } #endif diff --git a/src/lib/w32/unistd.h b/src/lib/w32/unistd.h index 32aeeb6c..65fca5c6 100644 --- a/src/lib/w32/unistd.h +++ b/src/lib/w32/unistd.h @@ -118,6 +118,7 @@ typedef int socklen_t; #define F_SETLK 3 #define EWOULDBLOCK WSAEWOULDBLOCK #define ENOTSOCK WSAENOTSOCK +#define EAFNOSUPPORT WSAEAFNOSUPPORT struct flock {