Try to make winsock.h more portable (based on a patch by Francois
Gouget).
diff --git a/include/winsock.h b/include/winsock.h
index 6006d48..6509ab1 100644
--- a/include/winsock.h
+++ b/include/winsock.h
@@ -56,17 +56,65 @@
/*
* This section defines the items that conflict with the Unix headers.
*/
-
-#include <sys/types.h>
-/* On FreeBSD we may get macros and prototypes for htonl & co.
- * This means the functions will not be called because of the macros.
- * So this should not harm us too much unless we try to define our own
- * prototypes (different calling convention).
+#ifndef USE_WS_PREFIX
+/* We are not using the WS_ prefix we risk getting conflicts for
+ * everything related to select.
*/
-#if defined(USE_WS_PREFIX) || !defined(htonl)
-# define WS_DEFINE_HTONL
-#endif /* htonl */
+# ifdef FD_CLR
+/* Too late, the Unix version of stdlib.h was included before winsock.h.
+ * This means select and all the related stuff is already defined and we
+ * cannot override types and function prototypes.
+ * All we can do is disable all these symbols so that they are not used
+ * inadvertantly.
+ */
+# undef FD_SETSIZE
+# undef FD_CLR
+# undef FD_SET
+# undef FD_ZERO
+# undef FD_ISSET
+# define FD_SETSIZE Include_winsock_h_before_stdlib_h_or_use_the_MSVCRT_library
+# define FD_CLR Include_winsock_h_before_stdlib_h_or_use_the_MSVCRT_library
+# define FD_SET Include_winsock_h_before_stdlib_h_or_use_the_MSVCRT_library
+# define FD_ZERO Include_winsock_h_before_stdlib_h_or_use_the_MSVCRT_library
+# define FD_ISSET Include_winsock_h_before_stdlib_h_or_use_the_MSVCRT_library
+# define fd_set Include_winsock_h_before_stdlib_h_or_use_the_MSVCRT_library
+# define select Include_winsock_h_before_stdlib_h_or_use_the_MSVCRT_library
+# else /* FD_CLR */
+/* stdlib.h has not been included yet so it's not too late. Include it now
+ * making sure that none of the select symbols is affected. Then we can
+ * define them with our own values.
+ */
+# define fd_set unix_fd_set
+# define timeval unix_timeval
+# define select unix_select
+# include <sys/types.h>
+# include <stdlib.h>
+# undef fd_set
+# undef timeval
+# undef select
+# undef FD_SETSIZE
+# undef FD_CLR
+# undef FD_SET
+# undef FD_ZERO
+# undef FD_ISSET
+
+# define WS_DEFINE_SELECT
+# endif /* FD_CLR */
+
+#else
+# define WS_DEFINE_SELECT
+# include <sys/types.h>
+# include <stdlib.h>
+#endif /* !USE_WS_PREFIX */
+
+#if defined(__MINGW_H) && !defined(MSVCRT_BSD_TYPES_DEFINED)
+/* MinGW doesn't define the u_xxx types */
+typedef unsigned char u_char;
+typedef unsigned short u_short;
+typedef unsigned int u_int;
+typedef unsigned long u_long;
+#endif
/*
@@ -337,55 +385,6 @@
* Select
*/
-#if !defined(USE_WS_PREFIX) && !defined(__WINE_USE_MSVCRT)
-/* We are not using the WS_ prefix and not using the MSVCRT either so we
- * risk getting conflicts for everything related to select.
- */
-# ifdef FD_CLR
-/* Too late, the Unix version of stdlib.h was included before winsock.h.
- * This means select and all the related stuff is already defined and we
- * cannot override types and function prototypes.
- * All we can do is disable all these symbols so that they are not used
- * inadvertantly.
- */
-# undef FD_SETSIZE
-# undef FD_CLR
-# undef FD_SET
-# undef FD_ZERO
-# undef FD_ISSET
-
-# define FD_SETSIZE Include_winsock_h_before_stdlib_h_or_use_the_MSVCRT_library
-# define FD_CLR Include_winsock_h_before_stdlib_h_or_use_the_MSVCRT_library
-# define FD_SET Include_winsock_h_before_stdlib_h_or_use_the_MSVCRT_library
-# define FD_ZERO Include_winsock_h_before_stdlib_h_or_use_the_MSVCRT_library
-# define FD_ISSET Include_winsock_h_before_stdlib_h_or_use_the_MSVCRT_library
-# define fd_set Include_winsock_h_before_stdlib_h_or_use_the_MSVCRT_library
-# define select Include_winsock_h_before_stdlib_h_or_use_the_MSVCRT_library
-# else
-/* stdlib.h has not been included yet so it's not too late. Include it now
- * making sure that none of the select symbols is affected. Then we can
- * define them with our own values.
- */
-# define fd_set unix_fd_set
-# define timeval unix_timeval
-# define select unix_select
-# include <stdlib.h>
-# undef fd_set
-# undef timeval
-# undef select
-# undef FD_SETSIZE
-# undef FD_CLR
-# undef FD_SET
-# undef FD_ZERO
-# undef FD_ISSET
-
-# define WS_DEFINE_SELECT
-# endif /* FD_CLR */
-
-#else
-# define WS_DEFINE_SELECT
-#endif /* !USE_WS_PREFIX && !__WINE_USE_MSVCRT */
-
#ifdef WS_DEFINE_SELECT
/* Define our own version of select and the associated types and macros */
@@ -917,12 +916,16 @@
int WINAPI WS(shutdown)(SOCKET,int);
SOCKET WINAPI WS(socket)(int,int,int);
-#ifdef WS_DEFINE_HTONL
+#if defined(htonl) && !defined(USE_WS_PREFIX)
+# undef htonl
+# undef htons
+# undef ntohl
+# undef ntohs
+#endif
u_long WINAPI WS(htonl)(u_long);
u_short WINAPI WS(htons)(u_short);
u_long WINAPI WS(ntohl)(u_long);
u_short WINAPI WS(ntohs)(u_short);
-#endif
#if defined(__WINESRC__) || !defined(__WINE_WINSOCK2__)
/* Stuff specific to winsock.h */