summaryrefslogtreecommitdiff
path: root/src/windows.cpp
diff options
context:
space:
mode:
authorAdam- <Adam-@5417fbe8-f217-4b02-8779-1006273d7864>2010-04-08 20:23:00 +0000
committerAdam- <Adam-@5417fbe8-f217-4b02-8779-1006273d7864>2010-04-08 20:23:00 +0000
commit973ecb7058325931d14a9537e5e3e57595347a10 (patch)
tree43585f36085949a1b494374572fa4e3dc25b0960 /src/windows.cpp
parente1ff14e0c44d0a115372a821559b782c57c793f3 (diff)
Rewrote sockets. This adds support for IPv6 and makes Anope capable of reconnecting if it loses connection to the uplink.
git-svn-id: http://anope.svn.sourceforge.net/svnroot/anope/trunk@2862 5417fbe8-f217-4b02-8779-1006273d7864
Diffstat (limited to 'src/windows.cpp')
-rw-r--r--src/windows.cpp85
1 files changed, 84 insertions, 1 deletions
diff --git a/src/windows.cpp b/src/windows.cpp
index 988256838..cfaaa216e 100644
--- a/src/windows.cpp
+++ b/src/windows.cpp
@@ -13,7 +13,7 @@
*/
#ifdef WIN32
-#include <windows.h>
+#include "services.h"
const char *dlerror()
{
@@ -24,4 +24,87 @@ const char *dlerror()
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, err, 0, errbuf, 512, NULL);
return errbuf;
}
+
+
+/** This is inet_pton, but it works on Windows
+ * @param af The protocol type, AF_INET or AF_INET6
+ * @param src The address
+ * @param dst Struct to put results in
+ * @return 1 on sucess, -1 on error
+ */
+int inet_pton(int af, const char *src, void *dst)
+{
+ int address_length;
+ sockaddr_storage sa;
+ sockaddr_in *sin = static_cast<sockaddr_in *>(&sa);
+ sockaddr_in6 *sin6 = static_cast<sockaddr_in6 *>(&sa);
+
+ switch (af)
+ {
+ case AF_INET:
+ address_length = sizeof(sockaddr_in);
+ break;
+ case AF_INET6:
+ address_length = sizeof(sockaddr_in6);
+ break;
+ default:
+ return -1;
+ }
+
+ if (WSAStringToAddress(static_cast<LPTSTR>(src), af, NULL, static_cast<LPSOCKADDR>(&sa), &address_length) == 0)
+ {
+ switch (af)
+ {
+ case AF_INET:
+ memcpy(dst, &sin->sin_addr, sizeof(in_addr));
+ break;
+ case AF_INET6:
+ memcpy(dst, &sin6->sin6_addr, sizeof(in6_addr));
+ break;
+ }
+ return 1;
+ }
+
+ return 0;
+}
+
+/** This is inet_ntop, but it works on Windows
+ * @param af The protocol type, AF_INET or AF_INET6
+ * @param src Network address structure
+ * @param dst After converting put it here
+ * @param size sizeof the dest
+ * @return dst
+ */
+const char *inet_ntop(int af, const void *src, char *dst, size_t size)
+{
+ int address_length;
+ DWORD string_length = size;
+ sockaddr_storage sa;
+ sockaddr_in *sin = static_cast<sockaddr_in *>(&sa);
+ sockaddr_in6 *sin6 = static_cast<sockaddr_in6 *>(&sa);
+
+ memset(&sa, 0, sizeof(sa));
+
+ switch (af)
+ {
+ case AF_INET:
+ address_length = sizeof(sockaddr_in);
+ sin->sin_family = af;
+ memcpy(&sin->sin_addr, src, sizeof(in_addr));
+ break;
+ case AF_INET6:
+ address_length = sizeof(sockaddr_in6);
+ sin6->sin6_family = af;
+ memcpy(&sin6->sin6_addr, src, sizeof(in6_addr));
+ break;
+ default:
+ return NULL;
+ }
+
+ if (WSAAddressToString(static_cast<LPSOCKADDR>(&sa), address_length, NULL, dst, &string_length) == 0)
+ return dst;
+
+ return NULL;
+}
+
#endif