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 */