OSDN Git Service

Factor <winsock.h> duplicate content out of <winsock2.h>
authorKeith Marshall <keith@users.osdn.me>
Tue, 28 Nov 2017 13:28:34 +0000 (13:28 +0000)
committerKeith Marshall <keith@users.osdn.me>
Tue, 28 Nov 2017 13:28:34 +0000 (13:28 +0000)
w32api/ChangeLog
w32api/include/winsock.h
w32api/include/winsock2.h

index 5e95b34..e1919ca 100644 (file)
@@ -1,3 +1,18 @@
+2017-11-28  Keith Marshall  <keith@users.osdn.me>
+
+       Factor <winsock.h> duplicate content out of <winsock2.h>
+
+       * include/winsock2.h: Remove all declarations and definitions which
+       are identically specified in <winsock.h>, but keep them in scope by...
+       [! defined _WINSOCK_H]: ...including <winsock.h> itself; override any
+       declarations and definitions therefrom, which introduce conflicts.
+       [defined _WINSOCK_H]: Diagnose misuse; suppress all further
+       definitions and declarations.
+
+       * include/winsock.h (SOMAXCONN): Add comment; note disparity between
+       WinSock v1.1 and WinSock v2, the latter of which will override when
+       correctly included by <winsock2.h>
+
 2017-11-24  Keith Marshall  <keith@users.osdn.me>
 
        Make <winsock.h> and <winsock2.h> duplicate code congruent.
index 8b83d0c..08967b3 100644 (file)
@@ -498,6 +498,11 @@ struct sockproto
 
 #ifndef __INSIDE_MSYS__
 
+/* This definition of SOMAXCONN is correct for WinSock v1.1, but not
+ * for WinSock v2; we define it thus here, but note that, if included
+ * by <winsock2.h>, it will subsequently be overridden by the correct
+ * WinSock v2 definition.
+ */
 #define SOMAXCONN                                 5
 
 #define MSG_OOB                                   1
index 328e00e..cdd1843 100644 (file)
  * Portions Copyright (C) 1993 by Digital Equipment Corporation.
  *
  */
-#if !(defined _WINSOCK2_H || defined _WINSOCK_H)
+#ifndef _WINSOCK2_H
 #pragma GCC system_header
 #define _WINSOCK2_H
 
-/* WinSock v2 deprecates several features, which are standard
- * in WinSock v1.1; their declarations remain in scope, but we
- * define this qualifying macro up-front, to ensure that the
- * deprecated status is recorded.
+#ifdef _WINSOCK_H  /* included prematurely */
+/* Oops!  <winsock.h> appears to have been included already, which now
+ * precludes any use of WinSock v2 protocol.
  */
-#define __WINSOCK2_DEPRECATED  __MINGW_ATTRIB_DEPRECATED
-
-#define _WINSOCK_H /* to prevent later inclusion of winsock.h */
-
-#define _GNU_H_WINDOWS32_SOCKETS
-#define __WINSOCK_H_SOURCED__ 1
-
-#include <windows.h>
-#include <winerror.h>
-#include <sys/bsdtypes.h>
-#include <sys/time.h>
-
-#ifndef WINSOCK_API_LINKAGE
-#ifdef __W32API_USE_DLLIMPORT__
-#define WINSOCK_API_LINKAGE DECLSPEC_IMPORT
-#else
-#define WINSOCK_API_LINKAGE
-#endif
-#endif
-
-#if ! defined _USE_SYS_TYPES_FD_SET && defined USE_SYS_TYPES_FD_SET
-/* Originally defined by the deprecated name, USE_SYS_TYPES_FD_SET, users
- * may specify this to suppress warnings, in the event that (incompatible)
- * fd_set manipulation macros may have been inherited from <sys/types.h>;
- * accommodate use of the deprecated feature test name.
- */
-#warning "Feature test macro USE_SYS_TYPES_FD_SET is deprecated."
-#warning "Use the _USE_SYS_TYPES_FD_SET feature test macro instead."
-#define _USE_SYS_TYPES_FD_SET  1
-#endif
-
-_BEGIN_C_DECLS
-
-/* Names common to Winsock1.1 and Winsock2
- */
-typedef u_int  SOCKET;
-
-#ifndef FD_SETSIZE
-#define FD_SETSIZE                               64
-#endif
-
-/* shutdown() how types */
-#define SD_RECEIVE                             0x00
-#define SD_SEND                                0x01
-#define SD_BOTH                                0x02
-
-#ifndef _SYS_TYPES_FD_SET
-/* fd_set may have been defined by the newlib <sys/types.h>, if the
- * internal __USE_W32_SOCKETS feature test has not been enabled.
- */
-#undef fd_set
-typedef
-struct fd_set
-{ u_int        fd_count;
-  SOCKET       fd_array[FD_SETSIZE];
-} fd_set;
-
-#ifndef FD_ISSET
-int FD_ISSET (SOCKET, fd_set *);
-#define FD_ISSET( __fd, __set )  __FD_ISSET ((__fd), (__set))
-
-/* Microsoft provide this library function equivalent of the FD_ISSET
- * macro, and erroneously claim that it is neccessary to implement the
- * macro.  We could just as easily implement it entirely inline...
- */
-int PASCAL __WSAFDIsSet (SOCKET, fd_set *);
-/* ...but, given the availability of the library function, we may just
- * as well use it.
- */
-__CRT_ALIAS int __FD_ISSET( SOCKET __fd, fd_set *__set )
-{ return __WSAFDIsSet (__fd, __set); }
-#endif /* ! defined FD_ISSET */
-
-#ifndef FD_SET
-#if !_WINSOCK_ANOMALOUS_TYPEDEFS
-/* WinSock is intended to mimic the Berkeley Sockets API, for which
- * POSIX.1 provides a reference specification; this states that FD_SET
- * may be implemented as either a macro, or as a function.  The reference
- * <winsock.h> implementation at http://www.sockets.com/winsock.htm#WinsockH
- * includes a typedef for FD_SET, which a) conflicts with the latter POSIX.1
- * provision, and b) creates potential confusion with the former.  Thus, we
- * prefer to conform with POSIX.1 functional semantics, and recommend that
- * users avoid the potentially confusing FD_SET typedefs, so allowing us
- * to provide this function prototype:
- */
-void FD_SET (SOCKET, fd_set *);
-
-#else  /* _WINSOCK_ANOMALOUS_TYPEDEFS */
-/* However, for users who insist on eschewing standard C/C++ syntax, and
- * for whatever reason must use FD_SET as a data type, instead of correctly
- * referring to fd_set, or for pointer references, use PFD_SET or LPFD_SET
- * instead of standard fd_set * references, we make these anomalous types
- * visible, when the _WINSOCK_ANOMALOUS_TYPEDEFS feature test macro is
- * defined with a non-zero value.
- */
-#warning "FD_SET, PFD_SET, and LPFD_SET data types are non-portable."
-#warning "Use portable fd_set, and fd_set * type references instead."
-
-typedef struct fd_set FD_SET, *PFD_SET, *LPFD_SET;
-#endif
-#define FD_SET( __fd, __set )  __FD_SET ((__fd), (__set))
-__CRT_ALIAS void __FD_SET (SOCKET __fd, fd_set *__set)
-{ if( (__set->fd_count < FD_SETSIZE) && ! FD_ISSET (__fd, __set) )
-    __set->fd_array[__set->fd_count++] = __fd;
-}
-#endif /* ! defined FD_SET */
-
-#ifndef FD_CLR
-void FD_CLR (SOCKET, fd_set *);
-#define FD_CLR( __fd, __set )  __FD_CLR ((__fd), (__set))
-__CRT_ALIAS void __FD_CLR (SOCKET __fd, fd_set *__set)
-{ u_int __m, __n; for (__m = __n = 0; __n < __set->fd_count; __n++)
-  { if (__fd != __set->fd_array[__n])
-    { if (__m < __n) __set->fd_array[__m] = __set->fd_array[__n];
-      ++__m;
-    }
-  } __set->fd_count = __m;
-}
-#endif /* ! defined FD_CLR */
-
-#ifndef FD_ZERO
-void FD_ZERO (fd_set *);
-#define FD_ZERO( __set )  __FD_ZERO (__set)
-__CRT_ALIAS void __FD_ZERO (fd_set *__set)
-{ __set->fd_count = 0; }
-#endif /* ! defined FD_ZERO */
-
-#elif ! defined _USE_SYS_TYPES_FD_SET
-/* Definitions from <sys/types.h> probably aren't what the user wants;
- * if they know what they are doing, and they are sure that this really
- * is what they want, then they may enable the _USE_SYS_TYPES_FD_SET
- * feature test macro, to suppress this warning.
- */
-#warning "fd_set and associated macros have been defined in <sys/types.h>"
-#warning "Your <sys/types.h> may cause runtime problems with W32 sockets."
-#endif /* !_SYS_TYPES_FD_SET */
-
-#ifndef __INSIDE_MSYS__
-
-struct hostent
-{ char          *h_name;
-  char         **h_aliases;
-  short          h_addrtype;
-  short          h_length;
-# define         h_addr  h_addr_list[0]
-  char         **h_addr_list;
-};
-
-struct linger
-{ u_short        l_onoff;
-  u_short        l_linger;
-};
-
-#endif /* !__INSIDE_MSYS__ */
-
-#define IOCPARM_MASK                         0x7F
-#define IOC_VOID                       0x20000000
-#define IOC_OUT                        0x40000000
-#define IOC_IN                         0x80000000
-#define IOC_INOUT                  (IOC_IN | IOC_OUT)
-
-#ifndef __INSIDE_MSYS__
-
-#define _IO(x,y)       (IOC_VOID|((x)<<8)|(y))
-#define _IOR(x,y,t)    (IOC_OUT|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y))
-#define _IOW(x,y,t)    (IOC_IN|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y))
-
-#define FIONBIO                _IOW('f', 126, u_long)
-
-#endif /* !__INSIDE_MSYS__ */
-
-#define FIONREAD               _IOR('f', 127, u_long)
-#define FIOASYNC               _IOW('f', 125, u_long)
-#define SIOCSHIWAT             _IOW('s',  0, u_long)
-#define SIOCGHIWAT             _IOR('s',  1, u_long)
-#define SIOCSLOWAT             _IOW('s',  2, u_long)
-#define SIOCGLOWAT             _IOR('s',  3, u_long)
-#define SIOCATMARK             _IOR('s',  7, u_long)
-
-#ifndef __INSIDE_MSYS__
-
-struct netent
-{ char          *n_name;
-  char         **n_aliases;
-  short          n_addrtype;
-  u_long         n_net;
-};
-
-struct servent
-{ char          *s_name;
-  char         **s_aliases;
-  short          s_port;
-  char          *s_proto;
-};
-
-struct protoent
-{ char          *p_name;
-  char         **p_aliases;
-  short          p_proto;
-};
-
-#endif /* !__INSIDE_MSYS__ */
-
-#define IPPROTO_IP                                0
-#define IPPROTO_ICMP                              1
-#define IPPROTO_IGMP                              2
-#define IPPROTO_GGP                               3
-#define IPPROTO_TCP                               6
-#define IPPROTO_PUP                              12
-#define IPPROTO_UDP                              17
-#define IPPROTO_IDP                              22
-#define IPPROTO_ND                               77
-
-#define IPPROTO_RAW                             255
-#define IPPROTO_MAX                             256
-
-/* IPv6 options: these are unsupported, prior to Winsock v2.
- */
-#define IPPROTO_HOPOPTS                           0  /* IPv6 Hop-by-Hop options */
-#define IPPROTO_IPV6                             41  /* IPv6 header */
-#define IPPROTO_ROUTING                          43  /* IPv6 Routing header */
-#define IPPROTO_FRAGMENT                         44  /* IPv6 fragmentation header */
-#define IPPROTO_ESP                              50  /* encapsulating security payload */
-#define IPPROTO_AH                               51  /* authentication header */
-#define IPPROTO_ICMPV6                           58  /* ICMPv6 */
-#define IPPROTO_NONE                             59  /* IPv6 no next header */
-#define IPPROTO_DSTOPTS                          60  /* IPv6 Destination options */
-
-#define IPPORT_ECHO                               7
-#define IPPORT_DISCARD                            9
-#define IPPORT_SYSTAT                            11
-#define IPPORT_DAYTIME                           13
-#define IPPORT_NETSTAT                           15
-#define IPPORT_FTP                               21
-#define IPPORT_TELNET                            23
-#define IPPORT_SMTP                              25
-#define IPPORT_TIMESERVER                        37
-#define IPPORT_NAMESERVER                        42
-#define IPPORT_WHOIS                             43
-#define IPPORT_MTP                               57
-#define IPPORT_TFTP                              69
-#define IPPORT_RJE                               77
-#define IPPORT_FINGER                            79
-#define IPPORT_TTYLINK                           87
-#define IPPORT_SUPDUP                            95
-#define IPPORT_EXECSERVER                       512
-#define IPPORT_LOGINSERVER                      513
-#define IPPORT_CMDSERVER                        514
-#define IPPORT_EFSSERVER                        520
-#define IPPORT_BIFFUDP                          512
-#define IPPORT_WHOSERVER                        513
-#define IPPORT_ROUTESERVER                      520
-#define IPPORT_RESERVED                        1024
-
-#define IMPLINK_IP                              155
-#define IMPLINK_LOWEXPER                        156
-#define IMPLINK_HIGHEXPER                       158
-
-struct in_addr
-#define s_addr                               S_un.S_addr
-#define s_host                               S_un.S_un_b.s_b2
-#define s_net                                S_un.S_un_b.s_b1
-#define s_imp                                S_un.S_un_w.s_w2
-#define s_impno                              S_un.S_un_b.s_b4
-#define s_lh                                 S_un.S_un_b.s_b3
-{ union
-  { struct { u_char s_b1,s_b2,s_b3,s_b4; }     S_un_b;
-    struct { u_short s_w1,s_w2; }              S_un_w;
-    u_long                                     S_addr;
-  }                                          S_un;
-};
-
-#define IN_CLASSA(i)       (((long)(i) & 0x80000000) == 0)
-#define IN_CLASSA_NET                    0xFF000000
-#define IN_CLASSA_NSHIFT                         24
-#define IN_CLASSA_HOST                   0x00FFFFFF
-#define IN_CLASSA_MAX                           128
-#define IN_CLASSB(i)       (((long)(i) & 0xC0000000) == 0x80000000)
-#define IN_CLASSB_NET                    0xFFFF0000
-#define IN_CLASSB_NSHIFT                         16
-#define IN_CLASSB_HOST                   0x0000FFFF
-#define IN_CLASSB_MAX                         65536
-#define IN_CLASSC(i)       (((long)(i) & 0xE0000000) == 0xC0000000)
-#define IN_CLASSC_NET                    0xFFFFFF00
-#define IN_CLASSC_NSHIFT                          8
-#define IN_CLASSC_HOST                         0xFF
-#define INADDR_ANY                       (u_long)(0)
-#define INADDR_LOOPBACK                  0x7F000001
-#define INADDR_BROADCAST        (u_long)(0xFFFFFFFF)
-#define INADDR_NONE                      0xFFFFFFFF
-
-struct sockaddr_in
-{ short                 sin_family;
-  u_short               sin_port;
-  struct in_addr        sin_addr;
-  char                  sin_zero[8];
-};
-
-#define WSADESCRIPTION_LEN                      256
-#define WSASYS_STATUS_LEN                       128
-
-typedef
-struct WSAData
-{ WORD                  wVersion;
-  WORD                  wHighVersion;
-  char                  szDescription[WSADESCRIPTION_LEN+1];
-  char                  szSystemStatus[WSASYS_STATUS_LEN+1];
-  unsigned short        iMaxSockets;
-  unsigned short        iMaxUdpDg;
-  char                 *lpVendorInfo;
-} WSADATA, *LPWSADATA;
-
-#ifndef __INSIDE_MSYS__
-
-#define IP_OPTIONS                                1
-#define SO_DEBUG                                  1
-#define SO_ACCEPTCONN                             2
-#define SO_REUSEADDR                              4
-#define SO_KEEPALIVE                              8
-#define SO_DONTROUTE                             16
-#define SO_BROADCAST                             32
-#define SO_USELOOPBACK                           64
-#define SO_LINGER                               128
-#define SO_OOBINLINE                            256
-
-#define SO_DONTLINGER                   (u_int)(~SO_LINGER)
-#define SO_EXCLUSIVEADDRUSE            ((u_int)(~SO_REUSEADDR))
-
-#define SO_SNDBUF                            0x1001
-#define SO_RCVBUF                            0x1002
-#define SO_SNDLOWAT                          0x1003
-#define SO_RCVLOWAT                          0x1004
-#define SO_SNDTIMEO                          0x1005
-#define SO_RCVTIMEO                          0x1006
-#define SO_ERROR                             0x1007
-#define SO_TYPE                              0x1008
-
-#endif /* !__INSIDE_MSYS__ */
-
-#define INVALID_SOCKET                  (SOCKET)(~0)
-#define SOCKET_ERROR                            (-1)
-#define SOCK_STREAM                               1
-#define SOCK_DGRAM                                2
-#define SOCK_RAW                                  3
-#define SOCK_RDM                                  4
-#define SOCK_SEQPACKET                            5
-#define TCP_NODELAY                          0x0001
-#define AF_UNSPEC                                 0
-#define AF_UNIX                                   1
-#define AF_INET                                   2
-#define AF_IMPLINK                                3
-#define AF_PUP                                    4
-#define AF_CHAOS                                  5
-#define AF_IPX                                    6
-#define AF_NS                                     6
-#define AF_ISO                                    7
-
-#define AF_OSI                               AF_ISO
-
-#define AF_ECMA                                   8
-#define AF_DATAKIT                                9
-#define AF_CCITT                                 10
-#define AF_SNA                                   11
-#define AF_DECnet                                12
-#define AF_DLI                                   13
-#define AF_LAT                                   14
-#define AF_HYLINK                                15
-#define AF_APPLETALK                             16
-#define AF_NETBIOS                               17
-#define AF_VOICEVIEW                             18
-#define AF_FIREFOX                               19
-#define AF_UNKNOWN1                              20
-#define AF_BAN                                   21
-#define AF_ATM                                   22
-#define AF_INET6                                 23
-
-#define AF_CLUSTER                               24
-#define AF_12844                                 25
-#define AF_IRDA                                  26
-#define AF_NETDES                                28
-
-#ifndef __INSIDE_MSYS__
-
-#define AF_MAX                                   29
-
-struct sockaddr
-{ u_short               sa_family;
-  char                  sa_data[14];
-};
-
-/* Portable IPv6/IPv4 version of sockaddr.  Based on RFC 2553.
- * Pad to force 8 byte alignment and maximum size of 128 bytes.
- *
- * Desired design of maximum size and alignment
- */
-#define _SS_MAXSIZE                             128
-#define _SS_ALIGNSIZE                  sizeof(__int64)
-
-/* Definitions used for sockaddr_storage structure padding.
- */
-#define _SS_PAD1SIZE   (_SS_ALIGNSIZE - sizeof(short))
-#define _SS_PAD2SIZE   (_SS_MAXSIZE - (sizeof(short) + _SS_PAD1SIZE + _SS_ALIGNSIZE))
-
-struct sockaddr_storage
-{ short                ss_family;
-  char               __ss_pad1[_SS_PAD1SIZE];  /* pad to 8 */
-  __int64            __ss_align;               /* force alignment */
-  char               __ss_pad2[_SS_PAD2SIZE];  /*  pad to 128 */
-};
-
-#endif /* !__INSIDE_MSYS__ */
-
-struct sockproto
-{ u_short               sp_family;
-  u_short               sp_protocol;
-};
-
-#define PF_UNSPEC                         AF_UNSPEC
-#define PF_UNIX                             AF_UNIX
-#define PF_INET                             AF_INET
-#define PF_IMPLINK                       AF_IMPLINK
-#define PF_PUP                               AF_PUP
-#define PF_CHAOS                           AF_CHAOS
-#define PF_NS                                 AF_NS
-#define PF_IPX                               AF_IPX
-#define PF_ISO                               AF_ISO
-#define PF_OSI                               AF_OSI
-#define PF_ECMA                             AF_ECMA
-#define PF_DATAKIT                       AF_DATAKIT
-#define PF_CCITT                           AF_CCITT
-#define PF_SNA                               AF_SNA
-#define PF_DECnet                         AF_DECnet
-#define PF_DLI                               AF_DLI
-#define PF_LAT                               AF_LAT
-#define PF_HYLINK                         AF_HYLINK
-#define PF_APPLETALK                   AF_APPLETALK
-#define PF_VOICEVIEW                   AF_VOICEVIEW
-#define PF_FIREFOX                       AF_FIREFOX
-#define PF_UNKNOWN1                     AF_UNKNOWN1
-#define PF_BAN                               AF_BAN
-#define PF_ATM                               AF_ATM
-#define PF_INET6                           AF_INET6
-#define PF_MAX                               AF_MAX
-
-#define SOL_SOCKET                           0xFFFF
-
-#ifndef __INSIDE_MSYS__
-
-#define SOMAXCONN                        0x7FFFFFFF /* (5) in WinSock1.1 */
-
-#define MSG_OOB                                   1
-#define MSG_PEEK                                  2
-#define MSG_DONTROUTE                             4
-
-#endif  /* !__INSIDE_MSYS__ */
-
-#define MSG_MAXIOVLEN                            16
-#define MSG_PARTIAL                          0x8000
-#define MAXGETHOSTSTRUCT                       1024
-
-enum
-{ /* Enumerate the flags used to represent the events which may be
-   * detected on any socket, when monitored via an fd_set array.
-   */
-  FD_READ_BIT = 0,
-# define FD_READ                     (1 << FD_READ_BIT)
-
-  FD_WRITE_BIT,
-# define FD_WRITE                    (1 << FD_WRITE_BIT)
-
-  FD_OOB_BIT,
-# define FD_OOB                      (1 << FD_OOB_BIT)
-
-  FD_ACCEPT_BIT,
-# define FD_ACCEPT                   (1 << FD_ACCEPT_BIT)
-
-  FD_CONNECT_BIT,
-# define FD_CONNECT                  (1 << FD_CONNECT_BIT)
-
-  FD_CLOSE_BIT,
-# define FD_CLOSE                    (1 << FD_CLOSE_BIT)
-
-# ifdef _WINSOCK2_H
-/* WinSock v1.1 defines no further events, beyond FD_CLOSE (1 << 5 = 32).
- * The following are specific to WinSock v2; for convenience, they may be
- * enumerated here, but they are exposed only when <winsock.h> is included
- * indirectly, by way of including <winsock2.h>
- */
-  FD_QOS_BIT,
-# define FD_QOS                      (1 << FD_QOS_BIT)
-
-  FD_GROUP_QOS_BIT,
-# define FD_GROUP_QOS                (1 << FD_GROUP_QOS_BIT)
-
-  FD_ROUTING_INTERFACE_CHANGE_BIT,
-# define FD_ROUTING_INTERFACE_CHANGE  (1 << FD_ROUTING_INTERFACE_CHANGE_BIT)
-
-  FD_ADDRESS_LIST_CHANGE_BIT,
-# define FD_ADDRESS_LIST_CHANGE       (1 << FD_ADDRESS_LIST_CHANGE_BIT)
-
-# endif /* _WINSOCK2_H */
-  /* Regardless of WinSock version, FD_MAX_EVENTS represents the first
-   * unused flag bit, whence we may deduce FD_ALL_EVENTS, as a mask for
-   * all supported event flags, specific to the WinSock version in use.
-   */
-  FD_MAX_EVENTS,
-# define FD_ALL_EVENTS                 ((1 << FD_MAX_EVENTS) - 1)
-};
-
-#define WSANO_ADDRESS                  WSANO_DATA
-
-#ifndef __INSIDE_MSYS__
-
-#define h_errno                        WSAGetLastError()
-#define HOST_NOT_FOUND                 WSAHOST_NOT_FOUND
-#define TRY_AGAIN                      WSATRY_AGAIN
-#define NO_RECOVERY                    WSANO_RECOVERY
-#define NO_DATA                        WSANO_DATA
-#define NO_ADDRESS                     WSANO_ADDRESS
-
-#endif /* !__INSIDE_MSYS__ */
-
-WINSOCK_API_LINKAGE SOCKET PASCAL accept (SOCKET, struct sockaddr *, int *);
-
-WINSOCK_API_LINKAGE int PASCAL bind (SOCKET, const struct sockaddr *, int);
-WINSOCK_API_LINKAGE int PASCAL closesocket (SOCKET);
-WINSOCK_API_LINKAGE int PASCAL connect (SOCKET, const struct sockaddr *, int);
-WINSOCK_API_LINKAGE int PASCAL ioctlsocket (SOCKET, long, u_long *);
-WINSOCK_API_LINKAGE int PASCAL getpeername (SOCKET, struct sockaddr *, int *);
-WINSOCK_API_LINKAGE int PASCAL getsockname (SOCKET, struct sockaddr *, int *);
-WINSOCK_API_LINKAGE int PASCAL getsockopt (SOCKET, int, int, char *, int *);
-
-WINSOCK_API_LINKAGE unsigned long PASCAL inet_addr (const char *);
-
-WINSOCK_API_LINKAGE DECLARE_STDCALL_P (char *) inet_ntoa (struct in_addr);
-
-WINSOCK_API_LINKAGE int PASCAL listen (SOCKET, int);
-WINSOCK_API_LINKAGE int PASCAL recv (SOCKET, char *, int, int);
-WINSOCK_API_LINKAGE int PASCAL recvfrom (SOCKET, char *, int, int, struct sockaddr *, int *);
-WINSOCK_API_LINKAGE int PASCAL send (SOCKET, const char *, int, int);
-WINSOCK_API_LINKAGE int PASCAL sendto (SOCKET, const char *, int, int, const struct sockaddr *, int);
-WINSOCK_API_LINKAGE int PASCAL setsockopt (SOCKET, int, int, const char *, int);
-WINSOCK_API_LINKAGE int PASCAL shutdown (SOCKET, int);
-
-WINSOCK_API_LINKAGE SOCKET PASCAL socket (int, int, int);
-
-WINSOCK_API_LINKAGE DECLARE_STDCALL_P (struct hostent *)  gethostbyaddr (const char *, int, int);
-WINSOCK_API_LINKAGE DECLARE_STDCALL_P (struct hostent *)  gethostbyname (const char *);
-WINSOCK_API_LINKAGE DECLARE_STDCALL_P (struct servent *)  getservbyport (int, const char *);
-WINSOCK_API_LINKAGE DECLARE_STDCALL_P (struct servent *)  getservbyname (const char *, const char *);
-WINSOCK_API_LINKAGE DECLARE_STDCALL_P (struct protoent *) getprotobynumber (int);
-WINSOCK_API_LINKAGE DECLARE_STDCALL_P (struct protoent *) getprotobyname (const char *);
-
-typedef SOCKET (PASCAL *LPFN_ACCEPT) (SOCKET, struct sockaddr *, int *);
-
-typedef int (PASCAL *LPFN_BIND) (SOCKET, const struct sockaddr *, int);
-typedef int (PASCAL *LPFN_CLOSESOCKET) (SOCKET);
-typedef int (PASCAL *LPFN_CONNECT) (SOCKET, const struct sockaddr *, int);
-typedef int (PASCAL *LPFN_IOCTLSOCKET) (SOCKET, long, u_long *);
-typedef int (PASCAL *LPFN_GETPEERNAME) (SOCKET, struct sockaddr *, int *);
-typedef int (PASCAL *LPFN_GETSOCKNAME) (SOCKET, struct sockaddr *, int *);
-typedef int (PASCAL *LPFN_GETSOCKOPT) (SOCKET, int, int, char *, int *);
-
-typedef u_long (PASCAL *LPFN_HTONL) (u_long);
-typedef u_short (PASCAL *LPFN_HTONS) (u_short);
-
-typedef unsigned long (PASCAL *LPFN_INET_ADDR) (const char *);
-
-typedef char *(PASCAL *LPFN_INET_NTOA) (struct in_addr);
-
-typedef int (PASCAL *LPFN_LISTEN) (SOCKET, int);
-
-typedef u_long (PASCAL *LPFN_NTOHL) (u_long);
-typedef u_short (PASCAL *LPFN_NTOHS) (u_short);
-
-typedef int (PASCAL *LPFN_RECV) (SOCKET, char *, int, int);
-typedef int (PASCAL *LPFN_RECVFROM) (SOCKET, char *, int, int, struct sockaddr *, int *);
-typedef int (PASCAL *LPFN_SELECT) (int, fd_set *, fd_set *, fd_set *, const struct timeval *);
-typedef int (PASCAL *LPFN_SEND) (SOCKET, const char *, int, int);
-typedef int (PASCAL *LPFN_SENDTO) (SOCKET, const char *, int, int, const struct sockaddr *, int);
-typedef int (PASCAL *LPFN_SETSOCKOPT) (SOCKET, int, int, const char *, int);
-typedef int (PASCAL *LPFN_SHUTDOWN) (SOCKET, int);
-
-typedef SOCKET (PASCAL *LPFN_SOCKET) (int, int, int);
-
-typedef struct hostent *(PASCAL *LPFN_GETHOSTBYADDR) ( const char *, int, int);
-typedef struct hostent *(PASCAL *LPFN_GETHOSTBYNAME) ( const char *);
-
-typedef int (PASCAL *LPFN_GETHOSTNAME) (char *, int);
-
-typedef struct servent *(PASCAL *LPFN_GETSERVBYPORT) (int, const char *);
-typedef struct servent *(PASCAL *LPFN_GETSERVBYNAME) (const char *, const char *);
-typedef struct protoent *(PASCAL *LPFN_GETPROTOBYNUMBER) (int);
-typedef struct protoent *(PASCAL *LPFN_GETPROTOBYNAME) (const char *);
-
-WINSOCK_API_LINKAGE int PASCAL WSAStartup (WORD, LPWSADATA);
-WINSOCK_API_LINKAGE int PASCAL WSACleanup (void);
-WINSOCK_API_LINKAGE void PASCAL WSASetLastError (int);
-WINSOCK_API_LINKAGE int PASCAL WSAGetLastError (void);
-
-typedef int (PASCAL *LPFN_WSASTARTUP) (WORD, LPWSADATA);
-typedef int (PASCAL *LPFN_WSACLEANUP) (void);
-typedef int (PASCAL *LPFN_WSAGETLASTERROR) (void);
-typedef void (PASCAL *LPFN_WSASETLASTERROR) (int);
-
-/* The following four pseudo-blocking functions are provided
- * to support WinSock v1.1, but have been marked as deprecated
- * in WinSock v2; they remain available, but it is recommended
- * that threads should be used instead!
+#error "Including <winsock2.h> after <winsock.h> is unsupported."
+#warning "Falling back to WinSock v1.1 protocol."
+
+#else  /* !_WINSOCK_H included prematurely */
+/* This is correct WinSock v2 protocol usage: <winsock.h> has not been
+ * included previously, so we include it now, to establish definitions
+ * which are common to both WinSock v1 and WinSock v2 protocols.  This
+ * is filtered, on our prior definition of _WINSOCK2_H, to exclude any
+ * obsolete or conflicting definitions from WinSock v1, which are no
+ * longer applicable in WinSock v2, and on __WINSOCK2_DEPRECATED to
+ * identify any which remain available, but have been deprecated.
  */
-WINSOCK_API_LINKAGE BOOL PASCAL WSAIsBlocking (void) __WINSOCK2_DEPRECATED;
-WINSOCK_API_LINKAGE int PASCAL WSAUnhookBlockingHook (void) __WINSOCK2_DEPRECATED;
-WINSOCK_API_LINKAGE FARPROC PASCAL WSASetBlockingHook (FARPROC) __WINSOCK2_DEPRECATED;
-WINSOCK_API_LINKAGE int PASCAL WSACancelBlockingCall (void) __WINSOCK2_DEPRECATED;
-
-typedef BOOL (PASCAL *LPFN_WSAISBLOCKING) (void);
-typedef int (PASCAL *LPFN_WSAUNHOOKBLOCKINGHOOK) (void);
-typedef FARPROC (PASCAL *LPFN_WSASETBLOCKINGHOOK) (FARPROC);
-typedef int (PASCAL *LPFN_WSACANCELBLOCKINGCALL) (void);
-
-WINSOCK_API_LINKAGE HANDLE PASCAL WSAAsyncGetServByName (HWND, u_int, const char *, const char *, char *, int);
-WINSOCK_API_LINKAGE HANDLE PASCAL WSAAsyncGetServByPort (HWND, u_int, int, const char *, char *, int);
-WINSOCK_API_LINKAGE HANDLE PASCAL WSAAsyncGetProtoByName (HWND, u_int, const char *, char *, int);
-WINSOCK_API_LINKAGE HANDLE PASCAL WSAAsyncGetProtoByNumber (HWND, u_int, int, char *, int);
-WINSOCK_API_LINKAGE HANDLE PASCAL WSAAsyncGetHostByName (HWND, u_int, const char *, char *, int);
-WINSOCK_API_LINKAGE HANDLE PASCAL WSAAsyncGetHostByAddr (HWND, u_int, const char *, int, int, char *, int);
-
-WINSOCK_API_LINKAGE int PASCAL WSACancelAsyncRequest (HANDLE);
-WINSOCK_API_LINKAGE int PASCAL WSAAsyncSelect (SOCKET, HWND, u_int, long);
-
-typedef HANDLE (PASCAL *LPFN_WSAASYNCGETSERVBYNAME) (HWND, u_int, const char *, const char *, char *, int);
-typedef HANDLE (PASCAL *LPFN_WSAASYNCGETSERVBYPORT) (HWND, u_int, int, const char *, char *, int);
-typedef HANDLE (PASCAL *LPFN_WSAASYNCGETPROTOBYNAME) (HWND, u_int, const char*, char*, int);
-typedef HANDLE (PASCAL *LPFN_WSAASYNCGETPROTOBYNUMBER) (HWND, u_int, int, char*, int);
-typedef HANDLE (PASCAL *LPFN_WSAASYNCGETHOSTBYADDR) (HWND, u_int, const char*, int, int, char*, int);
-
-typedef int (PASCAL *LPFN_WSACANCELASYNCREQUEST) (HANDLE);
-typedef int (PASCAL *LPFN_WSAASYNCSELECT) (SOCKET, HWND, u_int, long);
-
-#ifndef __INSIDE_MSYS__
-
-WINSOCK_API_LINKAGE u_long PASCAL htonl (u_long);
-WINSOCK_API_LINKAGE u_long PASCAL ntohl (u_long);
-WINSOCK_API_LINKAGE u_short PASCAL htons (u_short);
-WINSOCK_API_LINKAGE u_short PASCAL ntohs (u_short);
-WINSOCK_API_LINKAGE int PASCAL select (int nfds, fd_set *, fd_set *, fd_set *, const struct timeval *);
-
-#endif /* !__INSIDE_MSYS__ */
-
-WINSOCK_API_LINKAGE int PASCAL gethostname (char *, int);
-
-#define WSAMAKEASYNCREPLY(b,e)                 MAKELONG(b,e)
-#define WSAMAKESELECTREPLY(e,error)            MAKELONG(e,error)
-#define WSAGETASYNCBUFLEN(l)                   LOWORD(l)
-#define WSAGETASYNCERROR(l)                    HIWORD(l)
-#define WSAGETSELECTEVENT(l)                   LOWORD(l)
-#define WSAGETSELECTERROR(l)                   HIWORD(l)
-
-typedef struct sockaddr SOCKADDR, *PSOCKADDR, *LPSOCKADDR;
-typedef struct sockaddr_storage SOCKADDR_STORAGE, *PSOCKADDR_STORAGE;
-typedef struct sockaddr_in SOCKADDR_IN, *PSOCKADDR_IN, *LPSOCKADDR_IN;
-typedef struct linger LINGER, *PLINGER, *LPLINGER;
-typedef struct in_addr IN_ADDR, *PIN_ADDR, *LPIN_ADDR;
-typedef struct hostent HOSTENT, *PHOSTENT, *LPHOSTENT;
-typedef struct servent SERVENT, *PSERVENT, *LPSERVENT;
-typedef struct protoent PROTOENT, *PPROTOENT, *LPPROTOENT;
-typedef struct timeval TIMEVAL, *PTIMEVAL, *LPTIMEVAL;
-
-_END_C_DECLS
-
-
-#undef __WINSOCK_H_SOURCED__
+#define __WINSOCK2_DEPRECATED  __MINGW_ATTRIB_DEPRECATED
+#include "winsock.h"
 
-/* winsock2 additions */
 #define __WINSOCK2_H_SOURCED__
 
 /* We need a definition for the BLOB data type; although an incomplete
@@ -791,6 +131,70 @@ typedef enum
   GuaranteedService
 } GUARANTEE;
 
+/* IPv6 protocol options: these are additional to protocol option constants
+ * already defined in <winsock.h>; they are unsupported prior to WinSock v2.
+ */
+#define IPPROTO_HOPOPTS                           0  /* IPv6 Hop-by-Hop options */
+#define IPPROTO_IPV6                             41  /* IPv6 header */
+#define IPPROTO_ROUTING                          43  /* IPv6 Routing header */
+#define IPPROTO_FRAGMENT                         44  /* IPv6 fragmentation header */
+#define IPPROTO_ESP                              50  /* encapsulating security payload */
+#define IPPROTO_AH                               51  /* authentication header */
+#define IPPROTO_ICMPV6                           58  /* ICMPv6 */
+#define IPPROTO_NONE                             59  /* IPv6 no next header */
+#define IPPROTO_DSTOPTS                          60  /* IPv6 Destination options */
+
+/* Address family definitions: these extend the set which has been defined
+ * already, in <winsock.h>; they are applicable only for WinSock v2.
+ */
+#define AF_CLUSTER                               24
+#define AF_12844                                 25
+#define AF_IRDA                                  26
+#define AF_NETDES                                28
+
+#ifndef __INSIDE_MSYS__
+/* MSYS provides its own definition for AF_MAX; otherwise, <winsock.h> has
+ * already defined it as 24, but we need to override that to accommodate the
+ * additional constants, defined above.
+ */
+#undef  AF_MAX
+#define AF_MAX                                   29
+
+/* Portable IPv6/IPv4 version of sockaddr, based on RFC 2553.
+ * The sockaddr_storage structure is padded to force 8 byte alignment of
+ * its member fields, and its size is fixed at 128 bytes.
+ *
+ * Desired design maximum size and alignment.
+ */
+#define _SS_MAXSIZE                             128
+#define _SS_ALIGNSIZE                  sizeof(__int64)
+
+/* Definitions used for sockaddr_storage structure padding.
+ */
+#define _SS_PAD1SIZE   (_SS_ALIGNSIZE - sizeof(short))
+#define _SS_PAD2SIZE   (_SS_MAXSIZE - (sizeof(short) + _SS_PAD1SIZE + _SS_ALIGNSIZE))
+
+struct sockaddr_storage
+{ short                ss_family;
+  char               __ss_pad1[_SS_PAD1SIZE];  /* pad to 8 */
+  __int64            __ss_align;               /* force alignment */
+  char               __ss_pad2[_SS_PAD2SIZE];  /* pad to 128 */
+};
+
+/* As in the case of AF_MAX, MSYS provides its own value for SOMAXCONN;
+ * otherwise, <winsock.h> has already defined it, with a value of 5; this
+ * was correct for WinSock v1.1, but we must now override it with this
+ * alternative definition, to make it correct for WinSock v2.
+ */
+#undef  SOMAXCONN
+#define SOMAXCONN                        0x7FFFFFFF
+
+/* SO_EXCLUSIVEADDRUSE is not applicable, prior to WinSock v2; it is
+ * derived from SO_REUSEADDR, which has been defined in <winsock.h>
+ */
+#define SO_EXCLUSIVEADDRUSE            ((u_int)(~SO_REUSEADDR))
+#endif  /* !__INSIDE_MSYS__ */
+
 /* FIXME: FLOWSPEC and related definitions belong in qos.h */
 
 /* Windows Sockets 2 Application Programming Interface,
@@ -1091,46 +495,46 @@ struct _WSACOMPLETION
   }                                             Parameters;
 } WSACOMPLETION, *PWSACOMPLETION, *LPWSACOMPLETION;
 
-#define PFL_MULTIPLE_PROTO_ENTRIES       0x00000001
-#define PFL_RECOMMENDED_PROTO_ENTRY      0x00000002
-#define PFL_HIDDEN                       0x00000004
-#define PFL_MATCHES_PROTOCOL_ZERO        0x00000008
-#define XP1_CONNECTIONLESS               0x00000001
-#define XP1_GUARANTEED_DELIVERY          0x00000002
-#define XP1_GUARANTEED_ORDER             0x00000004
-#define XP1_MESSAGE_ORIENTED             0x00000008
-#define XP1_PSEUDO_STREAM                0x00000010
-#define XP1_GRACEFUL_CLOSE               0x00000020
-#define XP1_EXPEDITED_DATA               0x00000040
-#define XP1_CONNECT_DATA                 0x00000080
-#define XP1_DISCONNECT_DATA              0x00000100
-#define XP1_SUPPORT_BROADCAST            0x00000200
-#define XP1_SUPPORT_MULTIPOINT           0x00000400
-#define XP1_MULTIPOINT_CONTROL_PLANE     0x00000800
-#define XP1_MULTIPOINT_DATA_PLANE        0x00001000
-#define XP1_QOS_SUPPORTED                0x00002000
-#define XP1_INTERRUPT                    0x00004000
-#define XP1_UNI_SEND                     0x00008000
-#define XP1_UNI_RECV                     0x00010000
-#define XP1_IFS_HANDLES                  0x00020000
-#define XP1_PARTIAL_MESSAGE              0x00040000
-
-#define BIGENDIAN                            0x0000
-#define LITTLEENDIAN                         0x0001
-
-#define SECURITY_PROTOCOL_NONE               0x0000
-#define JL_SENDER_ONLY                         0x01
-#define JL_RECEIVER_ONLY                       0x02
-#define JL_BOTH                                0x04
-#define WSA_FLAG_OVERLAPPED                    0x01
-#define WSA_FLAG_MULTIPOINT_C_ROOT             0x02
-#define WSA_FLAG_MULTIPOINT_C_LEAF             0x04
-#define WSA_FLAG_MULTIPOINT_D_ROOT             0x08
-#define WSA_FLAG_MULTIPOINT_D_LEAF             0x10
-#define IOC_UNIX                         0x00000000
-#define IOC_WS2                          0x08000000
-#define IOC_PROTOCOL                     0x10000000
-#define IOC_VENDOR                       0x18000000
+#define PFL_MULTIPLE_PROTO_ENTRIES               0x00000001
+#define PFL_RECOMMENDED_PROTO_ENTRY              0x00000002
+#define PFL_HIDDEN                               0x00000004
+#define PFL_MATCHES_PROTOCOL_ZERO                0x00000008
+#define XP1_CONNECTIONLESS                       0x00000001
+#define XP1_GUARANTEED_DELIVERY                  0x00000002
+#define XP1_GUARANTEED_ORDER                     0x00000004
+#define XP1_MESSAGE_ORIENTED                     0x00000008
+#define XP1_PSEUDO_STREAM                        0x00000010
+#define XP1_GRACEFUL_CLOSE                       0x00000020
+#define XP1_EXPEDITED_DATA                       0x00000040
+#define XP1_CONNECT_DATA                         0x00000080
+#define XP1_DISCONNECT_DATA                      0x00000100
+#define XP1_SUPPORT_BROADCAST                    0x00000200
+#define XP1_SUPPORT_MULTIPOINT                   0x00000400
+#define XP1_MULTIPOINT_CONTROL_PLANE             0x00000800
+#define XP1_MULTIPOINT_DATA_PLANE                0x00001000
+#define XP1_QOS_SUPPORTED                        0x00002000
+#define XP1_INTERRUPT                            0x00004000
+#define XP1_UNI_SEND                             0x00008000
+#define XP1_UNI_RECV                             0x00010000
+#define XP1_IFS_HANDLES                          0x00020000
+#define XP1_PARTIAL_MESSAGE                      0x00040000
+
+#define BIGENDIAN                                    0x0000
+#define LITTLEENDIAN                                 0x0001
+
+#define SECURITY_PROTOCOL_NONE                       0x0000
+#define JL_SENDER_ONLY                                 0x01
+#define JL_RECEIVER_ONLY                               0x02
+#define JL_BOTH                                        0x04
+#define WSA_FLAG_OVERLAPPED                            0x01
+#define WSA_FLAG_MULTIPOINT_C_ROOT                     0x02
+#define WSA_FLAG_MULTIPOINT_C_LEAF                     0x04
+#define WSA_FLAG_MULTIPOINT_D_ROOT                     0x08
+#define WSA_FLAG_MULTIPOINT_D_LEAF                     0x10
+#define IOC_UNIX                                 0x00000000
+#define IOC_WS2                                  0x08000000
+#define IOC_PROTOCOL                             0x10000000
+#define IOC_VENDOR                               0x18000000
 
 #define _WSAIO(x,y)                            (IOC_VOID|(x)|(y))
 #define _WSAIOR(x,y)                           (IOC_OUT|(x)|(y))
@@ -1158,8 +562,71 @@ struct _WSACOMPLETION
 #define SIO_NSP_NOTIFY_CHANGE                  _WSAIOW(IOC_WS2,25)
 #define SIO_UDP_CONNRESET                      _WSAIOW(IOC_VENDOR,12)
 
-#define TH_NETDEV                        0x00000001
-#define TH_TAPI                          0x00000002
+#define TH_NETDEV                                0x00000001
+#define TH_TAPI                                  0x00000002
+
+typedef SOCKET (PASCAL *LPFN_ACCEPT) (SOCKET, struct sockaddr *, int *);
+
+typedef int (PASCAL *LPFN_BIND) (SOCKET, const struct sockaddr *, int);
+typedef int (PASCAL *LPFN_CLOSESOCKET) (SOCKET);
+typedef int (PASCAL *LPFN_CONNECT) (SOCKET, const struct sockaddr *, int);
+typedef int (PASCAL *LPFN_IOCTLSOCKET) (SOCKET, long, u_long *);
+typedef int (PASCAL *LPFN_GETPEERNAME) (SOCKET, struct sockaddr *, int *);
+typedef int (PASCAL *LPFN_GETSOCKNAME) (SOCKET, struct sockaddr *, int *);
+typedef int (PASCAL *LPFN_GETSOCKOPT) (SOCKET, int, int, char *, int *);
+
+typedef u_long (PASCAL *LPFN_HTONL) (u_long);
+typedef u_short (PASCAL *LPFN_HTONS) (u_short);
+
+typedef unsigned long (PASCAL *LPFN_INET_ADDR) (const char *);
+
+typedef char *(PASCAL *LPFN_INET_NTOA) (struct in_addr);
+
+typedef int (PASCAL *LPFN_LISTEN) (SOCKET, int);
+
+typedef u_long (PASCAL *LPFN_NTOHL) (u_long);
+typedef u_short (PASCAL *LPFN_NTOHS) (u_short);
+
+typedef int (PASCAL *LPFN_RECV) (SOCKET, char *, int, int);
+typedef int (PASCAL *LPFN_RECVFROM) (SOCKET, char *, int, int, struct sockaddr *, int *);
+typedef int (PASCAL *LPFN_SELECT) (int, fd_set *, fd_set *, fd_set *, const struct timeval *);
+typedef int (PASCAL *LPFN_SEND) (SOCKET, const char *, int, int);
+typedef int (PASCAL *LPFN_SENDTO) (SOCKET, const char *, int, int, const struct sockaddr *, int);
+typedef int (PASCAL *LPFN_SETSOCKOPT) (SOCKET, int, int, const char *, int);
+typedef int (PASCAL *LPFN_SHUTDOWN) (SOCKET, int);
+
+typedef SOCKET (PASCAL *LPFN_SOCKET) (int, int, int);
+
+typedef struct hostent *(PASCAL *LPFN_GETHOSTBYADDR) ( const char *, int, int);
+typedef struct hostent *(PASCAL *LPFN_GETHOSTBYNAME) ( const char *);
+
+typedef int (PASCAL *LPFN_GETHOSTNAME) (char *, int);
+
+typedef struct servent *(PASCAL *LPFN_GETSERVBYPORT) (int, const char *);
+typedef struct servent *(PASCAL *LPFN_GETSERVBYNAME) (const char *, const char *);
+typedef struct protoent *(PASCAL *LPFN_GETPROTOBYNUMBER) (int);
+typedef struct protoent *(PASCAL *LPFN_GETPROTOBYNAME) (const char *);
+
+typedef int (PASCAL *LPFN_WSASTARTUP) (WORD, LPWSADATA);
+typedef int (PASCAL *LPFN_WSACLEANUP) (void);
+typedef int (PASCAL *LPFN_WSAGETLASTERROR) (void);
+typedef void (PASCAL *LPFN_WSASETLASTERROR) (int);
+
+typedef BOOL (PASCAL *LPFN_WSAISBLOCKING) (void);
+typedef int (PASCAL *LPFN_WSAUNHOOKBLOCKINGHOOK) (void);
+typedef FARPROC (PASCAL *LPFN_WSASETBLOCKINGHOOK) (FARPROC);
+typedef int (PASCAL *LPFN_WSACANCELBLOCKINGCALL) (void);
+
+typedef HANDLE (PASCAL *LPFN_WSAASYNCGETSERVBYNAME) (HWND, u_int, const char *, const char *, char *, int);
+typedef HANDLE (PASCAL *LPFN_WSAASYNCGETSERVBYPORT) (HWND, u_int, int, const char *, char *, int);
+typedef HANDLE (PASCAL *LPFN_WSAASYNCGETPROTOBYNAME) (HWND, u_int, const char*, char*, int);
+typedef HANDLE (PASCAL *LPFN_WSAASYNCGETPROTOBYNUMBER) (HWND, u_int, int, char*, int);
+typedef HANDLE (PASCAL *LPFN_WSAASYNCGETHOSTBYADDR) (HWND, u_int, const char*, int, int, char*, int);
+
+typedef int (PASCAL *LPFN_WSACANCELASYNCREQUEST) (HANDLE);
+typedef int (PASCAL *LPFN_WSAASYNCSELECT) (SOCKET, HWND, u_int, long);
+
+typedef struct sockaddr_storage SOCKADDR_STORAGE, *PSOCKADDR_STORAGE;
 
 WINSOCK_API_LINKAGE SOCKET WINAPI WSAAccept (SOCKET, struct sockaddr *, LPINT, LPCONDITIONPROC, DWORD);
 
@@ -1328,4 +795,5 @@ typedef DWORD (WINAPI *LPFN_WSAWAITFORMULTIPLEEVENTS) (DWORD, const WSAEVENT *,
 _END_C_DECLS
 
 #undef __WINSOCK2_H_SOURCED__
+#endif /* !_WINSOCK_H included prematurely */
 #endif /* _WINSOCK2_H: $RCSfile$: end of file */