]> git.ipfire.org Git - thirdparty/openvpn.git/commitdiff
* make ipv6_payload compile under windowze
authorJuanJo Ciarlante <jjo@google.com>
Sun, 21 Feb 2010 17:46:59 +0000 (18:46 +0100)
committerGert Doering <gert@greenie.muc.de>
Sun, 24 Apr 2011 15:22:39 +0000 (17:22 +0200)
- 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

socket.c
syshead.h
win32.h

index 4c4f3111fec23b13487e2cbd1044c67e5c53cfa9..5d7a8c5128ed974bc672731a7b7ae16a7552bbf9 100644 (file)
--- 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)
 {
index 30ff5561edf169c9fc6e9e674a7a87c0ef34e06a..d589531080159761ccb4f1623f5127375435b702 100644 (file)
--- a/syshead.h
+++ b/syshead.h
 /*
  * 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
 #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 b6a162ea40605037d59d6c44d43e2bf275d92079..829933feccee3e5fae9aee8c9f5d9187e27d8093 100644 (file)
--- 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();