* 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
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,
} 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))
#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);
_END_C_DECLS
#undef __WINSOCK2_H_SOURCED__
+#endif /* !_WINSOCK_H included prematurely */
#endif /* _WINSOCK2_H: $RCSfile$: end of file */