// Licensed under the Apache License, Version 2.0 // or the MIT license // , 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(); }