77 lines
1.6 KiB
C
77 lines
1.6 KiB
C
#include <lighttpd/base.h>
|
|
#include <lighttpd/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 <winsock2.h>
|
|
|
|
/* 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
|