summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJuanJo Ciarlante <jjo@google.com>2010-02-21 18:46:59 +0100
committerGert Doering <gert@greenie.muc.de>2011-04-24 17:22:39 +0200
commit49a945eafea2c64dbaa5cb2ecdfd4ca9a82aa26e (patch)
treeeaaa859bbf4ce71ebe7186d0ccba107353b86605
parent64d2297d398cbf131da5908858abcbb2dac8a033 (diff)
downloadopenvpn-49a945eafea2c64dbaa5cb2ecdfd4ca9a82aa26e.tar.gz
openvpn-49a945eafea2c64dbaa5cb2ecdfd4ca9a82aa26e.tar.xz
openvpn-49a945eafea2c64dbaa5cb2ecdfd4ca9a82aa26e.zip
* make ipv6_payload compile under windowze
- create inet_ntop() and inet_pton() wrap-implementations using WSAAddressToString() and WSAStringToAddress() functions - add relevant win32-only headers to syshead.h NOTE: syshead.h changes are already included in ipv6_transport
-rw-r--r--socket.c52
-rw-r--r--syshead.h7
-rw-r--r--win32.h2
3 files changed, 61 insertions, 0 deletions
diff --git a/socket.c b/socket.c
index 4c4f311..5d7a8c5 100644
--- a/socket.c
+++ b/socket.c
@@ -2407,6 +2407,58 @@ link_socket_write_udp_posix_sendmsg (struct link_socket *sock,
#ifdef WIN32
+/*
+ * inet_ntop() and inet_pton() wrap-implementations using
+ * WSAAddressToString() and WSAStringToAddress() functions
+ */
+const char *
+inet_ntop(int af, const void *src, char *dst, socklen_t size)
+{
+ struct sockaddr_storage ss;
+ unsigned long s = size;
+
+ CLEAR(ss);
+ ss.ss_family = af;
+
+ switch(af) {
+ case AF_INET:
+ ((struct sockaddr_in *)&ss)->sin_addr = *(struct in_addr *)src;
+ break;
+ case AF_INET6:
+ ((struct sockaddr_in6 *)&ss)->sin6_addr = *(struct in6_addr *)src;
+ break;
+ default:
+ ASSERT (0);
+ }
+ // cannot direclty use &size because of strict aliasing rules
+ return (WSAAddressToString((struct sockaddr *)&ss, sizeof(ss), NULL, dst, &s) == 0)?
+ dst : NULL;
+}
+
+int
+inet_pton(int af, const char *src, void *dst)
+{
+ struct sockaddr_storage ss;
+ int size = sizeof(ss);
+ char src_copy[INET6_ADDRSTRLEN+1];
+
+ CLEAR(ss);
+ // stupid non-const API
+ strncpynt(src_copy, src, INET6_ADDRSTRLEN+1);
+
+ if (WSAStringToAddress(src_copy, af, NULL, (struct sockaddr *)&ss, &size) == 0) {
+ switch(af) {
+ case AF_INET:
+ *(struct in_addr *)dst = ((struct sockaddr_in *)&ss)->sin_addr;
+ return 1;
+ case AF_INET6:
+ *(struct in6_addr *)dst = ((struct sockaddr_in6 *)&ss)->sin6_addr;
+ return 1;
+ }
+ }
+ return 0;
+}
+
int
socket_recv_queue (struct link_socket *sock, int maxsize)
{
diff --git a/syshead.h b/syshead.h
index 30ff556..d589531 100644
--- a/syshead.h
+++ b/syshead.h
@@ -28,6 +28,10 @@
/*
* Only include if not during configure
*/
+#ifdef WIN32
+/* USE_PF_INET6: win32 ipv6 exists only after 0x0501 (XP) */
+#define WINVER 0x0501
+#endif
#ifndef PACKAGE_NAME
#include "config.h"
#endif
@@ -339,6 +343,9 @@
#ifdef WIN32
#include <iphlpapi.h>
#include <wininet.h>
+/* The following two headers are needed of USE_PF_INET6 */
+#include <winsock2.h>
+#include <ws2tcpip.h>
#endif
#ifdef HAVE_SYS_MMAN_H
diff --git a/win32.h b/win32.h
index b6a162e..829933f 100644
--- a/win32.h
+++ b/win32.h
@@ -269,6 +269,8 @@ char *get_win_sys_path (void);
/* call self in a subprocess */
void fork_to_self (const char *cmdline);
+const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
+int inet_pton(int af, const char *src, void *st);
/* Find temporary directory */
const char *win_get_tempdir();