From b1dbfa846e202f90c282b09bf75bce5dde6dfb57 Mon Sep 17 00:00:00 2001
From: deuce <>
Date: Sun, 1 Sep 2013 06:15:19 +0000
Subject: [PATCH] Move getaddrinfo() stuff into sockwrap.h Fix inet_addrtop()
 for Win32.

---
 src/xpdev/multisock.c | 15 +--------------
 src/xpdev/sockwrap.c  | 10 ++++++++--
 src/xpdev/sockwrap.h  | 14 +++++++++++---
 3 files changed, 20 insertions(+), 19 deletions(-)

diff --git a/src/xpdev/multisock.c b/src/xpdev/multisock.c
index 3b1dd9f47c..5f86af18ea 100644
--- a/src/xpdev/multisock.c
+++ b/src/xpdev/multisock.c
@@ -7,17 +7,6 @@
 #include <sockwrap.h>
 #include <multisock.h>
 
-#ifdef _WIN32
-#undef socklen_t
-#include <ws2tcpip.h>
-# ifndef AI_ADDRCONFIG
-#  define AI_ADDRCONFIG 0x400 // Vista or later
-# endif
-# ifndef AI_NUMERICSERV
-#  define AI_NUMERICSERV 0		// Not supported by Win32
-# endif
-#endif
-
 struct xpms_set *xpms_create(unsigned int retries, unsigned int wait_secs,
 	int (*lprintf)(int level, const char *fmt, ...))
 {
@@ -70,10 +59,8 @@ BOOL xpms_add(struct xpms_set *xpms_set, int domain, int type,
 	hints.ai_family=domain;
 	hints.ai_socktype=type;
 	hints.ai_protocol=protocol;
-	hints.ai_flags=AI_NUMERICSERV;
-#ifdef AI_ADDRCONFIG
+	hints.ai_flags|=AI_NUMERICSERV;
 	hints.ai_flags|=AI_ADDRCONFIG;
-#endif
 	sprintf(port_str, "%hu", port);
 	if((ret=getaddrinfo(addr, port_str, &hints, &res))!=0) {
 		if(xpms_set->lprintf)
diff --git a/src/xpdev/sockwrap.c b/src/xpdev/sockwrap.c
index 7f453266d2..ee7ced749d 100644
--- a/src/xpdev/sockwrap.c
+++ b/src/xpdev/sockwrap.c
@@ -42,8 +42,6 @@
 #include <stdio.h>		/* SEEK_SET */
 #include <string.h>
 #if defined(_WIN32)
- #undef socklen_t
- #include <ws2tcpip.h>
  #include <malloc.h>	/* alloca() on Win32 */
 #endif
 
@@ -391,6 +389,13 @@ int nonblocking_connect(SOCKET sock, struct sockaddr* addr, size_t size, unsigne
 
 const char *inet_addrtop(SOCKADDR *in, char *dest, size_t size)
 {
+#ifdef _WIN32
+	DWORD	dsize=size;
+
+	if(WSAAddressToString(in, SOCK_MAXADDRLEN, NULL, dest, &dsize)==SOCKET_ERROR)
+		return NULL;
+	return dest;
+#else
 	switch(in->sa_family) {
 		case AF_INET:
 			return inet_ntop(in->sa_family, &((struct sockaddr_in *)in)->sin_addr, dest, size);
@@ -400,6 +405,7 @@ const char *inet_addrtop(SOCKADDR *in, char *dest, size_t size)
 			safe_snprintf(dest, size, "<unknown address>");
 			return NULL;
 	}
+#endif
 }
 
 uint16_t inet_addrport(SOCKADDR *in)
diff --git a/src/xpdev/sockwrap.h b/src/xpdev/sockwrap.h
index 43412dd10d..9896248059 100644
--- a/src/xpdev/sockwrap.h
+++ b/src/xpdev/sockwrap.h
@@ -48,8 +48,10 @@
 #ifndef _WINSOCKAPI_
 	#include <winsock2.h>	/* socket/bind/etc. */
 	#include <mswsock.h>	/* Microsoft WinSock2 extensions */
+    #include <ws2tcpip.h>	/* More stuff */
+	#define SOCK_MAXADDRLEN sizeof(SOCKADDR_STORAGE)
 	/* Let's agree on a standard WinSock symbol here, people */
-	#define _WINSOCKAPI_	
+	#define _WINSOCKAPI_
 #endif
 
 #elif defined __unix__		/* Unix-variant */
@@ -150,12 +152,18 @@ typedef struct {
 
 #define s_addr			S_un.S_addr
 
-#define socklen_t		int
-
 static  int wsa_error;
 #define ERROR_VALUE		((wsa_error=WSAGetLastError())>0 ? wsa_error-WSABASEERR : wsa_error)
 #define sendsocket(s,b,l)	send(s,b,l,0)
 
+/* For getaddrinfo() */
+#ifndef AI_ADDRCONFIG
+# define AI_ADDRCONFIG 0x400 // Vista or later
+#endif
+#ifndef AI_NUMERICSERV
+# define AI_NUMERICSERV 0		// Not supported by Win32
+#endif
+
 #else	/* BSD sockets */
 
 /* WinSock-isms */
-- 
GitLab