This is the mail archive of the newlib@sources.redhat.com mailing list for the newlib project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: Collisions between newkib and w32api sockets


Christopher Faylor wrote:
> 
> 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
> 

Go-ahead Chris.

-- Jeff J.

> >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 */


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]