From: Zebediah Figura Subject: [PATCH 4/4] include: Require winsock headers to be included before system headers. Message-Id: <20220110233107.97773-4-zfigura@codeweavers.com> Date: Mon, 10 Jan 2022 17:31:07 -0600 In-Reply-To: <20220110233107.97773-1-zfigura@codeweavers.com> References: <20220110233107.97773-1-zfigura@codeweavers.com> We have already started requiring WINELIB_USE_WINSOCK for this case; let's also take the opportunity to remove some workarounds. Signed-off-by: Zebediah Figura --- include/winsock.h | 73 +++++++++------------------------------------- include/winsock2.h | 58 ++++-------------------------------- 2 files changed, 18 insertions(+), 113 deletions(-) diff --git a/include/winsock.h b/include/winsock.h index 4b8242e404d..38186f8c80d 100644 --- a/include/winsock.h +++ b/include/winsock.h @@ -32,53 +32,12 @@ #ifndef __WINE_WINSOCKAPI_STDLIB_H #define __WINE_WINSOCKAPI_STDLIB_H -/* - * This section defines the items that conflict with the Unix headers. - */ #ifndef USE_WS_PREFIX -/* We are not using the WS_ prefix 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 - * inadvertently. - */ -# include -# 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 -# elif defined(RLIM_INFINITY) /* On Darwin stdlib.h includes sys/resource.h which defines timeval but not the fd_set macros */ -# define fd_set unix_fd_set -# include -# include -# include -# undef fd_set -# undef FD_SETSIZE -# undef FD_CLR -# undef FD_SET -# undef FD_ZERO -# undef FD_ISSET -# define select Include_winsock_h_before_sys_types_h_or_use_the_MSVCRT_library -# define timeval Include_winsock_h_before_sys_types_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. - */ +# if defined(FD_CLR) || defined(RLIM_INFINITY) +# error Include winsock.h before stdlib.h, time.h, or sys/types.h, or use the MSVCRT library +# else # define fd_set unix_fd_set # define timeval unix_timeval # define select unix_select @@ -98,14 +57,13 @@ # undef FD_ZERO # undef FD_ISSET # undef _TIMEVAL_DEFINED - -# define WS_DEFINE_SELECT # endif /* FD_CLR */ #else -# define WS_DEFINE_SELECT + # include # include + #endif /* !USE_WS_PREFIX */ #endif /* __WINE_WINSOCKAPI_STDLIB_H */ @@ -406,18 +364,15 @@ typedef struct WS(linger) * Select */ -#ifdef WS_DEFINE_SELECT -/* Define our own version of select and the associated types and macros */ - -# ifndef USE_WS_PREFIX -# ifndef FD_SETSIZE -# define FD_SETSIZE 64 -# endif -# else -# ifndef WS_FD_SETSIZE -# define WS_FD_SETSIZE 64 -# endif +#ifndef USE_WS_PREFIX +# ifndef FD_SETSIZE +# define FD_SETSIZE 64 # endif +#else +# ifndef WS_FD_SETSIZE +# define WS_FD_SETSIZE 64 +# endif +#endif typedef struct WS(fd_set) { @@ -475,8 +430,6 @@ typedef struct WS(timeval) int WINAPI __WSAFDIsSet(SOCKET,WS(fd_set)*); -#endif /* WS_DEFINE_SELECT */ - /* we have to define hton/ntoh as macros to avoid conflicts with Unix headers */ #ifndef USE_WS_PREFIX diff --git a/include/winsock2.h b/include/winsock2.h index 565979a74c0..0e6fa448570 100644 --- a/include/winsock2.h +++ b/include/winsock2.h @@ -27,53 +27,12 @@ #ifndef __WINE_WINSOCKAPI_STDLIB_H #define __WINE_WINSOCKAPI_STDLIB_H -/* - * This section defines the items that conflict with the Unix headers. - */ #ifndef USE_WS_PREFIX -/* We are not using the WS_ prefix 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 - * inadvertently. - */ -# include -# 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 -# elif defined(RLIM_INFINITY) /* On Darwin stdlib.h includes sys/resource.h which defines timeval but not the fd_set macros */ -# define fd_set unix_fd_set -# include -# include -# include -# undef fd_set -# undef FD_SETSIZE -# undef FD_CLR -# undef FD_SET -# undef FD_ZERO -# undef FD_ISSET -# define select Include_winsock_h_before_sys_types_h_or_use_the_MSVCRT_library -# define timeval Include_winsock_h_before_sys_types_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. - */ +# if defined(FD_CLR) || defined(RLIM_INFINITY) +# error Include winsock2.h before stdlib.h, time.h, or sys/types.h, or use the MSVCRT library +# else # define fd_set unix_fd_set # define timeval unix_timeval # define select unix_select @@ -93,14 +52,13 @@ # undef FD_ZERO # undef FD_ISSET # undef _TIMEVAL_DEFINED - -# define WS_DEFINE_SELECT # endif /* FD_CLR */ #else -# define WS_DEFINE_SELECT + # include # include + #endif /* !USE_WS_PREFIX */ #endif /* __WINE_WINSOCKAPI_STDLIB_H */ @@ -562,8 +520,6 @@ typedef struct WS(timeval) } TIMEVAL, *PTIMEVAL, *LPTIMEVAL; #endif -#ifdef WS_DEFINE_SELECT - #define __WS_FD_CLR(fd, set, cast) do { \ unsigned int __i; \ for (__i = 0; __i < ((cast*)(set))->fd_count; __i++) \ @@ -626,8 +582,6 @@ typedef struct WS(fd_set) SOCKET fd_array[WS(FD_SETSIZE)]; } WS(fd_set), FD_SET, *PFD_SET, *LPFD_SET; -#endif - typedef struct /*WS(pollfd)*/ { SOCKET fd; @@ -1078,9 +1032,7 @@ typedef int (WINAPI *LPFN_GETHOSTNAME)(char*,int); typedef int (WINAPI *LPFN_GETPEERNAME)(SOCKET,struct WS(sockaddr)*,int*); typedef struct WS(protoent)* (WINAPI *LPFN_GETPROTOBYNAME)(const char*); typedef struct WS(protoent)* (WINAPI *LPFN_GETPROTOBYNUMBER)(int); -#ifdef WS_DEFINE_SELECT typedef int (WINAPI* LPFN_SELECT)(int,WS(fd_set)*,WS(fd_set)*,WS(fd_set)*,const struct WS(timeval)*); -#endif typedef struct WS(servent)* (WINAPI *LPFN_GETSERVBYNAME)(const char*,const char*); typedef struct WS(servent)* (WINAPI *LPFN_GETSERVBYPORT)(int,const char*); typedef int (WINAPI *LPFN_GETSOCKNAME)(SOCKET,struct WS(sockaddr)*,int*); -- 2.34.1