xref: /netbsd-src/external/gpl3/gcc/dist/libphobos/libdruntime/core/sys/windows/mswsock.d (revision 0a3071956a3a9fdebdbf7f338cf2d439b45fc728)
1 /**
2  * Windows API header module
3  *
4  * Translated from MinGW Windows headers
5  *
6  * Authors: Daniel Keep
7  * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost License 1.0)
8  * Source: $(DRUNTIMESRC core/sys/windows/_mswsock.d)
9  */
10 module core.sys.windows.mswsock;
11 version (Windows):
12 @system:
13 
14 import core.sys.windows.winbase, core.sys.windows.windef;
15 import core.sys.windows.basetyps, core.sys.windows.w32api;
16 
17 import core.sys.windows.winsock2;
18 
19 //static if (_WIN32_WINNT >= 0x500) {
20     enum {
21         /* WinNT5+:
22            ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/socket_options.htm */
23         SO_MAXDG             = 0x7009,
24         SO_MAXPATHDG         = 0x700A,
25     }
26 //}
27 
28 enum {
29     /* WinNT4+:
30        ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/socket_options_for_windows_nt_4_0_2.htm */
31     SO_CONNDATA              = 0x7000,
32     SO_CONNOPT               = 0x7001,
33     SO_DISCDATA              = 0x7002,
34     SO_DISCOPT               = 0x7003,
35     SO_CONNDATALEN           = 0x7004,
36     SO_CONNOPTLEN            = 0x7005,
37     SO_DISCDATALEN           = 0x7006,
38     SO_DISCOPTLEN            = 0x7007,
39 
40     /* WinNT4:
41        ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/socket_options.htm */
42     SO_UPDATE_ACCEPT_CONTENT = 0x700B,
43 }
44 
45 enum {
46     /* Win95+, WinNT4+ but apparently shouldn't used: mark as deprecated?
47        ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/socket_options.htm */
48     SO_OPENTYPE                  = 0x7008,
49 
50     /* Win95+; these two are passed to the SO_OPENTYPE option as arguments,
51        so would they be deprecated as well?
52        ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/socket_options.htm */
53     SO_SYNCHRONOUS_ALERT         = 0x0010,
54     SO_SYNCHRONOUS_NONALERT      = 0x0020,
55 
56     /* Win95:
57        ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/socket_options.htm */
58     SO_CONNECT_TIME              = 0x700C,
59 }
60 
61 
62 enum {
63     TCP_BSDURGENT = 0x7000,
64 }
65 
66 /* These *appear* to be constants for passing to the TransmitFile /
67    TransmitPackets functions, which are available in WinNT3.51+
68    ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/transmitfile_2.htm */
69 enum {
70     TF_DISCONNECT         = 1,
71     TF_REUSE_SOCKET       = 2,
72     TF_WRITE_BEHIND       = 4,
73     TF_USE_DEFAULT_WORKER = 0,
74     TF_USE_SYSTEM_THREAD  = 16,
75     TF_USE_KERNEL_APC     = 32
76 }
77 
78 /* Win95+, WinNT3.51+
79    ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/transmit_file_buffers_2.htm */
80 struct TRANSMIT_FILE_BUFFERS {
81     PVOID Head;
82     DWORD HeadLength;
83     PVOID Tail;
84     DWORD TailLength;
85 }
86 alias TRANSMIT_FILE_BUFFERS* PTRANSMIT_FILE_BUFFERS, LPTRANSMIT_FILE_BUFFERS;
87 
88 extern(Windows) {
89     /* Win95+, WinNT3.51+
90        ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/wsarecvex_2.htm */
91     int WSARecvEx(SOCKET, char*, int, int*);
92 
93     /* Win95+, WinNT3.51+
94        ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/getacceptexSOCKADDRs_2.htm */
95     VOID GetAcceptExSockaddrs(PVOID, DWORD, DWORD, DWORD, SOCKADDR**, LPINT, SOCKADDR**, LPINT);
96 
97     /* WinNT3.51+
98        ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/transmitfile_2.htm */
99     BOOL TransmitFile(SOCKET, HANDLE, DWORD, DWORD, LPOVERLAPPED, LPTRANSMIT_FILE_BUFFERS, DWORD);
100 
101     /* WinNT3.51+
102        ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/acceptex_2.htm */
103     alias BOOL function(SOCKET, SOCKET, PVOID, DWORD, DWORD, DWORD, LPDWORD, LPOVERLAPPED) LPFN_ACCEPTEX;
104     const GUID WSAID_ACCEPTEX = {0xb5367df1,0xcbac,0x11cf,[0x95,0xca,0x00,0x80,0x5f,0x48,0xa1,0x92]};
105 
106     alias BOOL function(SOCKET, SOCKADDR*, int, PVOID, DWORD, LPDWORD, LPOVERLAPPED) LPFN_CONNECTEX;
107     const GUID WSAID_CONNECTEX = {0x25a207b9,0xddf3,0x4660,[0x8e,0xe9,0x76,0xe5,0x8c,0x74,0x06,0x3e]};
108 }
109 
110 static if (_WIN32_WINNT >= 0x501) {
111     /*  These appear to be constants for the TRANSMIT_PACKETS_ELEMENT
112      *  structure below, so I've given them the same minimum version
113      */
114     enum {
115         TP_ELEMENT_FILE   = 1,
116         TP_ELEMENT_MEMORY = 2,
117         TP_ELEMENT_EOP    = 4
118     }
119 
120     /*  WinXP+, Srv2k3+
121      *  ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/transmit_packets_element_2.htm
122      */
123     struct TRANSMIT_PACKETS_ELEMENT {
124         ULONG dwElFlags;
125         ULONG cLength;
126         union {
127             struct {
128                 LARGE_INTEGER nFileOffset;
129                 HANDLE        hFile;
130             }
131             PVOID pBuffer;
132         }
133     }
134 
135     struct WSABUF {
136         ULONG len;
137         CHAR* buf;
138     }
139 
140     alias WSABUF* LPWSABUF;
141 
142     /*  WinXP+, Server2003+:
143      *  ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/wsamsg_2.htm
144      */
145     struct WSAMSG {
146         LPSOCKADDR name;
147         INT        namelen;
148         LPWSABUF   lpBuffers;
149         DWORD      dwBufferCount;
150         WSABUF     Control;
151         DWORD      dwFlags;
152     }
153 
154     alias WSAMSG* PWSAMSG, LPWSAMSG;
155 
156     /* According to MSDN docs, the WSAMSG.Control buffer starts with a
157        cmsghdr header of the following form.  See also RFC 2292. */
158     /* DK: Confirmed.  So I suppose these should get the same version as
159        WSAMSG... */
160     struct WSACMSGHDR {
161         SIZE_T cmsg_len;
162         INT  cmsg_level;
163         INT  cmsg_type;
164         // followed by UCHAR cmsg_data[];
165     }
166 }
167 
168 static if (_WIN32_WINNT >= 0x600) {
169     /* TODO: Standard Posix.1g macros as per RFC 2292, with WSA_uglification. */
170     /* DK: MinGW doesn't define these, and neither does the MSDN docs.  Might have
171        to actually look up RFC 2292... */
172     /+
173     #if 0
174     #define WSA_CMSG_FIRSTHDR(mhdr)
175     #define WSA_CMSG_NXTHDR(mhdr, cmsg)
176     #define WSA_CMSG_SPACE(length)
177     #define WSA_CMSG_LEN(length)
178     #endif
179     +/
180 
181     /*  Win Vista+, Srv2k3+
182      *  ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/disconnectex_2.htm
183      */
184     extern(Windows) BOOL DisconnectEx(SOCKET, LPOVERLAPPED, DWORD, DWORD);
185 }
186 
187 static if (_WIN32_WINNT >= 0x501) {
188     /*  WinXP+, Srv2k3+
189      *  ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/wsarecvmsg_2.htm
190      */
191     extern(Windows) int WSARecvMsg(SOCKET, LPWSAMSG, LPDWORD, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE);
192 }
193