htonl & co conflict on FreeBSD
Francois Gouget
fgouget at free.fr
Sun Jan 27 02:11:06 CST 2002
We get conflicts when using winsock.h in a Winelib application on
FreeBSD (and we're not using the msvcrt headers). The reason is that we
include 'sys/types.h' which includes /usr/include/machine/endian.h which
defines prototypes and macros for htonl and friends.
Two consequences:
* when the time comes to define our own prototypes the macros get
expanded and wreak havoc
* if we dodge the macros, we get into trouble because the prototypes
are incompatible (cdecl vs. stdcall)
We cannot dodge this one like we do for stdlib.h either because of
the macros: #define htonl unix_htonl just causes tons of ugly 'htonl
macros redefined' warnings.
But in fact we should be able to use the definitions provided by the
FreeBSD headers: they all do the same things anyway. And since macros
are defined, the functions will never get called, so the calling
convention difference should not matter.
So we include sys/types.h and simply avoid defining htonl and friends
if we notice that the corresponding macros are defined.
Changelog:
* include/winsock.h
Avoid conflict with htonl & friends in Winelib on FreeBSD
--
Francois Gouget fgouget at free.fr http://fgouget.free.fr/
Advice is what we ask for when we already know the answer but wish we didn't
-- Eric Jong
-------------- next part --------------
Index: include/winsock.h
===================================================================
RCS file: /home/wine/wine/include/winsock.h,v
retrieving revision 1.38
diff -u -r1.38 winsock.h
--- include/winsock.h 2001/12/14 22:48:38 1.38
+++ include/winsock.h 2002/01/27 06:19:02
@@ -42,10 +42,16 @@
*/
#ifndef __WINE_USE_MSVCRT
-/* Get the u_xxx types from the Unix headers. They will do and
- * doing it this way will avoid redefinitions.
+/* 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).
*/
# include <sys/types.h>
+# ifndef htonl
+# define WS_DEFINE_HTONL
+# endif /* htonl */
#else
/* Since we are using the MSVCRT headers, we must define the u_xxx
* types ourselves.
@@ -54,6 +60,7 @@
typedef unsigned char u_short;
typedef unsigned int u_int;
typedef unsigned long u_long;
+# define WS_DEFINE_HTONL
#endif /* __WINE_USE_MSVCRT */
@@ -902,14 +909,10 @@
struct WS(servent)* WINAPI WS(getservbyport)(int,const char*);
int WINAPI WS(getsockname)(SOCKET,struct WS(sockaddr)*,int*);
int WINAPI WS(getsockopt)(SOCKET,int,int,char*,int*);
-u_long WINAPI WS(htonl)(u_long);
-u_short WINAPI WS(htons)(u_short);
unsigned long WINAPI WS(inet_addr)(const char*);
char* WINAPI WS(inet_ntoa)(struct WS(in_addr));
int WINAPI WS(ioctlsocket)(SOCKET,long,u_long*);
int WINAPI WS(listen)(SOCKET,int);
-u_long WINAPI WS(ntohl)(u_long);
-u_short WINAPI WS(ntohs)(u_short);
int WINAPI WS(recv)(SOCKET,char*,int,int);
int WINAPI WS(recvfrom)(SOCKET,char*,int,int,struct WS(sockaddr)*,int*);
int WINAPI WS(send)(SOCKET,const char*,int,int);
@@ -918,6 +921,12 @@
int WINAPI WS(shutdown)(SOCKET,int);
SOCKET WINAPI WS(socket)(int,int,int);
+#ifdef WS_DEFINE_HTONL
+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 */
More information about the wine-patches
mailing list