#include "base.h" #include "sys-socket.h" #ifndef HAVE_INET_ATON /* win32 has inet_addr instead if inet_aton */ # ifdef HAVE_INET_ADDR int inet_aton(const char *cp, struct in_addr *inp) { struct in_addr a; a.s_addr = inet_addr(cp); if (INADDR_NONE == a.s_addr) { return 0; } inp->s_addr = a.s_addr; return 1; } # else # error no inet_aton emulation found # endif #endif #ifdef _WIN32 #include /* windows doesn't have inet_ntop */ /* I have to look into this more. WSAAddressToString takes a sockaddr structure, which includes the port number, so I must first test this stuff more carefully. For now, no IPV6 on windows. You will notice that HAVE_IPV6 is never true for win32. */ const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt) { /* WSAAddressToString takes a full sockaddr, while inet_ntop only takes the address */ struct sockaddr_in sock4; struct sockaddr_in6 sock6; DWORD addrLen = cnt; int err = 0; /* src is either an in_addr or an in6_addr. */ const struct in_addr *src4 = (const struct in_addr*) src; const struct in6_addr *src6 = (const struct in6_addr*) src; int ipv6 = af == AF_INET6; // DebugBreak(); if ( ipv6 ) { sock6.sin6_family = AF_INET6; sock6.sin6_port = 0; sock6.sin6_addr = *src6; } else { sock4.sin_family = AF_INET; sock4.sin_port = 0; sock4.sin_addr = *src4; } err = WSAAddressToStringA( ipv6 ? (LPSOCKADDR) &sock6 : (LPSOCKADDR) &sock4, ipv6 ? sizeof(sock6) : sizeof(sock4), NULL, dst, &addrLen ); return err == 0 ? dst : NULL; } #endif