(inet_ntop) [_WIN32]: Improve the error checking for getnameinfo().

This commit is contained in:
Ron Koenderink 2007-08-24 21:46:32 +00:00
parent 5299580260
commit 2abd68e46e
2 changed files with 28 additions and 22 deletions

View file

@ -322,31 +322,36 @@ posix_socket(int domain, int type, int protocol)
#ifdef HAVE_GETADDRINFO #ifdef HAVE_GETADDRINFO
const char * 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 *sa;
{ struct sockaddr_in sin;
struct sockaddr_in in; struct sockaddr_in6 sin6;
memset(&in, 0, sizeof(in)); size_t salen;
in.sin_family = AF_INET;
memcpy(&in.sin_addr, source, sizeof(struct in_addr)); if (af == AF_INET) {
getnameinfo((struct sockaddr *)&in, memset(&sin, 0, sizeof(sin));
sizeof(struct sockaddr_in), dest, len, sin.sin_family = af;
NULL, 0, NI_NUMERICHOST); memcpy(&sin.sin_addr, src, sizeof(sin.sin_addr));
return dest; sa = (struct sockaddr *)&sin;
} salen = sizeof(sin);
else if (af == AF_INET6) } else if (af == AF_INET6) {
{ memset(&sin6, 0, sizeof(sin6));
struct sockaddr_in6 in; sin6.sin6_family = af;
memset(&in, 0, sizeof(in)); memcpy(&sin6.sin6_addr, src, sizeof(sin6.sin6_addr));
in.sin6_family = AF_INET6; sa = (struct sockaddr *)&sin6;
memcpy(&in.sin6_addr, source, sizeof(struct in_addr6)); salen = sizeof(sin6);
getnameinfo((struct sockaddr *)&in, } else {
sizeof(struct sockaddr_in6), dest, len, errno = EAFNOSUPPORT;
NULL, 0, NI_NUMERICHOST);
return dest;
}
return NULL; return NULL;
}
if (getnameinfo(sa, salen, dst, len, NULL, 0, NI_NUMERICHOST)) {
errno = EAFNOSUPPORT;
return NULL;
}
return dst;
} }
#endif #endif

View file

@ -118,6 +118,7 @@ typedef int socklen_t;
#define F_SETLK 3 #define F_SETLK 3
#define EWOULDBLOCK WSAEWOULDBLOCK #define EWOULDBLOCK WSAEWOULDBLOCK
#define ENOTSOCK WSAENOTSOCK #define ENOTSOCK WSAENOTSOCK
#define EAFNOSUPPORT WSAEAFNOSUPPORT
struct flock struct flock
{ {