diff options
author | Pierre Joye <pajoye@php.net> | 2008-08-21 23:37:40 +0000 |
---|---|---|
committer | Pierre Joye <pajoye@php.net> | 2008-08-21 23:37:40 +0000 |
commit | adfa214688b0baa9141422770dd2eb91b491335d (patch) | |
tree | c33453d1fd0bda151e8bcb7d02343e80c9cdf07c /win32/inet.c | |
parent | dcb0cc3d2b63e0388b64ccd52ec424e9c3cba385 (diff) | |
download | php-git-adfa214688b0baa9141422770dd2eb91b491335d.tar.gz |
- drop bindlib usage on windows
- inet_pton, inet_ntop and inet_aton are always available (VC9 uses the CRT implementation, VC6 our own)
Diffstat (limited to 'win32/inet.c')
-rw-r--r-- | win32/inet.c | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/win32/inet.c b/win32/inet.c new file mode 100644 index 0000000000..117c6d83d1 --- /dev/null +++ b/win32/inet.c @@ -0,0 +1,89 @@ +#if _MSC_VER < 1500 +#include "config.w32.h" +#include "php.h" +#include <winsock2.h> +#include <windows.h> +#include <Ws2tcpip.h> + +#include "inet.h" + +PHPAPI int +inet_pton(int af, const char* src, void* dst) +{ + int address_length; + struct sockaddr_storage sa; + struct sockaddr_in *sin = (struct sockaddr_in *)&sa; + struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)&sa; + + switch (af) { + case AF_INET: + address_length = sizeof (struct sockaddr_in); + break; + + case AF_INET6: + address_length = sizeof (struct sockaddr_in6); + break; + + default: + return -1; + } + + if (WSAStringToAddress ((LPTSTR) src, af, NULL, (LPSOCKADDR) &sa, &address_length) == 0) { + switch (af) { + case AF_INET: + memcpy (dst, &sin->sin_addr, sizeof (struct in_addr)); + break; + + case AF_INET6: + memcpy (dst, &sin6->sin6_addr, sizeof (struct in6_addr)); + break; + } + return 1; + } + + return 0; +} + +PHPAPI const char* inet_ntop(int af, const void* src, char* dst, size_t size) +{ + int address_length; + DWORD string_length = size; + struct sockaddr_storage sa; + struct sockaddr_in *sin = (struct sockaddr_in *)&sa; + struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)&sa; + + memset (&sa, 0, sizeof (sa)); + switch (af) { + case AF_INET: + address_length = sizeof (struct sockaddr_in); + sin->sin_family = af; + memcpy (&sin->sin_addr, src, sizeof (struct in_addr)); + break; + + case AF_INET6: + address_length = sizeof (struct sockaddr_in6); + sin6->sin6_family = af; + memcpy (&sin6->sin6_addr, src, sizeof (struct in6_addr)); + break; + + default: + return NULL; + } + + if (WSAAddressToString ((LPSOCKADDR) &sa, address_length, NULL, dst, &string_length) == 0) { + return dst; + } + + return NULL; +} + +int inet_aton(const char *cp, struct in_addr *inp) { + inp->s_addr = inet_addr(cp); + + if (inp->s_addr == INADDR_NONE) { + return 0; + } + + return 1; +} +#endif |