1use ctypes::c_int;
8use shared::guiddef::LPGUID;
9use shared::minwindef::{DWORD, INT, LPHANDLE, ULONG};
10use shared::mstcpip::{
11 SOCKET_PEER_TARGET_NAME, SOCKET_SECURITY_QUERY_INFO, SOCKET_SECURITY_QUERY_TEMPLATE,
12 SOCKET_SECURITY_SETTINGS,
13};
14use shared::winerror::{
15 WSAEAFNOSUPPORT, WSAEINVAL, WSAESOCKTNOSUPPORT, WSAHOST_NOT_FOUND, WSANO_RECOVERY,
16 WSATRY_AGAIN, WSATYPE_NOT_FOUND, WSA_IPSEC_NAME_POLICY_ERROR, WSA_SECURE_HOST_NOT_FOUND,
17};
18use shared::ws2def::{
19 ADDRINFOA, ADDRINFOEXA, ADDRINFOEXW, ADDRINFOW, PADDRINFOA, PADDRINFOEXA, PADDRINFOEXW,
20 PADDRINFOW, SOCKADDR, SOCKET_ADDRESS,
21};
22use shared::wtypesbase::LPBLOB;
23use um::minwinbase::LPOVERLAPPED;
24use um::winnt::{PCHAR, PCSTR, PCWSTR, PSTR, PVOID, PWCHAR, PWSTR, VOID};
25use um::winsock2::{
26 LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE, SOCKET, WSA_NOT_ENOUGH_MEMORY, timeval,
27};
28use vc::vcruntime::size_t;
29pub const UDP_NOCHECKSUM: c_int = 1;
30pub const UDP_CHECKSUM_COVERAGE: c_int = 20;
31pub const EAI_AGAIN: DWORD = WSATRY_AGAIN;
32pub const EAI_BADFLAGS: DWORD = WSAEINVAL;
33pub const EAI_FAIL: DWORD = WSANO_RECOVERY;
34pub const EAI_FAMILY: DWORD = WSAEAFNOSUPPORT;
35pub const EAI_MEMORY: DWORD = WSA_NOT_ENOUGH_MEMORY as u32;
36pub const EAI_NOSECURENAME: DWORD = WSA_SECURE_HOST_NOT_FOUND;
37pub const EAI_NONAME: DWORD = WSAHOST_NOT_FOUND;
38pub const EAI_SERVICE: DWORD = WSATYPE_NOT_FOUND;
39pub const EAI_SOCKTYPE: DWORD = WSAESOCKTNOSUPPORT;
40pub const EAI_IPSECPOLICY: DWORD = WSA_IPSEC_NAME_POLICY_ERROR;
41pub const EAI_NODATA: DWORD = EAI_NONAME;
42pub type ADDRINFO = ADDRINFOA;
43pub type LPADDRINFO = *mut ADDRINFOA;
44extern "system" {
45 pub fn getaddrinfo(
46 pNodeName: PCSTR,
47 pServiceName: PCSTR,
48 pHints: *const ADDRINFOA,
49 ppResult: *mut PADDRINFOA,
50 ) -> INT;
51 pub fn GetAddrInfoW(
52 pNodeName: PCWSTR,
53 pServiceName: PCWSTR,
54 pHints: *const ADDRINFOW,
55 ppResult: *mut PADDRINFOW,
56 ) -> INT;
57}
58FN!{stdcall LPFN_GETADDRINFO(
59 pNodeName: PCSTR,
60 pServiceName: PCSTR,
61 pHints: *const ADDRINFOA,
62 ppResult: *mut PADDRINFOA,
63) -> INT}
64FN!{stdcall LPFN_GETADDRINFOW(
65 pNodeName: PCWSTR,
66 pServiceName: PCWSTR,
67 pHints: *const ADDRINFOW,
68 ppResult: *mut PADDRINFOW,
69) -> INT}
70FN!{stdcall LPLOOKUPSERVICE_COMPLETION_ROUTINE(
71 dwError: DWORD,
72 dwBytes: DWORD,
73 lpOverlapped: LPWSAOVERLAPPED,
74) -> ()}
75extern "system" {
76 pub fn GetAddrInfoExA(
77 pName: PCSTR,
78 pServiceName: PCSTR,
79 dwNameSpace: DWORD,
80 lpNspId: LPGUID,
81 hints: *const ADDRINFOEXA,
82 ppResult: *mut PADDRINFOEXA,
83 timeout: *mut timeval,
84 lpOverlapped: LPOVERLAPPED,
85 lpCompletionRoutine: LPLOOKUPSERVICE_COMPLETION_ROUTINE,
86 lpNameHandle: LPHANDLE,
87 ) -> INT;
88 pub fn GetAddrInfoExW(
89 pName: PCWSTR,
90 pServiceName: PCWSTR,
91 dwNameSpace: DWORD,
92 lpNspId: LPGUID,
93 hints: *const ADDRINFOEXW,
94 ppResult: *mut PADDRINFOEXW,
95 timeout: *mut timeval,
96 lpOverlapped: LPOVERLAPPED,
97 lpCompletionRoutine: LPLOOKUPSERVICE_COMPLETION_ROUTINE,
98 lpNameHandle: LPHANDLE,
99 ) -> INT;
100 pub fn GetAddrInfoExCancel(
101 lpHandle: LPHANDLE,
102 ) -> INT;
103 pub fn GetAddrInfoExOverlappedResult(
104 lpOverlapped: LPOVERLAPPED,
105 ) -> INT;
106}
107FN!{stdcall LPFN_GETADDRINFOEXA(
108 pName: PCSTR,
109 pServiceName: PCSTR,
110 dwNameSpace: DWORD,
111 lpNspId: LPGUID,
112 hints: *const ADDRINFOEXA,
113 ppResult: *mut PADDRINFOEXA,
114 timeout: *mut timeval,
115 lpOverlapped: LPOVERLAPPED,
116 lpCompletionRoutine: LPLOOKUPSERVICE_COMPLETION_ROUTINE,
117 lpNameHandle: LPHANDLE,
118) -> INT}
119FN!{stdcall LPFN_GETADDRINFOEXW(
120 pName: PCWSTR,
121 pServiceName: PCWSTR,
122 dwNameSpace: DWORD,
123 lpNspId: LPGUID,
124 hints: *const ADDRINFOEXW,
125 ppResult: *mut PADDRINFOEXW,
126 timeout: *mut timeval,
127 lpOverlapped: LPOVERLAPPED,
128 lpCompletionRoutine: LPLOOKUPSERVICE_COMPLETION_ROUTINE,
129 lpNameHandle: LPHANDLE,
130) -> INT}
131FN!{stdcall LPFN_GETADDRINFOEXCANCEL(
132 lpHandle: LPHANDLE,
133) -> INT}
134FN!{stdcall LPFN_GETADDRINFOEXOVERLAPPEDRESULT(
135 lpOverlapped: LPOVERLAPPED,
136) -> INT}
137extern "system" {
138 pub fn SetAddrInfoExA(
139 pName: PCSTR,
140 pServiceName: PCSTR,
141 pAddresses: *mut SOCKET_ADDRESS,
142 dwAddressCount: DWORD,
143 lpBlob: LPBLOB,
144 dwFlags: DWORD,
145 dwNameSpace: DWORD,
146 lpNspId: LPGUID,
147 timeout: *mut timeval,
148 lpOverlapped: LPOVERLAPPED,
149 lpCompletionRoutine: LPLOOKUPSERVICE_COMPLETION_ROUTINE,
150 lpNameHandle: LPHANDLE,
151 ) -> INT;
152 pub fn SetAddrInfoExW(
153 pName: PCWSTR,
154 pServiceName: PCWSTR,
155 pAddresses: *mut SOCKET_ADDRESS,
156 dwAddressCount: DWORD,
157 lpBlob: LPBLOB,
158 dwFlags: DWORD,
159 dwNameSpace: DWORD,
160 lpNspId: LPGUID,
161 timeout: *mut timeval,
162 lpOverlapped: LPOVERLAPPED,
163 lpCompletionRoutine: LPLOOKUPSERVICE_COMPLETION_ROUTINE,
164 lpNameHandle: LPHANDLE,
165 ) -> INT;
166}
167FN!{stdcall LPFN_SETADDRINFOEXA(
168 pName: PCSTR,
169 pServiceName: PCSTR,
170 pAddresses: *mut SOCKET_ADDRESS,
171 dwAddressCount: DWORD,
172 lpBlob: LPBLOB,
173 dwFlags: DWORD,
174 dwNameSpace: DWORD,
175 lpNspId: LPGUID,
176 timeout: *mut timeval,
177 lpOverlapped: LPOVERLAPPED,
178 lpCompletionRoutine: LPLOOKUPSERVICE_COMPLETION_ROUTINE,
179 lpNameHandle: LPHANDLE,
180) -> INT}
181FN!{stdcall LPFN_SETADDRINFOEXW(
182 pName: PCWSTR,
183 pServiceName: PCWSTR,
184 pAddresses: *mut SOCKET_ADDRESS,
185 dwAddressCount: DWORD,
186 lpBlob: LPBLOB,
187 dwFlags: DWORD,
188 dwNameSpace: DWORD,
189 lpNspId: LPGUID,
190 timeout: *mut timeval,
191 lpOverlapped: LPOVERLAPPED,
192 lpCompletionRoutine: LPLOOKUPSERVICE_COMPLETION_ROUTINE,
193 lpNameHandle: LPHANDLE,
194) -> INT}
195extern "system" {
196 pub fn freeaddrinfo(
197 pAddrInfo: PADDRINFOA,
198 );
199 pub fn FreeAddrInfoW(
200 pAddrInfo: PADDRINFOW,
201 );
202}
203FN!{stdcall LPFN_FREEADDRINFO(
204 pAddrInfo: PADDRINFOA,
205) -> ()}
206FN!{stdcall LPFN_FREEADDRINFOW(
207 pAddrInfo: PADDRINFOW,
208) -> ()}
209extern "system" {
210 pub fn FreeAddrInfoEx(
211 pAddrInfoEx: PADDRINFOEXA,
212 );
213 pub fn FreeAddrInfoExW(
214 pAddrInfoEx: PADDRINFOEXW,
215 );
216}
217FN!{stdcall LPFN_FREEADDRINFOEXA(
218 pAddrInfoEx: PADDRINFOEXA,
219) -> ()}
220FN!{stdcall LPFN_FREEADDRINFOEXW(
221 pAddrInfoEx: PADDRINFOEXW,
222) -> ()}
223pub type socklen_t = c_int;
224extern "system" {
225 pub fn getnameinfo(
226 pSockaddr: *const SOCKADDR,
227 SockaddrLength: socklen_t,
228 pNodeBuffer: PCHAR,
229 NodeBufferSize: DWORD,
230 pServiceBuffer: PCHAR,
231 ServiceBufferSize: DWORD,
232 Flags: INT,
233 ) -> INT;
234 pub fn GetNameInfoW(
235 pSockaddr: *const SOCKADDR,
236 SockaddrLength: socklen_t,
237 pNodeBuffer: PWCHAR,
238 NodeBufferSize: DWORD,
239 pServiceBuffer: PWCHAR,
240 ServiceBufferSize: DWORD,
241 Flags: INT,
242 ) -> INT;
243}
244FN!{stdcall LPFN_GETNAMEINFO(
245 pSockaddr: *const SOCKADDR,
246 SockaddrLength: socklen_t,
247 pNodeBuffer: PCHAR,
248 NodeBufferSize: DWORD,
249 pServiceBuffer: PCHAR,
250 ServiceBufferSize: DWORD,
251 Flags: INT,
252) -> c_int}
253FN!{stdcall LPFN_GETNAMEINFOW(
254 pSockaddr: *const SOCKADDR,
255 SockaddrLength: socklen_t,
256 pNodeBuffer: PWCHAR,
257 NodeBufferSize: DWORD,
258 pServiceBuffer: PWCHAR,
259 ServiceBufferSize: DWORD,
260 Flags: INT,
261) -> INT}
262extern "system" {
263 pub fn inet_pton(
264 Family: INT,
265 pszAddrString: PCSTR,
266 pAddrBuf: PVOID,
267 ) -> INT;
268 pub fn InetPtonW(
269 Family: INT,
270 pszAddrString: PCWSTR,
271 pAddrBuf: PVOID,
272 ) -> INT;
273 pub fn inet_ntop(
274 Family: INT,
275 pAddr: *const VOID,
276 pStringBuf: PSTR,
277 StringBufSize: size_t,
278 ) -> PCSTR;
279 pub fn InetNtopW(
280 Family: INT,
281 pAddr: *const VOID,
282 pStringBuf: PWSTR,
283 StringBufSize: size_t,
284 ) -> PCWSTR;
285}
286FN!{stdcall LPFN_INET_PTONA(
287 Family: INT,
288 pszAddrString: PCSTR,
289 pAddrBuf: PVOID,
290) -> INT}
291FN!{stdcall LPFN_INET_PTONW(
292 Family: INT,
293 pszAddrString: PCWSTR,
294 pAddrBuf: PVOID,
295) -> INT}
296FN!{stdcall LPFN_INET_NTOPA(
297 Family: INT,
298 pAddr: *const VOID,
299 pStringBuf: PSTR,
300 StringBufSize: size_t,
301) -> PCSTR}
302FN!{stdcall LPFN_INET_NTOPW(
303 Family: INT,
304 pAddr: *const VOID,
305 pStringBuf: PWSTR,
306 StringBufSize: size_t,
307) -> PCWSTR}
308pub const GAI_STRERROR_BUFFER_SIZE: usize = 1024;
309extern "system" {
310 pub fn WSASetSocketSecurity(
311 Socket: SOCKET,
312 SecuritySettings: *const SOCKET_SECURITY_SETTINGS,
313 SecuritySettingsLen: ULONG,
314 Overlapped: LPWSAOVERLAPPED,
315 CompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE,
316 ) -> INT;
317 pub fn WSAQuerySocketSecurity(
318 Socket: SOCKET,
319 SecurityQueryTemplate: *const SOCKET_SECURITY_QUERY_TEMPLATE,
320 SecurityQueryTemplateLen: ULONG,
321 SecurityQueryInfo: *mut SOCKET_SECURITY_QUERY_INFO,
322 SecurityQueryInfoLen: *mut ULONG,
323 Overlapped: LPWSAOVERLAPPED,
324 CompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE,
325 ) -> INT;
326 pub fn WSASetSocketPeerTargetName(
327 Socket: SOCKET,
328 PeerTargetName: *const SOCKET_PEER_TARGET_NAME,
329 PeerTargetNameLen: ULONG,
330 Overlapped: LPWSAOVERLAPPED,
331 CompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE,
332 ) -> INT;
333 pub fn WSADeleteSocketPeerTargetName(
334 Socket: SOCKET,
335 PeerAddr: *const SOCKADDR,
336 PeerAddrLen: ULONG,
337 Overlapped: LPWSAOVERLAPPED,
338 CompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE,
339 ) -> INT;
340 pub fn WSAImpersonateSocketPeer(
341 Socket: SOCKET,
342 PeerAddr: *const SOCKADDR,
343 PeerAddrLen: ULONG,
344 ) -> INT;
345 pub fn WSARevertImpersonation();
346}