summaryrefslogtreecommitdiffstats
path: root/socket.c
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 /socket.c
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
Diffstat (limited to 'socket.c')
-rw-r--r--socket.c52
1 files changed, 52 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)
{