From 33d5753894d6542ae76da2ee4bc81e37467722a2 Mon Sep 17 00:00:00 2001
From: Rob Swindell <rob@synchro.net>
Date: Sat, 5 Dec 2020 21:27:10 -0800
Subject: [PATCH] Introduce and use set_socket_errno()

xp_inet_pton() now sets the socket errno value, doing as instructed by the TODO.
---
 src/xpdev/sockwrap.c | 11 ++++++++++-
 src/xpdev/sockwrap.h |  1 +
 2 files changed, 11 insertions(+), 1 deletion(-)

diff --git a/src/xpdev/sockwrap.c b/src/xpdev/sockwrap.c
index f461b887df..0cf278787c 100644
--- a/src/xpdev/sockwrap.c
+++ b/src/xpdev/sockwrap.c
@@ -508,13 +508,22 @@ DLLEXPORT char* socket_strerror(int error_number, char* buf, size_t buflen)
 #endif
 }
 
+DLLEXPORT void set_socket_errno(int err)
+{
+#if defined(_WINSOCKAPI_)
+	WSASetLastError(err);
+#else
+	errno = err;
+#endif
+}
+
 DLLEXPORT int xp_inet_pton(int af, const char *src, void *dst)
 {
 	struct addrinfo hints = {0};
 	struct addrinfo *res, *cur;
 
 	if (af != AF_INET && af != AF_INET6) {
-		// TODO: Should set socket_errno to EAFNOSUPPORT
+		set_socket_errno(EAFNOSUPPORT);
 		return -1;
 	}
 
diff --git a/src/xpdev/sockwrap.h b/src/xpdev/sockwrap.h
index 9507b2a61d..73e7c90cce 100644
--- a/src/xpdev/sockwrap.h
+++ b/src/xpdev/sockwrap.h
@@ -224,6 +224,7 @@ DLLEXPORT uint16_t inet_addrport(union xp_sockaddr *addr);
 DLLEXPORT void inet_setaddrport(union xp_sockaddr *addr, uint16_t port);
 DLLEXPORT BOOL inet_addrmatch(union xp_sockaddr* addr1, union xp_sockaddr* addr2);
 DLLEXPORT char* socket_strerror(int, char*, size_t);
+DLLEXPORT void set_socket_errno(int);
 DLLEXPORT int xp_inet_pton(int af, const char *src, void *dst);
 #if defined(_WIN32) // mingw and WinXP's WS2_32.DLL don't have inet_pton():
 	#define inet_pton	xp_inet_pton
-- 
GitLab