Include_winsock_h_before_stdlib_h_or_use_the_MSVCRT_library

Francois Gouget fgouget at free.fr
Fri Dec 20 01:07:30 CST 2002


On Wed, 18 Dec 2002, Dimitrie O. Paun wrote:

> Folks,
>
> This does not work (<= is include):
>    winsock.h
> <= sys/types.h
> <= sys/select.h
>
> BANG! FD_CLR gets defined before we have a chance to manipulate it.
>
> Any ideas on how to fix this?

Does this work?
There might still be problems with FreeBSD but I did not have time to
check today...


Index: include/winsock.h
===================================================================
RCS file: /home/wine/wine/include/winsock.h,v
retrieving revision 1.49
diff -u -r1.49 winsock.h
--- include/winsock.h	21 Nov 2002 23:44:19 -0000	1.49
+++ include/winsock.h	20 Dec 2002 01:14:39 -0000
@@ -56,29 +56,83 @@
 /*
  * This section defines the items that conflict with the Unix headers.
  */
+#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

-#ifndef __WINE_USE_MSVCRT
-/* Get the u_xxx types from the Unix headers. They will do and doing it
- * this way will avoid redefinitions. But 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).
+#  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
+#  include <sys/types.h>
+#  ifdef __MINGW_H
+    /* MinGW doesn't define the u_xxx types */
+#   define WS_DEFINE_U_TYPES
+#  endif
+# 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 <sys/types.h>
+#  ifndef FD_CLR
+    /* On Windows-style platforms, sys/types.h does not define FD_CLR
+     * and does not define the u_xxx types
+     */
+#   define WS_DEFINE_U_TYPES
+#  endif
+#  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 */
+
+#elif !defined(__WINE_USE_MSVCRT)
+# define WS_DEFINE_SELECT
 # include <sys/types.h>
-# if defined(USE_WS_PREFIX) || !defined(htonl)
-#  define WS_DEFINE_HTONL
-# endif /* htonl */
+# ifndef FD_CLR
+   /* On Windows-style platforms, sys/types.h does not define FD_CLR
+    * and does not define the u_xxx types
+    */
+#  define WS_DEFINE_U_TYPES
+# endif
 #else
-/* Since we are using the MSVCRT headers, we must define the u_xxx
- * types ourselves.
- */
+# define WS_DEFINE_SELECT
+  /* Our MSVCRT headers don't define the u_xxx types */
+# define WS_DEFINE_U_TYPES
+#endif /* !USE_WS_PREFIX && !__WINE_USE_MSVCRT */
+
+#ifdef WS_DEFINE_U_TYPES
 typedef unsigned char u_char;
 typedef unsigned short u_short;
 typedef unsigned int  u_int;
 typedef unsigned long u_long;
-# define WS_DEFINE_HTONL
-#endif /* __WINE_USE_MSVCRT */
-
+#endif


 /*
@@ -349,55 +403,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 */

@@ -929,12 +934,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(__WINE__) || !defined(__WINE_WINSOCK2__)
 /* Stuff specific to winsock.h */



-- 
Francois Gouget         fgouget at free.fr        http://fgouget.free.fr/
        It really galls me that most of the computer power in the world
                          is wasted on screen savers.
                     Chris Caldwell from the GIMPS project
                       http://www.mersenne.org/prime.htm





More information about the wine-devel mailing list