diff --git a/src/xpdev/sockwrap.c b/src/xpdev/sockwrap.c
index f461b887dfaa8a3a2252bc77b4b477a5a0c475cd..0cf278787c931c400e58506ca4fac83b8ed68827 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 9507b2a61d2aa1ce7e6c8c437d7b47a739ff1f0c..73e7c90cced306b8d1b67ae9e6b9fc1b99d8bf75 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