root/trunk/win32/winsock2.d

Revision 352, 44.5 kB (checked in by Yu Hozuki, 2 years ago)

Many argument types and return types were improved to const using CPtr template.
They follow the original headers.

Line 
1 /***********************************************************************\
2 *                              winsock2.d                               *
3 *                                                                       *
4 *                       Windows API header module                       *
5 *                                                                       *
6 *                 Translated from MinGW Windows headers                 *
7 *                             by Daniel Keep                            *
8 \***********************************************************************/
9 module win32.winsock2;
10 pragma(lib, "Ws2_32.lib");
11
12 /*
13   Definitions for winsock 2
14
15   Contributed by the WINE project.
16
17   Portions Copyright (c) 1980, 1983, 1988, 1993
18   The Regents of the University of California.  All rights reserved.
19
20   Portions Copyright (c) 1993 by Digital Equipment Corporation.
21  */
22
23 /*  DRK: This module should not be included if -version=Win32_Winsock2 has
24  *  not been set.  If it has, assert.  I think it's better this way than
25  *  letting the user believe that it's worked.
26  *
27  *  SG: It has now been changed so that winsock2 is the default, and
28  *  -version=Win32_Winsock1 must be set to use winsock.
29  */
30 version(Win32_Winsock1) {
31     pragma(msg, "Cannot use win32.winsock2 with Win32_Winsock1 defined.");
32     static assert(false);
33 }
34
35 import win32.winbase;
36 import win32.windef;
37 import win32.basetyps;
38
39 alias char u_char;
40 alias ushort u_short;
41 alias uint u_int, u_long, SOCKET;
42
43 const size_t FD_SETSIZE = 64;
44
45 /* shutdown() how types */
46 enum : int {
47     SD_RECEIVE,
48     SD_SEND,
49     SD_BOTH
50 }
51
52 /* Good grief this is stupid... is it a struct?  A preprocessor macro?  A
53    struct tag?  Who the hell knows!? */
54 struct FD_SET {
55     u_int               fd_count;
56     SOCKET[FD_SETSIZE]  fd_array;
57
58     /* this differs from the define in winsock.h and in cygwin sys/types.h */
59     static void opCall(SOCKET fd, FD_SET set) {
60         u_int i;
61         for (i = 0; i < set.fd_count; i++)
62             if (set.fd_array[i] == fd)
63                 break;
64         if (i == set.fd_count)
65             if (set.fd_count < FD_SETSIZE) {
66                 set.fd_array[i] = fd;
67                 set.fd_count++;
68             }
69     }
70 }
71 alias FD_SET* PFD_SET, LPFD_SET;
72
73 // Keep this alias, since fd_set isn't a tag name in the original header.
74 alias FD_SET fd_set;
75
76 extern(Windows) int __WSAFDIsSet(SOCKET, FD_SET*);
77 alias __WSAFDIsSet FD_ISSET;
78
79 void FD_CLR(SOCKET fd, FD_SET* set) {
80     for (u_int i = 0; i < set.fd_count; i++) {
81         if (set.fd_array[i] == fd) {
82             while (i < set.fd_count - 1) {
83                 set.fd_array[i] = set.fd_array[i+1];
84                 i++;
85             }
86             set.fd_count--;
87             break;
88         }
89     }
90 }
91
92 void FD_ZERO(FD_SET* set) {
93     set.fd_count = 0;
94 }
95
96
97 struct TIMEVAL {
98     int tv_sec;
99     int tv_usec;
100
101     int opCmp(TIMEVAL tv) {
102         if (tv_sec < tv.tv_sec)   return -1;
103         if (tv_sec > tv.tv_sec)   return  1;
104         if (tv_usec < tv.tv_usec) return -1;
105         if (tv_usec > tv.tv_usec) return  1;
106         return 0;
107     }
108 }
109 alias TIMEVAL* PTIMEVAL, LPTIMEVAL;
110
111 bool timerisset(TIMEVAL* tvp) {
112     return tvp.tv_sec || tvp.tv_usec;
113 }
114
115 /+
116 /* DRK: These have been commented out because it was felt that using
117  * omCmp on the TIMEVAL struct was cleaner.  Still, perhaps these should
118  * be enabled under a version tag for compatibility's sake?
119  * If it is decided that it's just ugly and unwanted, then feel free to
120  * delete this section :)
121  */
122 int timercmp(TIMEVAL* tvp, TIMEVAL* uvp) {
123     return tvp.tv_sec != uvp.tv_sec ?
124         (tvp.tv_sec < uvp.tv_sec ? -1 :
125             (tvp.tv_sec > uvp.tv_sec ? 1 : 0)) :
126         (tvp.tv_usec < uvp.tv_usec ? -1 :
127             (tvp.tv_usec > uvp.tv_usec ? 1 : 0));
128 }
129
130 int timercmp(TIMEVAL* tvp, TIMEVAL* uvp, int function(long,long) cmp) {
131     return tvp.tv_sec != uvp.tv_sec ?
132         cmp(tvp.tv_sec, uvp.tv_sec) :
133         cmp(tvp.tv_usec, uvp.tv_usec);
134 }+/
135
136 void timerclear(ref TIMEVAL tvp) {
137     tvp.tv_sec = tvp.tv_usec = 0;
138 }
139
140 struct HOSTENT {
141     char*  h_name;
142     char** h_aliases;
143     short  h_addrtype;
144     short  h_length;
145     char** h_addr_list;
146
147     char* h_addr() { return h_addr_list[0]; }
148     char* h_addr(char* h) { return h_addr_list[0] = h; }
149 }
150 alias HOSTENT* PHOSTENT, LPHOSTENT;
151
152 struct LINGER {
153     u_short l_onoff;
154     u_short l_linger;
155 }
156 alias LINGER* PLINGER, LPLINGER;
157
158 enum : DWORD {
159     IOCPARAM_MASK = 0x7f,
160     IOC_VOID      = 0x20000000,
161     IOC_OUT       = 0x40000000,
162     IOC_IN        = 0x80000000,
163     IOC_INOUT     = IOC_IN|IOC_OUT
164 }
165
166 // NOTE: This isn't even used anywhere...
167 private template _IO(char x, ubyte y) {
168     const DWORD _IO = IOC_VOID | (cast(ubyte)x<<8) | y;
169 }
170
171 private template _IOR(char x, ubyte y, t) {
172     const DWORD _IOR = IOC_OUT | ((t.sizeof & IOCPARAM_MASK)<<16)
173         | (cast(ubyte)x<<8) | y;
174 }
175
176 private template _IOW(char x, ubyte y, t) {
177     const DWORD _IOW = IOC_IN | ((t.sizeof & IOCPARAM_MASK)<<16)
178         | (cast(ubyte)x<<8) | y;
179 }
180
181 enum : DWORD {
182     FIONBIO    = _IOW!('f', 126, u_long),
183     FIONREAD   = _IOR!('f', 127, u_long),
184     FIOASYNC   = _IOW!('f', 125, u_long),
185     SIOCSHIWAT = _IOW!('s',   0, u_long),
186     SIOCGHIWAT = _IOR!('s',   1, u_long),
187     SIOCSLOWAT = _IOW!('s',   2, u_long),
188     SIOCGLOWAT = _IOR!('s',   3, u_long),
189     SIOCATMARK = _IOR!('s',   7, u_long)
190 }
191
192 struct netent {
193     char*  n_name;
194     char** n_aliases;
195     short  n_addrtype;
196     u_long n_net;
197 }
198
199 struct SERVENT {
200     char*  s_name;
201     char** s_aliases;
202     short  s_port;
203     char*  s_proto;
204 }
205 alias SERVENT* PSERVENT, LPSERVENT;
206
207 struct PROTOENT {
208     char*  p_name;
209     char** p_aliases;
210     short  p_proto;
211 }
212 alias PROTOENT* PPROTOENT, LPPROTOENT;
213
214 enum : int {
215     IPPROTO_IP   =   0,
216     IPPROTO_ICMP =   1,
217     IPPROTO_IGMP =   2,
218     IPPROTO_GGP  =   3,
219     IPPROTO_TCP  =   6,
220     IPPROTO_PUP  =  12,
221     IPPROTO_UDP  =  17,
222     IPPROTO_IDP  =  22,
223     IPPROTO_ND   =  77,
224     IPPROTO_RAW  = 255,
225     IPPROTO_MAX  = 256,
226
227     // IPv6 options
228     IPPROTO_HOPOPTS  =  0, // IPv6 Hop-by-Hop options
229     IPPROTO_IPV6     = 41, // IPv6 header
230     IPPROTO_ROUTING  = 43, // IPv6 Routing header
231     IPPROTO_FRAGMENT = 44, // IPv6 fragmentation header
232     IPPROTO_ESP      = 50, // encapsulating security payload
233     IPPROTO_AH       = 51, // authentication header
234     IPPROTO_ICMPV6   = 58, // ICMPv6
235     IPPROTO_NONE     = 59, // IPv6 no next header
236     IPPROTO_DSTOPTS  = 60  // IPv6 Destination options
237 }
238
239 enum {
240     IPPORT_ECHO        =    7,
241     IPPORT_DISCARD     =    9,
242     IPPORT_SYSTAT      =   11,
243     IPPORT_DAYTIME     =   13,
244     IPPORT_NETSTAT     =   15,
245     IPPORT_FTP         =   21,
246     IPPORT_TELNET      =   23,
247     IPPORT_SMTP        =   25,
248     IPPORT_TIMESERVER  =   37,
249     IPPORT_NAMESERVER  =   42,
250     IPPORT_WHOIS       =   43,
251     IPPORT_MTP         =   57,
252     IPPORT_TFTP        =   69,
253     IPPORT_RJE         =   77,
254     IPPORT_FINGER      =   79,
255     IPPORT_TTYLINK     =   87,
256     IPPORT_SUPDUP      =   95,
257     IPPORT_EXECSERVER  =  512,
258     IPPORT_LOGINSERVER =  513,
259     IPPORT_CMDSERVER   =  514,
260     IPPORT_EFSSERVER   =  520,
261     IPPORT_BIFFUDP     =  512,
262     IPPORT_WHOSERVER   =  513,
263     IPPORT_ROUTESERVER =  520,
264     IPPORT_RESERVED    = 1024
265 }
266
267 enum {
268     IMPLINK_IP         =  155,
269     IMPLINK_LOWEXPER   =  156,
270     IMPLINK_HIGHEXPER  =  158
271 }
272
273 struct IN_ADDR {
274     union {
275         struct { u_char  s_b1, s_b2, s_b3, s_b4; }
276         struct { u_char  s_net, s_host, s_lh, s_impno; }
277         struct { u_short s_w1, s_w2; }
278         struct { u_short s_w_, s_imp; } // Can I get rid of s_w_ using alignment tricks?
279         u_long S_addr;
280         u_long s_addr;
281     }
282 }
283 alias IN_ADDR* PIN_ADDR, LPIN_ADDR;
284
285 // IN_CLASSx are not used anywhere or documented on MSDN.
286 bool IN_CLASSA(int i) { return (i & 0x80000000) == 0; }
287
288 const IN_CLASSA_NET    = 0xff000000;
289 const IN_CLASSA_NSHIFT =         24;
290 const IN_CLASSA_HOST   = 0x00ffffff;
291 const IN_CLASSA_MAX    =        128;
292
293 bool IN_CLASSB(int i) { return (i & 0xc0000000) == 0x80000000; }
294
295 const IN_CLASSB_NET    = 0xffff0000;
296 const IN_CLASSB_NSHIFT =         16;
297 const IN_CLASSB_HOST   = 0x0000ffff;
298 const IN_CLASSB_MAX    =      65536;
299
300 bool IN_CLASSC(int i) { return (i & 0xe0000000) == 0xc0000000; }
301
302 const IN_CLASSC_NET    = 0xffffff00;
303 const IN_CLASSC_NSHIFT =          8;
304 const IN_CLASSC_HOST   = 0x000000ff;
305
306 const u_long
307     INADDR_ANY       = 0,
308     INADDR_LOOPBACK  = 0x7F000001,
309     INADDR_BROADCAST = 0xFFFFFFFF,
310     INADDR_NONE      = 0xFFFFFFFF;
311
312 struct SOCKADDR_IN {
313     short   sin_family;
314     u_short sin_port;
315     IN_ADDR sin_addr;
316     char[8] sin_zero;
317 }
318 alias SOCKADDR_IN* PSOCKADDR_IN, LPSOCKADDR_IN;
319
320 const size_t
321     WSADESCRIPTION_LEN = 256,
322     WSASYS_STATUS_LEN  = 128;
323
324 struct WSADATA {
325     WORD   wVersion;
326     WORD   wHighVersion;
327     char[WSADESCRIPTION_LEN+1] szDescription;
328     char[WSASYS_STATUS_LEN+1]  szSystemStatus;
329     ushort iMaxSockets;
330     ushort iMaxUdpDg;
331     char*  lpVendorInfo;
332 }
333 alias WSADATA* LPWSADATA;
334
335 // This is not documented on the MSDN site
336 const IP_OPTIONS = 1;
337
338 const int
339     SO_OPTIONS     =   1,
340     SO_DEBUG       =   1,
341     SO_ACCEPTCONN  =   2,
342     SO_REUSEADDR   =   4,
343     SO_KEEPALIVE   =   8,
344     SO_DONTROUTE   =  16,
345     SO_BROADCAST   =  32,
346     SO_USELOOPBACK =  64,
347     SO_LINGER      = 128,
348     SO_OOBINLINE   = 256,
349     SO_DONTLINGER  = ~SO_LINGER,
350     SO_EXCLUSIVEADDRUSE= ~SO_REUSEADDR;
351
352 enum : int {
353     SO_SNDBUF = 0x1001,
354     SO_RCVBUF,
355     SO_SNDLOWAT,
356     SO_RCVLOWAT,
357     SO_SNDTIMEO,
358     SO_RCVTIMEO,
359     SO_ERROR,
360     SO_TYPE // = 0x1008
361 }
362
363 const SOCKET INVALID_SOCKET = cast(SOCKET)(~0);
364 const int SOCKET_ERROR = -1;
365
366 enum : int {
367     SOCK_STREAM = 1,
368     SOCK_DGRAM,
369     SOCK_RAW,
370     SOCK_RDM,
371     SOCK_SEQPACKET
372 }
373
374 const int TCP_NODELAY = 0x0001;
375
376 enum : int {
377     AF_UNSPEC,
378     AF_UNIX,
379     AF_INET,
380     AF_IMPLINK,
381     AF_PUP,
382     AF_CHAOS,
383     AF_IPX,  // =  6
384     AF_NS       =  6,
385     AF_ISO,
386     AF_OSI      = AF_ISO,
387     AF_ECMA,
388     AF_DATAKIT,
389     AF_CCITT,
390     AF_SNA,
391     AF_DECnet,
392     AF_DLI,
393     AF_LAT,
394     AF_HYLINK,
395     AF_APPLETALK,
396     AF_NETBIOS,
397     AF_VOICEVIEW,
398     AF_FIREFOX,
399     AF_UNKNOWN1,
400     AF_BAN,
401     AF_ATM,
402     AF_INET6,
403     // AF_CLUSTER, AF_12844 nad AF_NETDES are not documented on MSDN
404     AF_CLUSTER,
405     AF_12844,
406     AF_IRDA, // = 26
407     AF_NETDES   = 28,
408     AF_MAX   // = 29
409 }
410
411 struct SOCKADDR {
412     u_short  sa_family;
413     char[14] sa_data;
414 }
415 alias SOCKADDR* PSOCKADDR, LPSOCKADDR;
416
417 /* Portable IPv6/IPv4 version of sockaddr.
418    Uses padding to force 8 byte alignment
419    and maximum size of 128 bytes */
420 struct SOCKADDR_STORAGE {
421     short     ss_family;
422     char[6]   __ss_pad1;   // pad to 8
423     long      __ss_align;  // force alignment
424     char[112] __ss_pad2;   // pad to 128
425 }
426 alias SOCKADDR_STORAGE* PSOCKADDR_STORAGE;
427
428 struct sockproto {
429     u_short sp_family;
430     u_short sp_protocol;
431 }
432
433 enum : int {
434     PF_UNSPEC    = AF_UNSPEC,
435     PF_UNIX      = AF_UNIX,
436     PF_INET      = AF_INET,
437     PF_IMPLINK   = AF_IMPLINK,
438     PF_PUP       = AF_PUP,
439     PF_CHAOS     = AF_CHAOS,
440     PF_NS        = AF_NS,
441     PF_IPX       = AF_IPX,
442     PF_ISO       = AF_ISO,
443     PF_OSI       = AF_OSI,
444     PF_ECMA      = AF_ECMA,
445     PF_DATAKIT   = AF_DATAKIT,
446     PF_CCITT     = AF_CCITT,
447     PF_SNA       = AF_SNA,
448     PF_DECnet    = AF_DECnet,
449     PF_DLI       = AF_DLI,
450     PF_LAT       = AF_LAT,
451     PF_HYLINK    = AF_HYLINK,
452     PF_APPLETALK = AF_APPLETALK,
453     PF_VOICEVIEW = AF_VOICEVIEW,
454     PF_FIREFOX   = AF_FIREFOX,
455     PF_UNKNOWN1  = AF_UNKNOWN1,
456     PF_BAN       = AF_BAN,
457     PF_ATM       = AF_ATM,
458     PF_INET6     = AF_INET6,
459     PF_MAX       = AF_MAX
460 }
461
462 const int SOL_SOCKET = 0xFFFF;
463
464 const int SOMAXCONN = 5;
465
466 const int
467     MSG_OOB       = 1,
468     MSG_PEEK      = 2,
469     MSG_DONTROUTE = 4,
470     MSG_MAXIOVLEN = 16,
471     MSG_PARTIAL   = 0x8000;
472
473 const size_t MAXGETHOSTSTRUCT = 1024;
474
475 // Not documented on MSDN
476 enum {
477     FD_READ_BIT,
478     FD_WRITE_BIT,
479     FD_OOB_BIT,
480     FD_ACCEPT_BIT,
481     FD_CONNECT_BIT,
482     FD_CLOSE_BIT,
483     FD_QOS_BIT,
484     FD_GROUP_QOS_BIT,
485     FD_ROUTING_INTERFACE_CHANGE_BIT,
486     FD_ADDRESS_LIST_CHANGE_BIT,
487     FD_MAX_EVENTS // = 10
488 }
489
490 const int
491     FD_READ                     = 1 << FD_READ_BIT,
492     FD_WRITE                    = 1 << FD_WRITE_BIT,
493     FD_OOB                      = 1 << FD_OOB_BIT,
494     FD_ACCEPT                   = 1 << FD_ACCEPT_BIT,
495     FD_CONNECT                  = 1 << FD_CONNECT_BIT,
496     FD_CLOSE                    = 1 << FD_CLOSE_BIT,
497     FD_QOS                      = 1 << FD_QOS_BIT,
498     FD_GROUP_QOS                = 1 << FD_GROUP_QOS_BIT,
499     FD_ROUTING_INTERFACE_CHANGE = 1 << FD_ROUTING_INTERFACE_CHANGE_BIT,
500     FD_ADDRESS_LIST_CHANGE      = 1 << FD_ADDRESS_LIST_CHANGE_BIT,
501     FD_ALL_EVENTS               = (1 << FD_MAX_EVENTS) - 1;
502
503 enum : int {
504     WSABASEERR         = 10000,
505     WSAEINTR           = WSABASEERR + 4,
506     WSAEBADF           = WSABASEERR + 9,
507     WSAEACCES          = WSABASEERR + 13,
508     WSAEFAULT          = WSABASEERR + 14,
509     WSAEINVAL          = WSABASEERR + 22,
510     WSAEMFILE          = WSABASEERR + 24,
511     WSAEWOULDBLOCK     = WSABASEERR + 35,
512     WSAEINPROGRESS     = WSABASEERR + 36, // deprecated on WinSock2
513     WSAEALREADY        = WSABASEERR + 37,
514     WSAENOTSOCK        = WSABASEERR + 38,
515     WSAEDESTADDRREQ    = WSABASEERR + 39,
516     WSAEMSGSIZE        = WSABASEERR + 40,
517     WSAEPROTOTYPE      = WSABASEERR + 41,
518     WSAENOPROTOOPT     = WSABASEERR + 42,
519     WSAEPROTONOSUPPORT = WSABASEERR + 43,
520     WSAESOCKTNOSUPPORT = WSABASEERR + 44,
521     WSAEOPNOTSUPP      = WSABASEERR + 45,
522     WSAEPFNOSUPPORT    = WSABASEERR + 46,
523     WSAEAFNOSUPPORT    = WSABASEERR + 47,
524     WSAEADDRINUSE      = WSABASEERR + 48,
525     WSAEADDRNOTAVAIL   = WSABASEERR + 49,
526     WSAENETDOWN        = WSABASEERR + 50,
527     WSAENETUNREACH     = WSABASEERR + 51,
528     WSAENETRESET       = WSABASEERR + 52,
529     WSAECONNABORTED    = WSABASEERR + 53,
530     WSAECONNRESET      = WSABASEERR + 54,
531     WSAENOBUFS         = WSABASEERR + 55,
532     WSAEISCONN         = WSABASEERR + 56,
533     WSAENOTCONN        = WSABASEERR + 57,
534     WSAESHUTDOWN       = WSABASEERR + 58,
535     WSAETOOMANYREFS    = WSABASEERR + 59,
536     WSAETIMEDOUT       = WSABASEERR + 60,
537     WSAECONNREFUSED    = WSABASEERR + 61,
538     WSAELOOP           = WSABASEERR + 62,
539     WSAENAMETOOLONG    = WSABASEERR + 63,
540     WSAEHOSTDOWN       = WSABASEERR + 64,
541     WSAEHOSTUNREACH    = WSABASEERR + 65,
542     WSAENOTEMPTY       = WSABASEERR + 66,
543     WSAEPROCLIM        = WSABASEERR + 67,
544     WSAEUSERS          = WSABASEERR + 68,
545     WSAEDQUOT          = WSABASEERR + 69,
546     WSAESTALE          = WSABASEERR + 70,
547     WSAEREMOTE         = WSABASEERR + 71,
548     WSAEDISCON         = WSABASEERR + 101,
549     WSASYSNOTREADY     = WSABASEERR + 91,
550     WSAVERNOTSUPPORTED = WSABASEERR + 92,
551     WSANOTINITIALISED  = WSABASEERR + 93,
552     WSAHOST_NOT_FOUND  = WSABASEERR + 1001,
553     WSATRY_AGAIN       = WSABASEERR + 1002,
554     WSANO_RECOVERY     = WSABASEERR + 1003,
555     WSANO_DATA         = WSABASEERR + 1004,
556     WSANO_ADDRESS      = WSANO_DATA,
557
558     // WinSock2 specific error codes
559     WSAENOMORE             = WSABASEERR + 102,
560     WSAECANCELLED          = WSABASEERR + 103,
561     WSAEINVALIDPROCTABLE   = WSABASEERR + 104,
562     WSAEINVALIDPROVIDER    = WSABASEERR + 105,
563     WSAEPROVIDERFAILEDINIT = WSABASEERR + 106,
564     WSASYSCALLFAILURE      = WSABASEERR + 107,
565     WSASERVICE_NOT_FOUND   = WSABASEERR + 108,
566     WSATYPE_NOT_FOUND      = WSABASEERR + 109,
567     WSA_E_NO_MORE          = WSABASEERR + 110,
568     WSA_E_CANCELLED        = WSABASEERR + 111,
569     WSAEREFUSED            = WSABASEERR + 112,
570
571     // WS QualityofService errors
572     WSA_QOS_RECEIVERS          = WSABASEERR + 1005,
573     WSA_QOS_SENDERS            = WSABASEERR + 1006,
574     WSA_QOS_NO_SENDERS         = WSABASEERR + 1007,
575     WSA_QOS_NO_RECEIVERS       = WSABASEERR + 1008,
576     WSA_QOS_REQUEST_CONFIRMED  = WSABASEERR + 1009,
577     WSA_QOS_ADMISSION_FAILURE  = WSABASEERR + 1010,
578     WSA_QOS_POLICY_FAILURE     = WSABASEERR + 1011,
579     WSA_QOS_BAD_STYLE          = WSABASEERR + 1012,
580     WSA_QOS_BAD_OBJECT         = WSABASEERR + 1013,
581     WSA_QOS_TRAFFIC_CTRL_ERROR = WSABASEERR + 1014,
582     WSA_QOS_GENERIC_ERROR      = WSABASEERR + 1015,
583     WSA_QOS_ESERVICETYPE       = WSABASEERR + 1016,
584     WSA_QOS_EFLOWSPEC          = WSABASEERR + 1017,
585     WSA_QOS_EPROVSPECBUF       = WSABASEERR + 1018,
586     WSA_QOS_EFILTERSTYLE       = WSABASEERR + 1019,
587     WSA_QOS_EFILTERTYPE        = WSABASEERR + 1020,
588     WSA_QOS_EFILTERCOUNT       = WSABASEERR + 1021,
589     WSA_QOS_EOBJLENGTH         = WSABASEERR + 1022,
590     WSA_QOS_EFLOWCOUNT         = WSABASEERR + 1023,
591     WSA_QOS_EUNKOWNPSOBJ       = WSABASEERR + 1024,
592     WSA_QOS_EPOLICYOBJ         = WSABASEERR + 1025,
593     WSA_QOS_EFLOWDESC          = WSABASEERR + 1026,
594     WSA_QOS_EPSFLOWSPEC        = WSABASEERR + 1027,
595     WSA_QOS_EPSFILTERSPEC      = WSABASEERR + 1028,
596     WSA_QOS_ESDMODEOBJ         = WSABASEERR + 1029,
597     WSA_QOS_ESHAPERATEOBJ      = WSABASEERR + 1030,
598     WSA_QOS_RESERVED_PETYPE    = WSABASEERR + 1031
599 }
600
601 alias WSAGetLastError h_errno;
602
603 enum : int {
604     HOST_NOT_FOUND = WSAHOST_NOT_FOUND,
605     TRY_AGAIN      = WSATRY_AGAIN,
606     NO_RECOVERY    = WSANO_RECOVERY,
607     NO_DATA        = WSANO_DATA,
608     NO_ADDRESS     = WSANO_ADDRESS
609 }
610
611 extern (Windows) {
612     SOCKET accept(SOCKET, SOCKADDR*, int*);
613     int bind(SOCKET, CPtr!(SOCKADDR), int);
614     int closesocket(SOCKET);
615     int connect(SOCKET, CPtr!(SOCKADDR), int);
616     int ioctlsocket(SOCKET, int, u_long*);
617     int getpeername(SOCKET, SOCKADDR*, int*);
618     int getsockname(SOCKET, SOCKADDR*, int*);
619     int getsockopt(SOCKET, int, int, void*, int*);
620     uint inet_addr(CPtr!(char));
621     int listen(SOCKET, int);
622     int recv(SOCKET, ubyte*, int, int);
623     int recvfrom(SOCKET, ubyte*, int, int, SOCKADDR*, int*);
624     int send(SOCKET, CPtr!(ubyte), int, int);
625     int sendto(SOCKET, CPtr!(ubyte), int, int, CPtr!(SOCKADDR), int);
626     int setsockopt(SOCKET, int, int, CPtr!(void), int);
627     int shutdown(SOCKET, int);
628     SOCKET socket(int, int, int);
629
630     alias typeof(&accept) LPFN_ACCEPT;
631     alias typeof(&bind) LPFN_BIND;
632     alias typeof(&closesocket) LPFN_CLOSESOCKET;
633     alias typeof(&connect) LPFN_CONNECT;
634     alias typeof(&ioctlsocket) LPFN_IOCTLSOCKET;
635     alias typeof(&getpeername) LPFN_GETPEERNAME;
636     alias typeof(&getsockname) LPFN_GETSOCKNAME;
637     alias typeof(&getsockopt) LPFN_GETSOCKOPT;
638     alias typeof(&inet_addr) LPFN_INET_ADDR;
639     alias typeof(&listen) LPFN_LISTEN;
640     alias typeof(&recv) LPFN_RECV;
641     alias typeof(&recvfrom) LPFN_RECVFROM;
642     alias typeof(&send) LPFN_SEND;
643     alias typeof(&sendto) LPFN_SENDTO;
644     alias typeof(&setsockopt) LPFN_SETSOCKOPT;
645     alias typeof(&shutdown) LPFN_SHUTDOWN;
646     alias typeof(&socket) LPFN_SOCKET;
647 }
648
649 extern(Windows) {
650     char* inet_ntoa(IN_ADDR);
651     HOSTENT* gethostbyaddr(CPtr!(char), int, int);
652     HOSTENT* gethostbyname(CPtr!(char));
653     SERVENT* getservbyport(int, CPtr!(char));
654     SERVENT* getservbyname(CPtr!(char), CPtr!(char));
655     PROTOENT* getprotobynumber(int);
656     PROTOENT* getprotobyname(CPtr!(char));
657
658     /* NOTE: DK: in the original headers, these were declared with
659        PASCAL linkage.  Since this is at odds with the definition
660        of the functions themselves, and also since MinGW seems to
661        treat the two interchangably, I have moved them here. */
662     alias typeof(&inet_ntoa) LPFN_INET_NTOA;
663     alias typeof(&gethostbyaddr) LPFN_GETHOSTBYADDR;
664     alias typeof(&gethostbyname) LPFN_GETHOSTBYNAME;
665     alias typeof(&getservbyport) LPFN_GETSERVBYPORT;
666     alias typeof(&getservbyname) LPFN_GETSERVBYNAME;
667     alias typeof(&getprotobynumber) LPFN_GETPROTOBYNUMBER;
668     alias typeof(&getprotobyname) LPFN_GETPROTOBYNAME;
669 }
670
671 extern(Windows) {
672     int WSAStartup(WORD, LPWSADATA);
673     int WSACleanup();
674     void WSASetLastError(int);
675     int WSAGetLastError();
676
677     alias typeof(&WSAStartup) LPFN_WSASTARTUP;
678     alias typeof(&WSACleanup) LPFN_WSACLEANUP;
679     alias typeof(&WSASetLastError) LPFN_WSASETLASTERROR;
680     alias typeof(&WSAGetLastError) LPFN_WSAGETLASTERROR;
681 }
682
683 /*
684  * Pseudo-blocking functions are deprecated in WinSock2
685  * spec. Use threads instead.
686  */
687 deprecated extern(Windows) {
688     BOOL WSAIsBlocking();
689     int WSAUnhookBlockingHook();
690     FARPROC WSASetBlockingHook(FARPROC);
691     int WSACancelBlockingCall();
692
693     alias typeof(&WSAIsBlocking) LPFN_WSAISBLOCKING;
694     alias typeof(&WSAUnhookBlockingHook) LPFN_WSAUNHOOKBLOCKINGHOOK;
695     alias typeof(&WSASetBlockingHook) LPFN_WSASETBLOCKINGHOOK;
696     alias typeof(&WSACancelBlockingCall) LPFN_WSACANCELBLOCKINGCALL;
697 }
698
699 extern(Windows) {
700     HANDLE WSAAsyncGetServByName(HWND, u_int, CPtr!(char), CPtr!(char), char*, int);
701     HANDLE WSAAsyncGetServByPort(HWND, u_int, int, CPtr!(char), char*, int);
702     HANDLE WSAAsyncGetProtoByName(HWND, u_int, CPtr!(char), char*, int);
703     HANDLE WSAAsyncGetProtoByNumber(HWND, u_int, int, char*, int);
704     HANDLE WSAAsyncGetHostByName(HWND, u_int, CPtr!(char), char*, int);
705     HANDLE WSAAsyncGetHostByAddr(HWND, u_int, CPtr!(char), int, int, char*, int);
706     int WSACancelAsyncRequest(HANDLE);
707     int WSAAsyncSelect(SOCKET, HWND, u_int, long);
708
709     alias typeof(&WSAAsyncGetServByName) LPFN_WSAAsyncGetServByName;
710     alias typeof(&WSAAsyncGetServByPort) LPFN_WSAASYNCGETSERVBYPORT;
711     alias typeof(&WSAAsyncGetProtoByName) LPFN_WSAASYNCGETPROTOBYNAME;
712     alias typeof(&WSAAsyncGetProtoByNumber) LPFN_WSAASYNCGETPROTOBYNUMBER;
713     alias typeof(&WSAAsyncGetHostByName) LPFN_WSAASYNCGETHOSTBYNAME;
714     alias typeof(&WSAAsyncGetHostByAddr) LPFN_WSAASYNCGETHOSTBYADDR;
715     alias typeof(&WSACancelAsyncRequest) LPFN_WSACANCELASYNCREQUEST;
716     alias typeof(&WSAAsyncSelect) LPFN_WSAASYNCSELECT;
717 }
718
719 extern(Windows) {
720     u_long htonl(u_long);
721     u_long ntohl(u_long);
722     u_short htons(u_short);
723     u_short ntohs(u_short);
724     int select(int nfds, fd_set*, fd_set*, fd_set*, CPtr!(TIMEVAL));
725
726     alias typeof(&htonl) LPFN_HTONL;
727     alias typeof(&ntohl) LPFN_NTOHL;
728     alias typeof(&htons) LPFN_HTONS;
729     alias typeof(&ntohs) LPFN_NTOHS;
730     alias typeof(&select) LPFN_SELECT;
731
732     int gethostname(char*, int);
733     alias typeof(&gethostname) LPFN_GETHOSTNAME;
734 }
735
736 alias MAKELONG WSAMAKEASYNCREPLY, WSAMAKESELECTREPLY;
737 alias LOWORD WSAGETASYNCBUFLEN, WSAGETSELECTEVENT;
738 alias HIWORD WSAGETASYNCERROR, WSAGETSELECTERROR;
739
740
741 alias INADDR_ANY ADDR_ANY;
742
743 bool IN_CLASSD(int i) { return (i & 0xf0000000) == 0xe0000000; }
744
745 const IN_CLASSD_NET    = 0xf0000000;
746 const IN_CLASSD_NSHIFT =         28;
747 const IN_CLASSD_HOST   = 0x0fffffff;
748
749 alias IN_CLASSD IN_MULTICAST;
750
751 const FROM_PROTOCOL_INFO = -1;
752
753 enum : int {
754     SO_GROUP_ID = 0x2001,
755     SO_GROUP_PRIORITY,
756     SO_MAX_MSG_SIZE,
757     SO_PROTOCOL_INFOA,
758     SO_PROTOCOL_INFOW
759 }
760 // NOTE: These are logically part of the previous enum, but you can't
761 // have version statements in an enum body...
762 version(Unicode)
763     const int SO_PROTOCOL_INFO = SO_PROTOCOL_INFOW;
764 else
765     const int SO_PROTOCOL_INFO = SO_PROTOCOL_INFOA;
766
767 const PVD_CONFIG = 0x3001;
768
769 const MSG_INTERRUPT = 0x10;
770 //const MSG_MAXIOVLEN = 16; // Already declared above
771
772 alias HANDLE WSAEVENT;
773 alias LPHANDLE LPWSAEVENT;
774 alias OVERLAPPED WSAOVERLAPPED;
775 alias OVERLAPPED* LPWSAOVERLAPPED;
776
777 private import win32.winerror;
778 private import win32.winbase;
779
780 enum {
781     WSA_IO_PENDING        = ERROR_IO_PENDING,
782     WSA_IO_INCOMPLETE     = ERROR_IO_INCOMPLETE,
783     WSA_INVALID_HANDLE    = ERROR_INVALID_HANDLE,
784     WSA_INVALID_PARAMETER = ERROR_INVALID_PARAMETER,
785     WSA_NOT_ENOUGH_MEMORY = ERROR_NOT_ENOUGH_MEMORY,
786     WSA_OPERATION_ABORTED = ERROR_OPERATION_ABORTED
787 }
788
789 const WSA_INVALID_EVENT = cast(WSAEVENT)null;
790 const WSA_MAXIMUM_WAIT_EVENTS = MAXIMUM_WAIT_OBJECTS;
791 const WSA_WAIT_FAILED = cast(DWORD)-1;
792 const WSA_WAIT_EVENT_0 = WAIT_OBJECT_0;
793 const WSA_WAIT_IO_COMPLETION = WAIT_IO_COMPLETION;
794 const WSA_WAIT_TIMEOUT = WAIT_TIMEOUT;
795 const WSA_INFINITE = INFINITE;
796
797 struct WSABUF {
798     uint  len;
799     char* buf;
800 }
801
802 alias WSABUF* LPWSABUF;
803
804 enum GUARANTEE {
805     BestEffortService,
806     ControlledLoadService,
807     PredictiveService,
808     GuaranteedDelayService,
809     GuaranteedService
810 }
811
812 /* TODO: FLOWSPEC and related definitions belong in qos.h */
813
814 /*
815    Windows Sockets 2 Application Programming Interface,
816    revision 2.2.2 (1997) uses the type uint32 for SERVICETYPE
817    and the elements of _flowspec, but the type uint32 is not defined
818    or used anywhere else in the w32api. For now, just use
819    unsigned int, which is 32 bits on _WIN32 and _WIN64.
820 */
821
822 alias uint SERVICETYPE;
823
824 struct FLOWSPEC {
825     uint        TokenRate;
826     uint        TokenBucketSize;
827     uint        PeakBandwidth;
828     uint        Latency;
829     uint        DelayVariation;
830     SERVICETYPE ServiceType;
831     uint        MaxSduSize;
832     uint        MinimumPolicedSize;
833 }
834
835 alias FLOWSPEC* PFLOWSPEC, LPFLOWSPEC;
836
837 struct QOS
838 {
839     FLOWSPEC SendingFlowspec;
840     FLOWSPEC ReceivingFlowspec;
841     WSABUF   ProviderSpecific;
842 }
843
844 alias QOS* LPQOS;
845
846 enum {
847     CF_ACCEPT,
848     CF_REJECT,
849     CF_DEFER
850 }
851
852 // REM: Already defined above
853 /*enum {
854     SD_RECEIVE,
855     SD_SEND,
856     SD_BOTH
857 }*/
858
859 alias uint GROUP;
860
861 enum {
862     SG_UNCONSTRAINED_GROUP = 0x01,
863     SG_CONSTRAINED_GROUP
864 }
865
866 struct WSANETWORKEVENTS {
867     int lNetworkEvents;
868     int[FD_MAX_EVENTS] iErrorCode;
869 }
870
871 alias WSANETWORKEVENTS* LPWSANETWORKEVENTS;
872
873 const MAX_PROTOCOL_CHAIN = 7;
874
875 const BASE_PROTOCOL    = 1;
876 const LAYERED_PROTOCOL = 0;
877
878 enum WSAESETSERVICEOP
879 {
880     RNRSERVICE_REGISTER = 0,
881     RNRSERVICE_DEREGISTER,
882     RNRSERVICE_DELETE
883 }
884
885 alias WSAESETSERVICEOP* PWSAESETSERVICEOP, LPWSAESETSERVICEOP;
886
887 struct AFPROTOCOLS {
888     INT iAddressFamily;
889     INT iProtocol;
890 }
891
892 alias AFPROTOCOLS* PAFPROTOCOLS, LPAFPROTOCOLS;
893
894 enum WSAECOMPARATOR
895 {
896     COMP_EQUAL = 0,
897     COMP_NOTLESS
898 }
899
900 alias WSAECOMPARATOR* PWSAECOMPARATOR, LPWSAECOMPARATOR;
901
902 struct WSAVERSION
903 {
904     DWORD          dwVersion;
905     WSAECOMPARATOR ecHow;
906 }
907
908 alias WSAVERSION* PWSAVERSION, LPWSAVERSION;
909
910 // Import for SOCKET_ADDRESS, CSADDR_INFO
911 // import win32.nspapi;
912 //#ifndef __CSADDR_T_DEFINED /* also in nspapi.h */
913 //#define __CSADDR_T_DEFINED
914
915 struct SOCKET_ADDRESS {
916     LPSOCKADDR lpSockaddr;
917     INT        iSockaddrLength;
918 }
919
920 alias SOCKET_ADDRESS* PSOCKET_ADDRESS, LPSOCKET_ADDRESS;
921
922 struct CSADDR_INFO {
923     SOCKET_ADDRESS LocalAddr;
924     SOCKET_ADDRESS RemoteAddr;
925     INT            iSocketType;
926     INT            iProtocol;
927 }
928
929 alias CSADDR_INFO* PCSADDR_INFO, LPCSADDR_INFO;
930
931 //#endif
932
933 struct SOCKET_ADDRESS_LIST {
934     INT               iAddressCount;
935     SOCKET_ADDRESS[1] _Address;
936     SOCKET_ADDRESS* Address() { return _Address.ptr; }
937 }
938
939 alias SOCKET_ADDRESS_LIST* LPSOCKET_ADDRESS_LIST;
940
941 // TODO: Import wtypes/nspapi?
942 //#ifndef __BLOB_T_DEFINED /* also in wtypes.h and nspapi.h */
943 //#define __BLOB_T_DEFINED
944 struct BLOB {
945     ULONG cbSize;
946     BYTE* pBlobData;
947 }
948
949 alias BLOB* PBLOB, LPBLOB;
950 //#endif
951
952 struct WSAQUERYSETA
953 {
954     DWORD         dwSize;
955     LPSTR         lpszServiceInstanceName;
956     LPGUID        lpServiceClassId;
957     LPWSAVERSION  lpVersion;
958     LPSTR         lpszComment;
959     DWORD         dwNameSpace;
960     LPGUID        lpNSProviderId;
961     LPSTR         lpszContext;
962     DWORD         dwNumberOfProtocols;
963     LPAFPROTOCOLS lpafpProtocols;
964     LPSTR         lpszQueryString;
965     DWORD         dwNumberOfCsAddrs;
966     LPCSADDR_INFO lpcsaBuffer;
967     DWORD         dwOutputFlags;
968     LPBLOB        lpBlob;
969 }
970
971 alias WSAQUERYSETA* PWSAQUERYSETA, LPWSAQUERYSETA;
972
973 struct WSAQUERYSETW
974 {
975     DWORD         dwSize;
976     LPWSTR        lpszServiceInstanceName;
977     LPGUID        lpServiceClassId;
978     LPWSAVERSION  lpVersion;
979     LPWSTR        lpszComment;
980     DWORD         dwNameSpace;
981     LPGUID        lpNSProviderId;
982     LPWSTR        lpszContext;
983     DWORD         dwNumberOfProtocols;
984     LPAFPROTOCOLS lpafpProtocols;
985     LPWSTR        lpszQueryString;
986     DWORD         dwNumberOfCsAddrs;
987     LPCSADDR_INFO lpcsaBuffer;
988     DWORD         dwOutputFlags;
989     LPBLOB        lpBlob;
990 }
991
992
993 alias WSAQUERYSETW* PWSAQUERYSETW, LPWSAQUERYSETW;
994
995 version(Unicode) {
996     alias WSAQUERYSETW WSAQUERYSET;
997     alias PWSAQUERYSETW PWSAQUERYSET;
998     alias LPWSAQUERYSETW LPWSAQUERYSET;
999 } else {
1000     alias WSAQUERYSETA WSAQUERYSET;
1001     alias PWSAQUERYSETA PWSAQUERYSET;
1002     alias LPWSAQUERYSETA LPWSAQUERYSET;
1003 }
1004
1005 const int
1006     LUP_DEEP                = 0x0001,
1007     LUP_CONTAINERS          = 0x0002,
1008     LUP_NOCONTAINERS        = 0x0004,
1009     LUP_NEAREST             = 0x0008,
1010     LUP_RETURN_NAME         = 0x0010,
1011     LUP_RETURN_TYPE         = 0x0020,
1012     LUP_RETURN_VERSION      = 0x0040,
1013     LUP_RETURN_COMMENT      = 0x0080,
1014     LUP_RETURN_ADDR         = 0x0100,
1015     LUP_RETURN_BLOB         = 0x0200,
1016     LUP_RETURN_ALIASES      = 0x0400,
1017     LUP_RETURN_QUERY_STRING = 0x0800,
1018     LUP_RETURN_ALL          = 0x0FF0,
1019     LUP_RES_SERVICE         = 0x8000,
1020     LUP_FLUSHCACHE          = 0x1000,
1021     LUP_FLUSHPREVIOUS       = 0x2000;
1022
1023 struct WSANSCLASSINFOA
1024 {
1025     LPSTR  lpszName;
1026     DWORD  dwNameSpace;
1027     DWORD  dwValueType;
1028     DWORD  dwValueSize;
1029     LPVOID lpValue;
1030 }
1031
1032 alias WSANSCLASSINFOA* PWSANSCLASSINFOA, LPWSANSCLASSINFOA;
1033
1034 struct WSANSCLASSINFOW
1035 {
1036     LPWSTR lpszName;
1037     DWORD  dwNameSpace;
1038     DWORD  dwValueType;
1039     DWORD  dwValueSize;
1040     LPVOID lpValue;
1041 }
1042
1043 alias WSANSCLASSINFOW* PWSANSCLASSINFOW, LPWSANSCLASSINFOW;
1044
1045 version(Unicode) {
1046     alias WSANSCLASSINFOW WSANSCLASSINFO;
1047     alias PWSANSCLASSINFOW PWSANSCLASSINFO;
1048     alias LPWSANSCLASSINFOW LPWSANSCLASSINFO;
1049 } else {
1050     alias WSANSCLASSINFOA WSANSCLASSINFO;
1051     alias PWSANSCLASSINFOA PWSANSCLASSINFO;
1052     alias LPWSANSCLASSINFOA LPWSANSCLASSINFO;
1053 }
1054
1055 struct WSASERVICECLASSINFOA
1056 {
1057     LPGUID            lpServiceClassId;
1058     LPSTR             lpszServiceClassName;
1059     DWORD             dwCount;
1060     LPWSANSCLASSINFOA lpClassInfos;
1061 }
1062
1063 alias WSASERVICECLASSINFOA* PWSASERVICECLASSINFOA, LPWSASERVICECLASSINFOA;
1064
1065 struct WSASERVICECLASSINFOW
1066 {
1067     LPGUID            lpServiceClassId;
1068     LPWSTR            lpszServiceClassName;
1069     DWORD             dwCount;
1070     LPWSANSCLASSINFOW lpClassInfos;
1071 }
1072
1073 alias WSASERVICECLASSINFOW* PWSASERVICECLASSINFOW, LPWSASERVICECLASSINFOW;
1074
1075 version(Unicode) {
1076     alias WSASERVICECLASSINFOW WSASERVICECLASSINFO;
1077     alias PWSASERVICECLASSINFOW PWSASERVICECLASSINFO;
1078     alias LPWSASERVICECLASSINFOW LPWSASERVICECLASSINFO;
1079 } else {
1080     alias WSASERVICECLASSINFOA WSASERVICECLASSINFO;
1081     alias PWSASERVICECLASSINFOA PWSASERVICECLASSINFO;
1082     alias LPWSASERVICECLASSINFOA LPWSASERVICECLASSINFO;
1083 }
1084
1085 struct WSANAMESPACE_INFOA {
1086     GUID  NSProviderId;
1087     DWORD dwNameSpace;
1088     BOOL  fActive;
1089     DWORD dwVersion;
1090     LPSTR lpszIdentifier;
1091 }
1092
1093 alias WSANAMESPACE_INFOA* PWSANAMESPACE_INFOA, LPWSANAMESPACE_INFOA;
1094
1095 struct WSANAMESPACE_INFOW {
1096     GUID   NSProviderId;
1097     DWORD  dwNameSpace;
1098     BOOL   fActive;
1099     DWORD  dwVersion;
1100     LPWSTR lpszIdentifier;
1101 }
1102
1103 alias WSANAMESPACE_INFOW* PWSANAMESPACE_INFOW, LPWSANAMESPACE_INFOW;
1104
1105 version(Unicode) {
1106     alias WSANAMESPACE_INFOW WSANAMESPACE_INFO;
1107     alias PWSANAMESPACE_INFOW PWSANAMESPACE_INFO;
1108     alias LPWSANAMESPACE_INFOW LPWSANAMESPACE_INFO;
1109 } else {
1110     alias WSANAMESPACE_INFOA WSANAMESPACE_INFO;
1111     alias PWSANAMESPACE_INFOA PWSANAMESPACE_INFO;
1112     alias LPWSANAMESPACE_INFOA LPWSANAMESPACE_INFO;
1113 }
1114
1115 struct WSAPROTOCOLCHAIN {
1116     int                       ChainLen;
1117     DWORD[MAX_PROTOCOL_CHAIN] ChainEntries;
1118 }
1119
1120 alias WSAPROTOCOLCHAIN* LPWSAPROTOCOLCHAIN;
1121
1122 const WSAPROTOCOL_LEN = 255;
1123
1124 struct WSAPROTOCOL_INFOA {
1125     DWORD dwServiceFlags1;
1126     DWORD dwServiceFlags2;
1127     DWORD dwServiceFlags3;
1128     DWORD dwServiceFlags4;
1129     DWORD dwProviderFlags;
1130     GUID ProviderId;
1131     DWORD dwCatalogEntryId;
1132     WSAPROTOCOLCHAIN ProtocolChain;
1133     int iVersion;
1134     int iAddressFamily;
1135     int iMaxSockAddr;
1136     int iMinSockAddr;
1137     int iSocketType;
1138     int iProtocol;
1139     int iProtocolMaxOffset;
1140     int iNetworkByteOrder;
1141     int iSecurityScheme;
1142     DWORD dwMessageSize;
1143     DWORD dwProviderReserved;
1144     CHAR[WSAPROTOCOL_LEN+1] szProtocol;
1145 }
1146
1147 alias WSAPROTOCOL_INFOA* LPWSAPROTOCOL_INFOA;
1148
1149 struct WSAPROTOCOL_INFOW {
1150     DWORD dwServiceFlags1;
1151     DWORD dwServiceFlags2;
1152     DWORD dwServiceFlags3;
1153     DWORD dwServiceFlags4;
1154     DWORD dwProviderFlags;
1155     GUID ProviderId;
1156     DWORD dwCatalogEntryId;
1157     WSAPROTOCOLCHAIN ProtocolChain;
1158     int iVersion;
1159     int iAddressFamily;
1160     int iMaxSockAddr;
1161     int iMinSockAddr;
1162     int iSocketType;
1163     int iProtocol;
1164     int iProtocolMaxOffset;
1165     int iNetworkByteOrder;
1166     int iSecurityScheme;
1167     DWORD dwMessageSize;
1168     DWORD dwProviderReserved;
1169     WCHAR[WSAPROTOCOL_LEN+1] szProtocol;
1170 }
1171
1172 alias WSAPROTOCOL_INFOW* LPWSAPROTOCOL_INFOW;
1173
1174 // TODO: Below fptr was defined as "CALLBACK" for linkage; is this right?
1175 extern(C) {
1176     alias int function(LPWSABUF, LPWSABUF, LPQOS, LPQOS, LPWSABUF, LPWSABUF, GROUP *, DWORD) LPCONDITIONPROC;
1177 }
1178
1179 extern(Windows) {
1180     alias void function(DWORD, DWORD, LPWSAOVERLAPPED, DWORD) LPWSAOVERLAPPED_COMPLETION_ROUTINE;
1181 }
1182
1183 version(Unicode) {
1184     alias WSAPROTOCOL_INFOW WSAPROTOCOL_INFO;
1185     alias LPWSAPROTOCOL_INFOW LPWSAPROTOCOL_INFO;
1186 } else {
1187     alias WSAPROTOCOL_INFOA WSAPROTOCOL_INFO;
1188     alias LPWSAPROTOCOL_INFOA LPWSAPROTOCOL_INFO;
1189 }
1190
1191 /* Needed for XP & .NET Server function WSANSPIoctl.  */
1192 enum WSACOMPLETIONTYPE {
1193     NSP_NOTIFY_IMMEDIATELY = 0,
1194     NSP_NOTIFY_HWND,
1195     NSP_NOTIFY_EVENT,
1196     NSP_NOTIFY_PORT,
1197     NSP_NOTIFY_APC
1198 }
1199
1200 alias WSACOMPLETIONTYPE* PWSACOMPLETIONTYPE, LPWSACOMPLETIONTYPE;
1201
1202 struct WSACOMPLETION {
1203     WSACOMPLETIONTYPE Type;
1204     union WSACOMPLETION_PARAMETERS {
1205         struct WSACOMPLETION_WINDOWMESSAGE {
1206             HWND hWnd;
1207             UINT uMsg;
1208             WPARAM context;
1209         }
1210         WSACOMPLETION_WINDOWMESSAGE WindowMessage;
1211         struct WSACOMPLETION_EVENT {
1212             LPWSAOVERLAPPED lpOverlapped;
1213         }
1214         WSACOMPLETION_EVENT Event;
1215         struct WSACOMPLETION_APC {
1216             LPWSAOVERLAPPED lpOverlapped;
1217             LPWSAOVERLAPPED_COMPLETION_ROUTINE lpfnCompletionProc;
1218         }
1219         WSACOMPLETION_APC Apc;
1220         struct WSACOMPLETION_PORT {
1221             LPWSAOVERLAPPED lpOverlapped;
1222             HANDLE hPort;
1223             ULONG_PTR Key;
1224         }
1225         WSACOMPLETION_PORT Port;
1226     }
1227     WSACOMPLETION_PARAMETERS Parameters;
1228 }
1229
1230 alias WSACOMPLETION* PWSACOMPLETION, LPWSACOMPLETION;
1231
1232 const int
1233     PFL_MULTIPLE_PROTO_ENTRIES  = 0x00000001,
1234     PFL_RECOMMENDED_PROTO_ENTRY = 0x00000002,
1235     PFL_HIDDEN                  = 0x00000004,
1236     PFL_MATCHES_PROTOCOL_ZERO   = 0x00000008;
1237
1238 const int
1239     XP1_CONNECTIONLESS           = 0x00000001,
1240     XP1_GUARANTEED_DELIVERY      = 0x00000002,
1241     XP1_GUARANTEED_ORDER         = 0x00000004,
1242     XP1_MESSAGE_ORIENTED         = 0x00000008,
1243     XP1_PSEUDO_STREAM            = 0x00000010,
1244     XP1_GRACEFUL_CLOSE           = 0x00000020,
1245     XP1_EXPEDITED_DATA           = 0x00000040,
1246     XP1_CONNECT_DATA             = 0x00000080,
1247     XP1_DISCONNECT_DATA          = 0x00000100,
1248     XP1_SUPPORT_BROADCAST        = 0x00000200,
1249     XP1_SUPPORT_MULTIPOINT       = 0x00000400,
1250     XP1_MULTIPOINT_CONTROL_PLANE = 0x00000800,
1251     XP1_MULTIPOINT_DATA_PLANE    = 0x00001000,
1252     XP1_QOS_SUPPORTED            = 0x00002000,
1253     XP1_INTERRUPT                = 0x00004000,
1254     XP1_UNI_SEND                 = 0x00008000,
1255     XP1_UNI_RECV                 = 0x00010000,
1256     XP1_IFS_HANDLES              = 0x00020000,
1257     XP1_PARTIAL_MESSAGE          = 0x00040000;
1258
1259 enum : int {
1260     BIGENDIAN    = 0x0000,
1261     LITTLEENDIAN = 0x0001
1262 }
1263
1264 const SECURITY_PROTOCOL_NONE = 0x0000;
1265
1266 const JL_SENDER_ONLY = 0x01;
1267 const JL_RECEIVER_ONLY = 0x02;
1268 const JL_BOTH = 0x04;
1269
1270 const WSA_FLAG_OVERLAPPED = 0x01;
1271 const WSA_FLAG_MULTIPOINT_C_ROOT = 0x02;
1272 const WSA_FLAG_MULTIPOINT_C_LEAF = 0x04;
1273 const WSA_FLAG_MULTIPOINT_D_ROOT = 0x08;
1274 const WSA_FLAG_MULTIPOINT_D_LEAF = 0x10;
1275
1276 const int IOC_UNIX = 0x00000000;
1277 const int IOC_WS2 = 0x08000000;
1278 const int IOC_PROTOCOL = 0x10000000;
1279 const int IOC_VENDOR = 0x18000000;
1280
1281 template _WSAIO(int x, int y) { const int _WSAIO = IOC_VOID | x | y; }
1282 template _WSAIOR(int x, int y) { const int _WSAIOR = IOC_OUT | x | y; }
1283 template _WSAIOW(int x, int y) { const int _WSAIOW = IOC_IN | x | y; }
1284 template _WSAIORW(int x, int y) { const int _WSAIORW = IOC_INOUT | x | y; }
1285
1286 const int SIO_ASSOCIATE_HANDLE               = _WSAIOW!(IOC_WS2,1);
1287 const int SIO_ENABLE_CIRCULAR_QUEUEING       = _WSAIO!(IOC_WS2,2);
1288 const int SIO_FIND_ROUTE                     = _WSAIOR!(IOC_WS2,3);
1289 const int SIO_FLUSH                          = _WSAIO!(IOC_WS2,4);
1290 const int SIO_GET_BROADCAST_ADDRESS          = _WSAIOR!(IOC_WS2,5);
1291 const int SIO_GET_EXTENSION_FUNCTION_POINTER = _WSAIORW!(IOC_WS2,6);
1292 const int SIO_GET_QOS                        = _WSAIORW!(IOC_WS2,7);
1293 const int SIO_GET_GROUP_QOS                  = _WSAIORW!(IOC_WS2,8);
1294 const int SIO_MULTIPOINT_LOOPBACK            = _WSAIOW!(IOC_WS2,9);
1295 const int SIO_MULTICAST_SCOPE                = _WSAIOW!(IOC_WS2,10);
1296 const int SIO_SET_QOS                        = _WSAIOW!(IOC_WS2,11);
1297 const int SIO_SET_GROUP_QOS                  = _WSAIOW!(IOC_WS2,12);
1298 const int SIO_TRANSLATE_HANDLE               = _WSAIORW!(IOC_WS2,13);
1299 const int SIO_ROUTING_INTERFACE_QUERY        = _WSAIORW!(IOC_WS2,20);
1300 const int SIO_ROUTING_INTERFACE_CHANGE       = _WSAIOW!(IOC_WS2,21);
1301 const int SIO_ADDRESS_LIST_QUERY             = _WSAIOR!(IOC_WS2,22);
1302 const int SIO_ADDRESS_LIST_CHANGE            = _WSAIO!(IOC_WS2,23);
1303 const int SIO_QUERY_TARGET_PNP_HANDLE        = _WSAIOR!(IOC_WS2,24);
1304 const int SIO_NSP_NOTIFY_CHANGE              = _WSAIOW!(IOC_WS2,25);
1305
1306 const int TH_NETDEV = 1;
1307 const int TH_TAPI   = 2;
1308
1309
1310 extern(Windows) {
1311     SOCKET WSAAccept(SOCKET, SOCKADDR*, LPINT, LPCONDITIONPROC, DWORD);
1312     INT WSAAddressToStringA(LPSOCKADDR, DWORD, LPWSAPROTOCOL_INFOA, LPSTR, LPDWORD);
1313     INT WSAAddressToStringW(LPSOCKADDR, DWORD, LPWSAPROTOCOL_INFOW, LPWSTR, LPDWORD);
1314     BOOL WSACloseEvent(WSAEVENT);
1315     int WSAConnect(SOCKET, CPtr!(SOCKADDR), int, LPWSABUF, LPWSABUF, LPQOS, LPQOS);
1316     WSAEVENT WSACreateEvent();
1317     int WSADuplicateSocketA(SOCKET, DWORD, LPWSAPROTOCOL_INFOA);
1318     int WSADuplicateSocketW(SOCKET, DWORD, LPWSAPROTOCOL_INFOW);
1319     INT WSAEnumNameSpaceProvidersA(LPDWORD, LPWSANAMESPACE_INFOA);
1320     INT WSAEnumNameSpaceProvidersW(LPDWORD, LPWSANAMESPACE_INFOW);
1321     int WSAEnumNetworkEvents(SOCKET, WSAEVENT, LPWSANETWORKEVENTS);
1322     int WSAEnumProtocolsA(LPINT, LPWSAPROTOCOL_INFOA, LPDWORD);
1323     int WSAEnumProtocolsW(LPINT, LPWSAPROTOCOL_INFOW, LPDWORD);
1324     int WSAEventSelect(SOCKET, WSAEVENT, int);
1325     BOOL WSAGetOverlappedResult(SOCKET, LPWSAOVERLAPPED, LPDWORD, BOOL, LPDWORD);
1326     BOOL WSAGetQOSByName(SOCKET, LPWSABUF, LPQOS);
1327     INT WSAGetServiceClassInfoA(LPGUID, LPGUID, LPDWORD, LPWSASERVICECLASSINFOA);
1328     INT WSAGetServiceClassInfoW(LPGUID, LPGUID, LPDWORD, LPWSASERVICECLASSINFOW);
1329     INT WSAGetServiceClassNameByClassIdA(LPGUID, LPSTR, LPDWORD);
1330     INT WSAGetServiceClassNameByClassIdW(LPGUID, LPWSTR, LPDWORD);
1331     int WSAHtonl(SOCKET, uint, uint*);
1332     int WSAHtons(SOCKET, ushort, ushort*);
1333     INT WSAInstallServiceClassA(LPWSASERVICECLASSINFOA);
1334     INT WSAInstallServiceClassW(LPWSASERVICECLASSINFOW);
1335     int WSAIoctl(SOCKET, DWORD, LPVOID, DWORD, LPVOID, DWORD, LPDWORD, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE);
1336     SOCKET WSAJoinLeaf(SOCKET, CPtr!(SOCKADDR), int, LPWSABUF, LPWSABUF, LPQOS, LPQOS, DWORD);
1337     INT WSALookupServiceBeginA(LPWSAQUERYSETA, DWORD, LPHANDLE);
1338     INT WSALookupServiceBeginW(LPWSAQUERYSETW lpqsRestrictions, DWORD, LPHANDLE);
1339     INT WSALookupServiceNextA(HANDLE, DWORD, LPDWORD, LPWSAQUERYSETA);
1340     INT WSALookupServiceNextW(HANDLE, DWORD, LPDWORD, LPWSAQUERYSETW);
1341     INT WSALookupServiceEnd(HANDLE);
1342     int WSANSPIoctl(HANDLE,DWORD,LPVOID,DWORD,LPVOID,DWORD,LPDWORD,LPWSACOMPLETION); /* XP or .NET Server */
1343     int WSANtohl(SOCKET, uint, uint*);
1344     int WSANtohs(SOCKET, ushort, ushort*);
1345     int WSARecv(SOCKET, LPWSABUF, DWORD, LPDWORD, LPDWORD, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE);
1346     int WSARecvDisconnect(SOCKET, LPWSABUF);
1347     int WSARecvFrom(SOCKET, LPWSABUF, DWORD, LPDWORD, LPDWORD, SOCKADDR*, LPINT, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE);
1348     INT WSARemoveServiceClass(LPGUID);
1349     BOOL WSAResetEvent(WSAEVENT);
1350     int WSASend(SOCKET, LPWSABUF, DWORD, LPDWORD, DWORD, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE);
1351     int WSASendDisconnect(SOCKET, LPWSABUF);
1352     int WSASendTo(SOCKET, LPWSABUF, DWORD, LPDWORD, DWORD, CPtr!(SOCKADDR), int, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE);
1353     BOOL WSASetEvent(WSAEVENT);
1354     INT WSASetServiceA(LPWSAQUERYSETA, WSAESETSERVICEOP, DWORD); // NB: was declared with "WSAAPI" linkage
1355     INT WSASetServiceW(LPWSAQUERYSETW, WSAESETSERVICEOP, DWORD);
1356     SOCKET WSASocketA(int, int, int, LPWSAPROTOCOL_INFOA, GROUP, DWORD);
1357     SOCKET WSASocketW(int, int, int, LPWSAPROTOCOL_INFOW, GROUP, DWORD);
1358     INT WSAStringToAddressA(LPSTR, INT, LPWSAPROTOCOL_INFOA, LPSOCKADDR, LPINT);
1359     INT WSAStringToAddressW(LPWSTR, INT, LPWSAPROTOCOL_INFOW, LPSOCKADDR, LPINT);
1360     DWORD WSAWaitForMultipleEvents(DWORD, CPtr!(WSAEVENT), BOOL, DWORD, BOOL);
1361
1362     alias typeof(&WSAAccept) LPFN_WSAACCEPT;
1363     alias typeof(&WSAAddressToStringA) LPFN_WSAADDRESSTOSTRINGA;
1364     alias typeof(&WSAAddressToStringW) LPFN_WSAADDRESSTOSTRINGW;
1365     alias typeof(&WSACloseEvent) LPFN_WSACLOSEEVENT;
1366     alias typeof(&WSAConnect) LPFN_WSACONNECT;
1367     alias typeof(&WSACreateEvent) LPFN_WSACREATEEVENT;
1368     alias typeof(&WSADuplicateSocketA) LPFN_WSADUPLICATESOCKETA;
1369     alias typeof(&WSADuplicateSocketW) LPFN_WSADUPLICATESOCKETW;
1370     alias typeof(&WSAEnumNameSpaceProvidersA) LPFN_WSAENUMNAMESPACEPROVIDERSA;
1371     alias typeof(&WSAEnumNameSpaceProvidersW) LPFN_WSAENUMNAMESPACEPROVIDERSW;
1372     alias typeof(&WSAEnumNetworkEvents) LPFN_WSAENUMNETWORKEVENTS;
1373     alias typeof(&WSAEnumProtocolsA) LPFN_WSAENUMPROTOCOLSA;
1374     alias typeof(&WSAEnumProtocolsW) LPFN_WSAENUMPROTOCOLSW;
1375     alias typeof(&WSAEventSelect) LPFN_WSAEVENTSELECT;
1376     alias typeof(&WSAGetOverlappedResult) LPFN_WSAGETOVERLAPPEDRESULT;
1377     alias typeof(&WSAGetQOSByName) LPFN_WSAGETQOSBYNAME;
1378     alias typeof(&WSAGetServiceClassInfoA) LPFN_WSAGETSERVICECLASSINFOA;
1379     alias typeof(&WSAGetServiceClassInfoW) LPFN_WSAGETSERVICECLASSINFOW;
1380     alias typeof(&WSAGetServiceClassNameByClassIdA) LPFN_WSAGETSERVICECLASSNAMEBYCLASSIDA;
1381     alias typeof(&WSAGetServiceClassNameByClassIdW) LPFN_WSAGETSERVICECLASSNAMEBYCLASSIDW;
1382     alias typeof(&WSAHtonl) LPFN_WSAHTONL;
1383     alias typeof(&WSAHtons) LPFN_WSAHTONS;
1384     alias typeof(&WSAInstallServiceClassA) LPFN_WSAINSTALLSERVICECLASSA;
1385     alias typeof(&WSAInstallServiceClassW) LPFN_WSAINSTALLSERVICECLASSW;
1386     alias typeof(&WSAIoctl) LPFN_WSAIOCTL;
1387     alias typeof(&WSAJoinLeaf) LPFN_WSAJOINLEAF;
1388     alias typeof(&WSALookupServiceBeginA) LPFN_WSALOOKUPSERVICEBEGINA;
1389     alias typeof(&WSALookupServiceBeginW) LPFN_WSALOOKUPSERVICEBEGINW;
1390     alias typeof(&WSALookupServiceNextA) LPFN_WSALOOKUPSERVICENEXTA;
1391     alias typeof(&WSALookupServiceNextW) LPFN_WSALOOKUPSERVICENEXTW;
1392     alias typeof(&WSALookupServiceEnd) LPFN_WSALOOKUPSERVICEEND;
1393     alias typeof(&WSANSPIoctl) LPFN_WSANSPIoctl;
1394     alias typeof(&WSANtohl) LPFN_WSANTOHL;
1395     alias typeof(&WSANtohs) LPFN_WSANTOHS;
1396     alias typeof(&WSARecv) LPFN_WSARECV;
1397     alias typeof(&WSARecvDisconnect) LPFN_WSARECVDISCONNECT;
1398     alias typeof(&WSARecvFrom) LPFN_WSARECVFROM;
1399     alias typeof(&WSARemoveServiceClass) LPFN_WSAREMOVESERVICECLASS;
1400     alias typeof(&WSAResetEvent) LPFN_WSARESETEVENT;
1401     alias typeof(&WSASend) LPFN_WSASEND;
1402     alias typeof(&WSASendDisconnect) LPFN_WSASENDDISCONNECT;
1403     alias typeof(&WSASendTo) LPFN_WSASENDTO;
1404     alias typeof(&WSASetEvent) LPFN_WSASETEVENT;
1405     alias typeof(&WSASetServiceA) LPFN_WSASETSERVICEA;
1406     alias typeof(&WSASetServiceW) LPFN_WSASETSERVICEW;
1407     alias typeof(&WSASocketA) LPFN_WSASOCKETA;
1408     alias typeof(&WSASocketW) LPFN_WSASOCKETW;
1409     alias typeof(&WSAStringToAddressA) LPFN_WSASTRINGTOADDRESSA;
1410     alias typeof(&WSAStringToAddressW) LPFN_WSASTRINGTOADDRESSW;
1411     alias typeof(&WSAWaitForMultipleEvents) LPFN_WSAWAITFORMULTIPLEEVENTS;
1412 }
1413
1414 version(Unicode) {
1415     alias LPFN_WSAADDRESSTOSTRINGW LPFN_WSAADDRESSTOSTRING;
1416     alias LPFN_WSADUPLICATESOCKETW LPFN_WSADUPLICATESOCKET;
1417     alias LPFN_WSAENUMNAMESPACEPROVIDERSW LPFN_WSAENUMNAMESPACEPROVIDERS;
1418     alias LPFN_WSAENUMPROTOCOLSW LPFN_WSAENUMPROTOCOLS;
1419     alias LPFN_WSAGETSERVICECLASSINFOW LPFN_WSAGETSERVICECLASSINFO;
1420     alias LPFN_WSAGETSERVICECLASSNAMEBYCLASSIDW LPFN_WSAGETSERVICECLASSNAMEBYCLASSID;
1421     alias LPFN_WSAINSTALLSERVICECLASSW LPFN_WSAINSTALLSERVICECLASS;
1422     alias LPFN_WSALOOKUPSERVICEBEGINW LPFN_WSALOOKUPSERVICEBEGIN;
1423     alias LPFN_WSALOOKUPSERVICENEXTW LPFN_WSALOOKUPSERVICENEXT;
1424     alias LPFN_WSASETSERVICEW LPFN_WSASETSERVICE;
1425     alias LPFN_WSASOCKETW LPFN_WSASOCKET;
1426     alias LPFN_WSASTRINGTOADDRESSW LPFN_WSASTRINGTOADDRESS;
1427     alias WSAAddressToStringW WSAAddressToString;
1428     alias WSADuplicateSocketW WSADuplicateSocket;
1429     alias WSAEnumNameSpaceProvidersW WSAEnumNameSpaceProviders;
1430     alias WSAEnumProtocolsW WSAEnumProtocols;
1431     alias WSAGetServiceClassInfoW WSAGetServiceClassInfo;
1432     alias WSAGetServiceClassNameByClassIdW WSAGetServiceClassNameByClassId;
1433     alias WSASetServiceW WSASetService;
1434     alias WSASocketW WSASocket;
1435     alias WSAStringToAddressW WSAStringToAddress;
1436     alias WSALookupServiceBeginW WSALookupServiceBegin;
1437     alias WSALookupServiceNextW WSALookupServiceNext;
1438     alias WSAInstallServiceClassW WSAInstallServiceClass;
1439 } else {
1440     alias LPFN_WSAADDRESSTOSTRINGA LPFN_WSAADDRESSTOSTRING;
1441     alias LPFN_WSADUPLICATESOCKETW LPFN_WSADUPLICATESOCKET;
1442     alias LPFN_WSAENUMNAMESPACEPROVIDERSA LPFN_WSAENUMNAMESPACEPROVIDERS;
1443     alias LPFN_WSAENUMPROTOCOLSA LPFN_WSAENUMPROTOCOLS;
1444     alias LPFN_WSAGETSERVICECLASSINFOA LPFN_WSAGETSERVICECLASSINFO;
1445     alias LPFN_WSAGETSERVICECLASSNAMEBYCLASSIDA LPFN_WSAGETSERVICECLASSNAMEBYCLASSID;
1446     alias LPFN_WSAINSTALLSERVICECLASSA LPFN_WSAINSTALLSERVICECLASS;
1447     alias LPFN_WSALOOKUPSERVICEBEGINA LPFN_WSALOOKUPSERVICEBEGIN;
1448     alias LPFN_WSALOOKUPSERVICENEXTA LPFN_WSALOOKUPSERVICENEXT;
1449     alias LPFN_WSASETSERVICEA LPFN_WSASETSERVICE;
1450     alias LPFN_WSASOCKETA LPFN_WSASOCKET;
1451     alias LPFN_WSASTRINGTOADDRESSA LPFN_WSASTRINGTOADDRESS;
1452     alias WSAAddressToStringA WSAAddressToString;
1453     alias WSADuplicateSocketA WSADuplicateSocket;
1454     alias WSAEnumNameSpaceProvidersA WSAEnumNameSpaceProviders;
1455     alias WSAEnumProtocolsA WSAEnumProtocols;
1456     alias WSAGetServiceClassInfoA WSAGetServiceClassInfo;
1457     alias WSAGetServiceClassNameByClassIdA WSAGetServiceClassNameByClassId;
1458     alias WSAInstallServiceClassA WSAInstallServiceClass;
1459     alias WSALookupServiceBeginA WSALookupServiceBegin;
1460     alias WSALookupServiceNextA WSALookupServiceNext;
1461     alias WSASocketA WSASocket;
1462     alias WSAStringToAddressA WSAStringToAddress;
1463     alias WSASetServiceA WSASetService;
1464 }
Note: See TracBrowser for help on using the browser.