Collisions between newkib and w32api sockets
Christopher Faylor
cgf@redhat.com
Sun Mar 18 09:44:00 GMT 2001
On Sun, Mar 18, 2001 at 12:26:57PM -0500, Earnie Boyd wrote:
>Chris,
>
>If you can affect the newlib change today, I'll take care of the w32api
>changes. If not it'll have to wait toward the end of next week.
Unfortunately, I think that parts of this are outside of my
maintainership authority so I can't check this stuff in until
Jeff Johnston gives the go-ahead.
cgf
>Christopher Faylor wrote:
>>
>> Sorry for the delay. FWIW, I recommend that these patches be installed.
>>
>> cgf
>>
>> On Sun, Mar 11, 2001 at 02:08:16PM +1300, Danny Smith wrote:
>> >There are several collisions between newlib and winsock names
>> >These are the ones I know about.
>> >
>> >1) The #ifndef _WINSOCK_H guard for BSD int typedefs in the newlib
>> >sys/types needs to be made more specific to prevent header inclusion
>> >order problems.
>> >Consider what happens here:
>> >#include winsock.h
>> >#include windows.h
>> >
>> >winsock.h is included and defines _WINSOCK_H
>> >winsock.h then includes >
>> > windows.h >
>> > windef.h >
>> > winnt.h >
>> > string.h >
>> > sys/reent.h >
>> > time.h >
>> > sys/types.h
>> >which sees the _WINSOCK_H define and skips the BSD int typedefs
>> >(u_char, u_short,etc) But ... sys/types defines _SYS_TYPES_H which
>> >makes winsock.h also skip the BSD typedefs later on. The types are
>> >not defined anywhere.
>> >
>> >2. fd_set. The same chain of included headers from windows.h can also
>> >cause the wrong fd_set definitions for winsock interface, but only in
>> >the case where windows.h is included *before* winsock.h.
>> >sys/types is included before winsock.h (ie before _WINSOCK_H is
>> >defined), so the sys/types definitions take precedence. One way to
>> >prevent the sys/types definitions of fd_set is to use Win32_Winsock (or
>> >similar macro that
>> >signifies intent to use winsock interface), rather than _WINSOCK_H as a
>> >guard.
>> >
>> >3. gethostname. Both winsock[2].h and the newlib sys/unistd.h declare
>> >gethostname. The w32api version is __stdcall, the unistd.h one is not
>> >and also differs in the second parameter (unsigned int rather than
>> >int).
>> >IMO, if we want w32api for sockets, the function in
>> >winsock.h/libwsock32.a should be used.
>> >
>> >While I'm at I'd change the macro name Win32_Winsock to something a bit
>> >more consistent with standard: eg __USE_W32_SOCKETS_ but that is just
>> >my preference.
>> >
>> >Mutually dependent patches to newlib and w32api, against winsup cvs,
>> >follow.
>> >
>> >I am submitting to mingw project as well for changes to w32api.
>> >
>> >
>> >Danny
>> >
>> >2001-03-10 Danny Smith <dannysmith@users.sourceforge.net>
>> > * libc/include/sys/types.h (BSD int typedefs): Guard with
>> > _BSDTYPES_DEFINED rather than _WINSOCK_H
>> > (fd_set): Add !defined __USE_W32_SOCKETS to guard;
>> > define _SYS_TYPES_FD_SET.
>> > * libc/include/sys/unistd.h (gethostname): don't declare if
>> > defined (_WINSOCK_H) || defined (__USE_W32_SOCKETS)
>> >
>> >
>> >ChangeLog for w32api
>> >
>> >2001-03-10 Danny Smith <dannysmith@users.sourceforge.net>
>> > * include/winsock.h (_SYS_TYPES_H macro guard for int types): Remove;
>> > use only _BSDTYPES_DEFINED macro now defined in newlib sys/types.h.
>> > (SYS_TYPES_H macro guard for fd_set): Replace with_SYS_TYPES_FD_SET
>> > macro now defined in newlib sys/types.h. Emit warning if defined.
>> > * include/winsock2.h:As per winsock.h.
>> > * include/windows.h (Win32_Winsock): Replace with new macros
>> > __USE_W32_SOCKETS and warn of deprecation.
>> >
>> >
>> >
>> >--- ./src/newlib/libc/include/sys/unistd.h Tue Mar 06 13:04:42 2001
>> >+++ d:/cygwin/usr/include/sys/unistd.h Sat Mar 10 18:06:40 2001
>> >@@ -115,7 +115,10 @@ int _EXFUN(setdtablesize, (int));
>> > unsigned _EXFUN(usleep, (unsigned int __useconds));
>> > int _EXFUN(ftruncate, (int __fd, off_t __length));
>> > int _EXFUN(truncate, (const char *, off_t __length));
>> >-int _EXFUN(gethostname, (char *__name, size_t __len));
>> >+#if !(defined (_WINSOCK_H) || defined (__USE_W32_SOCKETS))
>> >+/* winsock[2].h defines as __stdcall, and with int as 2nd arg */
>> >+ int _EXFUN(gethostname, (char *__name, size_t __len));
>> >+#endif
>> > char * _EXFUN(mktemp, (char *));
>> > int _EXFUN(sync, (void));
>> > int _EXFUN(readlink, (const char *__path, char *__buf, int
>> >__buflen));
>> >--- ./src/newlib/libc/include/sys/types.h Tue Dec 12 13:24:08 2000
>> >+++ d:/cygwin/usr/include/sys/types.h Sun Mar 11 07:50:26 2001
>> >@@ -49,11 +49,13 @@
>> > # define physadr physadr_t
>> > # define quad quad_t
>> >
>> >-#ifndef _WINSOCK_H
>> >+#ifndef _BSDTYPES_DEFINED
>> >+/* also defined in mingw/gmon.h and in w32api/winsock[2].h */
>> > typedef unsigned char u_char;
>> > typedef unsigned short u_short;
>> > typedef unsigned int u_int;
>> > typedef unsigned long u_long;
>> >+#define _BSDTYPES_DEFINED
>> > #endif
>> >
>> > typedef unsigned short ushort; /* System V compatibility */
>> >@@ -152,12 +154,14 @@ typedef unsigned int mode_t _ST_INT32;
>> > typedef unsigned short nlink_t;
>> >
>> > /* We don't define fd_set and friends if we are compiling POSIX
>> >- source, or if we have included the Windows Sockets.h header (which
>> >- defines Windows versions of them). Note that a program which
>> >- includes the Windows sockets.h header must know what it is doing;
>> >- it must not call the cygwin32 select function. */
>> >-# if ! defined (_POSIX_SOURCE) && ! defined (_WINSOCK_H)
>> >-
>> >+ source, or if we have included (or may include as indicated
>> >+ by __USE_W32_SOCKETS) the W32api winsock[2].h header which
>> >+ defines Windows versions of them. Note that a program which
>> >+ includes the W32api winsock[2].h header must know what it is doing;
>> >+ it must not call the cygwin32 select function.
>> >+*/
>> >+# if !(defined (_POSIX_SOURCE) || defined (_WINSOCK_H) || defined
>> >(__USE_W32_SOCKETS))
>> >+# define _SYS_TYPES_FD_SET
>> > # define NBBY 8 /* number of bits in a byte */
>> > /*
>> > * Select uses bit masks of file descriptors in longs.
>> >@@ -193,7 +197,7 @@ typedef struct _types_fd_set {
>> > *__tmp++ = 0; \
>> > }))
>> >
>> >-# endif /* ! defined (_POSIX_SOURCE) && ! defined (_WINSOCK_H) */
>> >+# endif /* !(defined (_POSIX_SOURCE) || defined (_WINSOCK_H) ||
>> >defined (__USE_W32_SOCKETS)) */
>> >
>> > #undef __MS_types__
>> > #undef _ST_INT32
>> >--- ./src/winsup/w32api/include/winsock.h Thu Feb 22 08:40:47 2001
>> >+++ d:/cygwin/usr/include/w32api/winsock.h Sat Mar 10 21:31:16 2001
>> >@@ -17,14 +17,14 @@
>> > extern "C" {
>> > #endif
>> >
>> >-#if !defined ( _BSDTYPES_DEFINED ) && !defined ( _SYS_TYPES_H )
>> >+#if !defined ( _BSDTYPES_DEFINED )
>> > /* also defined in gmon.h and in cygwin's sys/types */
>> > typedef unsigned char u_char;
>> > typedef unsigned short u_short;
>> > typedef unsigned int u_int;
>> > typedef unsigned long u_long;
>> > #define _BSDTYPES_DEFINED
>> >-#endif /* ndef _BSDTYPES_ _SYS_TYPES_H */
>> >+#endif /* !defined _BSDTYPES_DEFINED */
>> > typedef u_int SOCKET;
>> > #ifndef FD_SETSIZE
>> > #define FD_SETSIZE 64
>> >@@ -35,8 +35,10 @@ typedef u_int SOCKET;
>> > #define SD_SEND 0x01
>> > #define SD_BOTH 0x02
>> >
>> >-#ifndef _SYS_TYPES_H
>> >-/* fd_set may have been defined by the newlib <sys/types.h>. */
>> >+#ifndef _SYS_TYPES_FD_SET
>> >+/* fd_set may have be defined by the newlib <sys/types.h>
>> >+ * if __USE_W32_SOCKETS not defined.
>> >+ */
>> > #ifdef fd_set
>> > #undef fd_set
>> > #endif
>> >@@ -71,7 +73,11 @@ for (__i = 0; __i < ((fd_set *)(set))->f
>> > #ifndef FD_ISSET
>> > #define FD_ISSET(fd, set) __WSAFDIsSet((SOCKET)(fd), (fd_set *)(set))
>> > #endif
>> >-#endif /* ndef _SYS_TYPES_H */
>> >+#else /* def _SYS_TYPES_FD_SET */
>> >+#warning "fd_set and associated macros have been defined in sys/types.
>> >\
>> >+ This can cause runtime problems with W32 sockets"
>> >+#endif /* ndef _SYS_TYPES_FD_SET */
>> >+
>> > #ifndef __INSIDE_CYGWIN__
>> > struct timeval {
>> > long tv_sec;
>> >--- ./src/winsup/w32api/include/winsock2.h Thu Feb 22 08:40:47 2001
>> >+++ d:/cygwin/usr/include/w32api/winsock2.h Sat Mar 10 21:31:36 2001
>> >@@ -25,14 +25,14 @@
>> > extern "C" {
>> > #endif
>> > /* Names common to Winsock1.1 and Winsock2 */
>> >-#if !defined ( _BSDTYPES_DEFINED ) && !defined ( _SYS_TYPES_H )
>> >+#if !defined ( _BSDTYPES_DEFINED )
>> > /* also defined in gmon.h and in cygwin's sys/types */
>> > typedef unsigned char u_char;
>> > typedef unsigned short u_short;
>> > typedef unsigned int u_int;
>> > typedef unsigned long u_long;
>> > #define _BSDTYPES_DEFINED
>> >-#endif /* ndef _BSDTYPES_ _SYS_TYPES_H */
>> >+#endif /* ! def _BSDTYPES_DEFINED */
>> > typedef u_int SOCKET;
>> > #ifndef FD_SETSIZE
>> > #define FD_SETSIZE 64
>> >@@ -43,8 +43,10 @@ typedef u_int SOCKET;
>> > #define SD_SEND 0x01
>> > #define SD_BOTH 0x02
>> >
>> >-#ifndef _SYS_TYPES_H
>> >-/* fd_set may have been defined by the newlib <sys/types.h>. */
>> >+#ifndef _SYS_TYPES_FD_SET
>> >+/* fd_set may be defined by the newlib <sys/types.h>
>> >+ * if __USE_W32_SOCKETS not defined.
>> >+ */
>> > #ifdef fd_set
>> > #undef fd_set
>> > #endif
>> >@@ -68,7 +70,7 @@ for (__i = 0; __i < ((fd_set *)(set))->f
>> > } while (0)
>> > #endif
>> > #ifndef FD_SET
>> >-/* this differs from the define in winsock.h */
>> >+/* this differs from the define in winsock.h and in cygwin sys/types.h
>> >*/
>> > #define FD_SET(fd, set) do { u_int __i;\
>> > for (__i = 0; __i < ((fd_set *)(set))->fd_count ; __i++) {\
>> > if (((fd_set *)(set))->fd_array[__i] == (fd)) {\
>> >@@ -89,7 +91,10 @@ if (__i == ((fd_set *)(set))->fd_count)
>> > #ifndef FD_ISSET
>> > #define FD_ISSET(fd, set) __WSAFDIsSet((SOCKET)(fd), (fd_set *)(set))
>> > #endif
>> >-#endif /* ndef _SYS_TYPES_H */
>> >+#else /* def _SYS_TYPES_FD_SET */
>> >+#warning "fd_set and associated macros have been defined in sys/types.
>> >\
>> >+ This may cause runtime problems with W32 sockets"
>> >+#endif /* ndef _SYS_TYPES_FD_SET */
>> > #ifndef __INSIDE_CYGWIN__
>> > struct timeval {
>> > long tv_sec;
>> >--- ./src/winsup/w32api/include/windows.h Fri Jul 28 06:30:51 2000
>> >+++ d:/cygwin/usr/include/w32api/windows.h Sat Mar 10 20:57:19 2001
>> >@@ -133,7 +133,14 @@
>> > #include <shellapi.h>
>> > #include <winperf.h>
>> > #include <winspool.h>
>> >-#if defined(Win32_Winsock) || !(defined(__INSIDE_CYGWIN__) ||
>> >defined(__CYGWIN__) || defined(__CYGWIN32__) || defined(_UWIN))
>> >+#if defined(Win32_Winsock)
>> >+#warning "The Win32_Winsock macro name is deprecated.\
>> >+ Please use __USE_W32_SOCKETS instead"
>> >+#ifndef __USE_W32_SOCKETS
>> >+#define __USE_W32_SOCKETS
>> >+#endif
>> >+#endif
>> >+#if defined(__USE_W32_SOCKETS) || !(defined(__INSIDE_CYGWIN__) ||
>> >defined(__CYGWIN__) || defined(__CYGWIN32__) || defined(_UWIN))
>> > #include <winsock.h>
>> > #endif
>> > #endif /* WIN32_LEAN_AND_MEAN */
More information about the Newlib
mailing list