summaryrefslogtreecommitdiff
path: root/win32/inet.c
diff options
context:
space:
mode:
authorPierre Joye <pajoye@php.net>2008-08-21 23:37:40 +0000
committerPierre Joye <pajoye@php.net>2008-08-21 23:37:40 +0000
commitadfa214688b0baa9141422770dd2eb91b491335d (patch)
treec33453d1fd0bda151e8bcb7d02343e80c9cdf07c /win32/inet.c
parentdcb0cc3d2b63e0388b64ccd52ec424e9c3cba385 (diff)
downloadphp-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.c89
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