winsock: fix for Winelib apps

Dimitrie O. Paun dpaun at rogers.com
Mon Mar 17 23:03:12 CST 2003


Yes,

This is Francois' patch update to the latest header changes.
I know it's been discussed before, and that it breaks FreeBSD.
Unfortunately, it doesn't seem like we're going to get a
solution to the problem anytime soon, so I've decided to
submit it once again for consideration.

I think this one is a step forward. Yes, it breaks FreeBSD, but
the current state _is_ broken on Linux, which is even worse IMO.
More importantly, if someone is to work on a fix, this patch is
a better starting point than the current broken state.

All credit goes to  Francois, of course. Please apply.

ChangeLog
    Francois Gouget <fgouget at free.fr>
    winsock.h fix for Winelib use (under Linux).


Index: include/winsock.h
===================================================================
RCS file: /var/cvs/wine/include/winsock.h,v
retrieving revision 1.51
diff -u -r1.51 winsock.h
--- include/winsock.h	17 Mar 2003 21:22:34 -0000	1.51
+++ include/winsock.h	17 Mar 2003 21:52:12 -0000
@@ -56,17 +56,82 @@
 /*
  * 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
 
-#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).
- */
-#if defined(USE_WS_PREFIX) || !defined(htonl)
-# define WS_DEFINE_HTONL
-#endif /* htonl */
+#  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>
+# 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
+# define WS_DEFINE_SELECT
+# include <sys/types.h>
+#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;
+#endif
 
 
 /*
@@ -337,55 +402,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 +933,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 */


-- 
Dimi.





More information about the wine-patches mailing list