From 4aa4a7a511f0fb7bf267088539aed97af93e4b71 Mon Sep 17 00:00:00 2001 From: Keith Marshall Date: Tue, 28 Nov 2017 13:28:34 +0000 Subject: [PATCH] Factor duplicate content out of --- w32api/ChangeLog | 15 + w32api/include/winsock.h | 5 + w32api/include/winsock2.h | 906 ++++++++++------------------------------------ 3 files changed, 207 insertions(+), 719 deletions(-) diff --git a/w32api/ChangeLog b/w32api/ChangeLog index 5e95b34..e1919ca 100644 --- a/w32api/ChangeLog +++ b/w32api/ChangeLog @@ -1,3 +1,18 @@ +2017-11-28 Keith Marshall + + Factor duplicate content out of + + * include/winsock2.h: Remove all declarations and definitions which + are identically specified in , but keep them in scope by... + [! defined _WINSOCK_H]: ...including 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 + 2017-11-24 Keith Marshall Make and duplicate code congruent. diff --git a/w32api/include/winsock.h b/w32api/include/winsock.h index 8b83d0c..08967b3 100644 --- a/w32api/include/winsock.h +++ b/w32api/include/winsock.h @@ -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 , it will subsequently be overridden by the correct + * WinSock v2 definition. + */ #define SOMAXCONN 5 #define MSG_OOB 1 diff --git a/w32api/include/winsock2.h b/w32api/include/winsock2.h index 328e00e..cdd1843 100644 --- a/w32api/include/winsock2.h +++ b/w32api/include/winsock2.h @@ -38,689 +38,29 @@ * 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! 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 -#include -#include -#include - -#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 ; - * 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 , 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 - * 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 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 " -#warning "Your 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 is included - * indirectly, by way of including - */ - 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 after is unsupported." +#warning "Falling back to WinSock v1.1 protocol." + +#else /* !_WINSOCK_H included prematurely */ +/* This is correct WinSock v2 protocol usage: 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 ; 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 ; 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, 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, 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 + */ +#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 */ -- 2.11.0