Collisions between newkib and w32api sockets

Earnie Boyd earnie_boyd@yahoo.com
Sun Mar 18 09:26:00 GMT 2001


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.

Earnie.

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 */
> >
> >_____________________________________________________________________________
> > http://store.yahoo.com.au - Yahoo! Store
> >- The fastest, easiest way to open an online store.

_________________________________________________________
Do You Yahoo!?
Get your free @yahoo.com address at http://mail.yahoo.com




More information about the Newlib mailing list