blob: 4867c74a2f9c79548660f3eb6d56bb189d9d987a [file] [log] [blame]
// Licensed under the Apache License, Version 2.0
// <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
// All files in the project carrying such notice may not be copied, modified, or distributed
// except according to those terms
//! WinSock2 Extension for TCP/IP protocols
use ctypes::c_int;
use shared::guiddef::LPGUID;
use shared::minwindef::{DWORD, INT, LPHANDLE, ULONG};
use shared::mstcpip::{
SOCKET_PEER_TARGET_NAME, SOCKET_SECURITY_QUERY_INFO, SOCKET_SECURITY_QUERY_TEMPLATE,
SOCKET_SECURITY_SETTINGS,
};
use shared::winerror::{
WSAEAFNOSUPPORT, WSAEINVAL, WSAESOCKTNOSUPPORT, WSAHOST_NOT_FOUND, WSANO_RECOVERY,
WSATRY_AGAIN, WSATYPE_NOT_FOUND, WSA_IPSEC_NAME_POLICY_ERROR, WSA_SECURE_HOST_NOT_FOUND,
};
use shared::ws2def::{
ADDRINFOA, ADDRINFOEXA, ADDRINFOEXW, ADDRINFOW, PADDRINFOA, PADDRINFOEXA, PADDRINFOEXW,
PADDRINFOW, SOCKADDR, SOCKET_ADDRESS,
};
use shared::wtypesbase::LPBLOB;
use um::minwinbase::LPOVERLAPPED;
use um::winnt::{PCHAR, PCSTR, PCWSTR, PSTR, PVOID, PWCHAR, PWSTR, VOID};
use um::winsock2::{
LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE, SOCKET, WSA_NOT_ENOUGH_MEMORY, timeval,
};
use vc::vcruntime::size_t;
pub const UDP_NOCHECKSUM: c_int = 1;
pub const UDP_CHECKSUM_COVERAGE: c_int = 20;
pub const EAI_AGAIN: DWORD = WSATRY_AGAIN;
pub const EAI_BADFLAGS: DWORD = WSAEINVAL;
pub const EAI_FAIL: DWORD = WSANO_RECOVERY;
pub const EAI_FAMILY: DWORD = WSAEAFNOSUPPORT;
pub const EAI_MEMORY: DWORD = WSA_NOT_ENOUGH_MEMORY as u32;
pub const EAI_NOSECURENAME: DWORD = WSA_SECURE_HOST_NOT_FOUND;
pub const EAI_NONAME: DWORD = WSAHOST_NOT_FOUND;
pub const EAI_SERVICE: DWORD = WSATYPE_NOT_FOUND;
pub const EAI_SOCKTYPE: DWORD = WSAESOCKTNOSUPPORT;
pub const EAI_IPSECPOLICY: DWORD = WSA_IPSEC_NAME_POLICY_ERROR;
pub const EAI_NODATA: DWORD = EAI_NONAME;
pub type ADDRINFO = ADDRINFOA;
pub type LPADDRINFO = *mut ADDRINFOA;
extern "system" {
pub fn getaddrinfo(
pNodeName: PCSTR,
pServiceName: PCSTR,
pHints: *const ADDRINFOA,
ppResult: *mut PADDRINFOA,
) -> INT;
pub fn GetAddrInfoW(
pNodeName: PCWSTR,
pServiceName: PCWSTR,
pHints: *const ADDRINFOW,
ppResult: *mut PADDRINFOW,
) -> INT;
}
FN!{stdcall LPFN_GETADDRINFO(
pNodeName: PCSTR,
pServiceName: PCSTR,
pHints: *const ADDRINFOA,
ppResult: *mut PADDRINFOA,
) -> INT}
FN!{stdcall LPFN_GETADDRINFOW(
pNodeName: PCWSTR,
pServiceName: PCWSTR,
pHints: *const ADDRINFOW,
ppResult: *mut PADDRINFOW,
) -> INT}
FN!{stdcall LPLOOKUPSERVICE_COMPLETION_ROUTINE(
dwError: DWORD,
dwBytes: DWORD,
lpOverlapped: LPWSAOVERLAPPED,
) -> ()}
extern "system" {
pub fn GetAddrInfoExA(
pName: PCSTR,
pServiceName: PCSTR,
dwNameSpace: DWORD,
lpNspId: LPGUID,
hints: *const ADDRINFOEXA,
ppResult: *mut PADDRINFOEXA,
timeout: *mut timeval,
lpOverlapped: LPOVERLAPPED,
lpCompletionRoutine: LPLOOKUPSERVICE_COMPLETION_ROUTINE,
lpNameHandle: LPHANDLE,
) -> INT;
pub fn GetAddrInfoExW(
pName: PCWSTR,
pServiceName: PCWSTR,
dwNameSpace: DWORD,
lpNspId: LPGUID,
hints: *const ADDRINFOEXW,
ppResult: *mut PADDRINFOEXW,
timeout: *mut timeval,
lpOverlapped: LPOVERLAPPED,
lpCompletionRoutine: LPLOOKUPSERVICE_COMPLETION_ROUTINE,
lpNameHandle: LPHANDLE,
) -> INT;
pub fn GetAddrInfoExCancel(
lpHandle: LPHANDLE,
) -> INT;
pub fn GetAddrInfoExOverlappedResult(
lpOverlapped: LPOVERLAPPED,
) -> INT;
}
FN!{stdcall LPFN_GETADDRINFOEXA(
pName: PCSTR,
pServiceName: PCSTR,
dwNameSpace: DWORD,
lpNspId: LPGUID,
hints: *const ADDRINFOEXA,
ppResult: *mut PADDRINFOEXA,
timeout: *mut timeval,
lpOverlapped: LPOVERLAPPED,
lpCompletionRoutine: LPLOOKUPSERVICE_COMPLETION_ROUTINE,
lpNameHandle: LPHANDLE,
) -> INT}
FN!{stdcall LPFN_GETADDRINFOEXW(
pName: PCWSTR,
pServiceName: PCWSTR,
dwNameSpace: DWORD,
lpNspId: LPGUID,
hints: *const ADDRINFOEXW,
ppResult: *mut PADDRINFOEXW,
timeout: *mut timeval,
lpOverlapped: LPOVERLAPPED,
lpCompletionRoutine: LPLOOKUPSERVICE_COMPLETION_ROUTINE,
lpNameHandle: LPHANDLE,
) -> INT}
FN!{stdcall LPFN_GETADDRINFOEXCANCEL(
lpHandle: LPHANDLE,
) -> INT}
FN!{stdcall LPFN_GETADDRINFOEXOVERLAPPEDRESULT(
lpOverlapped: LPOVERLAPPED,
) -> INT}
extern "system" {
pub fn SetAddrInfoExA(
pName: PCSTR,
pServiceName: PCSTR,
pAddresses: *mut SOCKET_ADDRESS,
dwAddressCount: DWORD,
lpBlob: LPBLOB,
dwFlags: DWORD,
dwNameSpace: DWORD,
lpNspId: LPGUID,
timeout: *mut timeval,
lpOverlapped: LPOVERLAPPED,
lpCompletionRoutine: LPLOOKUPSERVICE_COMPLETION_ROUTINE,
lpNameHandle: LPHANDLE,
) -> INT;
pub fn SetAddrInfoExW(
pName: PCWSTR,
pServiceName: PCWSTR,
pAddresses: *mut SOCKET_ADDRESS,
dwAddressCount: DWORD,
lpBlob: LPBLOB,
dwFlags: DWORD,
dwNameSpace: DWORD,
lpNspId: LPGUID,
timeout: *mut timeval,
lpOverlapped: LPOVERLAPPED,
lpCompletionRoutine: LPLOOKUPSERVICE_COMPLETION_ROUTINE,
lpNameHandle: LPHANDLE,
) -> INT;
}
FN!{stdcall LPFN_SETADDRINFOEXA(
pName: PCSTR,
pServiceName: PCSTR,
pAddresses: *mut SOCKET_ADDRESS,
dwAddressCount: DWORD,
lpBlob: LPBLOB,
dwFlags: DWORD,
dwNameSpace: DWORD,
lpNspId: LPGUID,
timeout: *mut timeval,
lpOverlapped: LPOVERLAPPED,
lpCompletionRoutine: LPLOOKUPSERVICE_COMPLETION_ROUTINE,
lpNameHandle: LPHANDLE,
) -> INT}
FN!{stdcall LPFN_SETADDRINFOEXW(
pName: PCWSTR,
pServiceName: PCWSTR,
pAddresses: *mut SOCKET_ADDRESS,
dwAddressCount: DWORD,
lpBlob: LPBLOB,
dwFlags: DWORD,
dwNameSpace: DWORD,
lpNspId: LPGUID,
timeout: *mut timeval,
lpOverlapped: LPOVERLAPPED,
lpCompletionRoutine: LPLOOKUPSERVICE_COMPLETION_ROUTINE,
lpNameHandle: LPHANDLE,
) -> INT}
extern "system" {
pub fn freeaddrinfo(
pAddrInfo: PADDRINFOA,
);
pub fn FreeAddrInfoW(
pAddrInfo: PADDRINFOW,
);
}
FN!{stdcall LPFN_FREEADDRINFO(
pAddrInfo: PADDRINFOA,
) -> ()}
FN!{stdcall LPFN_FREEADDRINFOW(
pAddrInfo: PADDRINFOW,
) -> ()}
extern "system" {
pub fn FreeAddrInfoEx(
pAddrInfoEx: PADDRINFOEXA,
);
pub fn FreeAddrInfoExW(
pAddrInfoEx: PADDRINFOEXW,
);
}
FN!{stdcall LPFN_FREEADDRINFOEXA(
pAddrInfoEx: PADDRINFOEXA,
) -> ()}
FN!{stdcall LPFN_FREEADDRINFOEXW(
pAddrInfoEx: PADDRINFOEXW,
) -> ()}
pub type socklen_t = c_int;
extern "system" {
pub fn getnameinfo(
pSockaddr: *const SOCKADDR,
SockaddrLength: socklen_t,
pNodeBuffer: PCHAR,
NodeBufferSize: DWORD,
pServiceBuffer: PCHAR,
ServiceBufferSize: DWORD,
Flags: INT,
) -> INT;
pub fn GetNameInfoW(
pSockaddr: *const SOCKADDR,
SockaddrLength: socklen_t,
pNodeBuffer: PWCHAR,
NodeBufferSize: DWORD,
pServiceBuffer: PWCHAR,
ServiceBufferSize: DWORD,
Flags: INT,
) -> INT;
}
FN!{stdcall LPFN_GETNAMEINFO(
pSockaddr: *const SOCKADDR,
SockaddrLength: socklen_t,
pNodeBuffer: PCHAR,
NodeBufferSize: DWORD,
pServiceBuffer: PCHAR,
ServiceBufferSize: DWORD,
Flags: INT,
) -> c_int}
FN!{stdcall LPFN_GETNAMEINFOW(
pSockaddr: *const SOCKADDR,
SockaddrLength: socklen_t,
pNodeBuffer: PWCHAR,
NodeBufferSize: DWORD,
pServiceBuffer: PWCHAR,
ServiceBufferSize: DWORD,
Flags: INT,
) -> INT}
extern "system" {
pub fn inet_pton(
Family: INT,
pszAddrString: PCSTR,
pAddrBuf: PVOID,
) -> INT;
pub fn InetPtonW(
Family: INT,
pszAddrString: PCWSTR,
pAddrBuf: PVOID,
) -> INT;
pub fn inet_ntop(
Family: INT,
pAddr: *const VOID,
pStringBuf: PSTR,
StringBufSize: size_t,
) -> PCSTR;
pub fn InetNtopW(
Family: INT,
pAddr: *const VOID,
pStringBuf: PWSTR,
StringBufSize: size_t,
) -> PCWSTR;
}
FN!{stdcall LPFN_INET_PTONA(
Family: INT,
pszAddrString: PCSTR,
pAddrBuf: PVOID,
) -> INT}
FN!{stdcall LPFN_INET_PTONW(
Family: INT,
pszAddrString: PCWSTR,
pAddrBuf: PVOID,
) -> INT}
FN!{stdcall LPFN_INET_NTOPA(
Family: INT,
pAddr: *const VOID,
pStringBuf: PSTR,
StringBufSize: size_t,
) -> PCSTR}
FN!{stdcall LPFN_INET_NTOPW(
Family: INT,
pAddr: *const VOID,
pStringBuf: PWSTR,
StringBufSize: size_t,
) -> PCWSTR}
pub const GAI_STRERROR_BUFFER_SIZE: usize = 1024;
extern "system" {
pub fn WSASetSocketSecurity(
Socket: SOCKET,
SecuritySettings: *const SOCKET_SECURITY_SETTINGS,
SecuritySettingsLen: ULONG,
Overlapped: LPWSAOVERLAPPED,
CompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE,
) -> INT;
pub fn WSAQuerySocketSecurity(
Socket: SOCKET,
SecurityQueryTemplate: *const SOCKET_SECURITY_QUERY_TEMPLATE,
SecurityQueryTemplateLen: ULONG,
SecurityQueryInfo: *mut SOCKET_SECURITY_QUERY_INFO,
SecurityQueryInfoLen: *mut ULONG,
Overlapped: LPWSAOVERLAPPED,
CompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE,
) -> INT;
pub fn WSASetSocketPeerTargetName(
Socket: SOCKET,
PeerTargetName: *const SOCKET_PEER_TARGET_NAME,
PeerTargetNameLen: ULONG,
Overlapped: LPWSAOVERLAPPED,
CompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE,
) -> INT;
pub fn WSADeleteSocketPeerTargetName(
Socket: SOCKET,
PeerAddr: *const SOCKADDR,
PeerAddrLen: ULONG,
Overlapped: LPWSAOVERLAPPED,
CompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE,
) -> INT;
pub fn WSAImpersonateSocketPeer(
Socket: SOCKET,
PeerAddr: *const SOCKADDR,
PeerAddrLen: ULONG,
) -> INT;
pub fn WSARevertImpersonation();
}