Fix Windows build for compilers other than VC10+
authorSteve Hay <steve.m.hay@googlemail.com>
Sat, 7 Sep 2013 16:28:29 +0000 (17:28 +0100)
committerSteve Hay <steve.m.hay@googlemail.com>
Mon, 16 Sep 2013 14:37:33 +0000 (15:37 +0100)
The new errno2.h only ensures that those new Exxx constants which are
required by convert_wsa_error_to_errno() have definitions; the other new
Exxx constants will remain undefined on compilers other than VC10+, so we
must take care not to use them unless we know they are defined.

win32/include/sys/errno2.h
win32/win32.c
win32/win32sck.c

index b4749a3..c2d46fb 100644 (file)
 /* EPROVIDERFAILEDINIT is not an errno.h value at all */
 /* EREFUSED is not an errno.h value at all */
 
+/* Set a flag indicating whether <errno.h> has the POSIX supplement (the first
+ * constant in which is EADDRINUSE). If so then we won't have just defined it as
+ * WSAEADDRINUSE above.
+ */
+#undef ERRNO_HAS_POSIX_SUPPLEMENT
+#if EADDRINUSE != WSAEADDRINUSE
+#  define ERRNO_HAS_POSIX_SUPPLEMENT
+#endif
+
 #endif /* _INC_SYS_ERRNO2 */
index 3802a54..9f996d6 100644 (file)
@@ -2586,7 +2586,9 @@ win32_feof(FILE *fp)
     return (feof(fp));
 }
 
+#ifdef ERRNO_HAS_POSIX_SUPPLEMENT
 extern int convert_errno_to_wsa_error(int err); /* in win32sck.c */
+#endif
 
 /*
  * Since the errors returned by the socket error function
@@ -2607,7 +2609,7 @@ win32_strerror(int e)
         dTHXa(NULL);
        if (e < 0)
            e = GetLastError();
-#if EADDRINUSE != WSAEADDRINUSE
+#ifdef ERRNO_HAS_POSIX_SUPPLEMENT
        /* VC10+ define a "POSIX supplement" of errno values ranging from
         * EADDRINUSE (100) to EWOULDBLOCK (140), but sys_nerr is still 43 and
         * strerror() returns "Unknown error" for them. We must therefore still
index f065be8..508cc0a 100644 (file)
@@ -185,11 +185,13 @@ convert_wsa_error_to_errno(int wsaerr)
     return wsaerr;
 }
 
+#ifdef ERRNO_HAS_POSIX_SUPPLEMENT
 /* Translate Exxx values in the POSIX supplement range defined in VC++ 2010 and
  * above (EADDRINUSE <= err <= EWOULDBLOCK) to corresponding WSAExxx values. Not
  * all such Exxx constants have corresponding WSAExxx constants in <winsock2.h>;
  * we just use ERROR_INVALID_FUNCTION for those that are missing but do not
- * really expect to encounter them anyway.
+ * really expect to encounter them anyway in the context in which this function
+ * is called.
  * Other Exxx values (err < sys_nerr) are returned unchanged.
  */
 int
@@ -282,6 +284,7 @@ convert_errno_to_wsa_error(int err)
 
     return err;
 }
+#endif /* ERRNO_HAS_POSIX_SUPPLEMENT */
 
 static int
 get_last_socket_error(void)