4e2933c620 2015-04-21 kinaba: /***********************************************************************\ 4e2933c620 2015-04-21 kinaba: * mswsock.d * 4e2933c620 2015-04-21 kinaba: * * 4e2933c620 2015-04-21 kinaba: * Windows API header module * 4e2933c620 2015-04-21 kinaba: * * 4e2933c620 2015-04-21 kinaba: * Translated from MinGW Windows headers * 4e2933c620 2015-04-21 kinaba: * by Daniel Keep * 4e2933c620 2015-04-21 kinaba: * * 4e2933c620 2015-04-21 kinaba: * Placed into public domain * 4e2933c620 2015-04-21 kinaba: \***********************************************************************/ 4e2933c620 2015-04-21 kinaba: module win32.mswsock; 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: import win32.winbase, win32.windef; 4e2933c620 2015-04-21 kinaba: private import win32.basetyps, win32.w32api; 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: // FIXME: clean up Windows version support 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: version (Win32_Winsock2) pragma(msg, 4e2933c620 2015-04-21 kinaba: "Version Win32_Winsock2 is deprecated; Winsock2 is now imported by default"); 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: // Pull in Winsock1 if the user has put "Win32_Winsock1" on the compile 4e2933c620 2015-04-21 kinaba: // line; otherwise, default to Winsock2. 4e2933c620 2015-04-21 kinaba: version (Win32_Winsock1) { 4e2933c620 2015-04-21 kinaba: import win32.winsock; 4e2933c620 2015-04-21 kinaba: } else { 4e2933c620 2015-04-21 kinaba: import win32.winsock2; 4e2933c620 2015-04-21 kinaba: } 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: static if (_WIN32_WINNT_ONLY) { 4e2933c620 2015-04-21 kinaba: static if (_WIN32_WINNT >= 0x500) { 4e2933c620 2015-04-21 kinaba: enum { 4e2933c620 2015-04-21 kinaba: /* WinNT5+: 4e2933c620 2015-04-21 kinaba: ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/socket_options.htm */ 4e2933c620 2015-04-21 kinaba: SO_MAXDG = 0x7009, 4e2933c620 2015-04-21 kinaba: SO_MAXPATHDG = 0x700A, 4e2933c620 2015-04-21 kinaba: } 4e2933c620 2015-04-21 kinaba: } 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: enum { 4e2933c620 2015-04-21 kinaba: /* WinNT4+: 4e2933c620 2015-04-21 kinaba: ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/socket_options_for_windows_nt_4_0_2.htm */ 4e2933c620 2015-04-21 kinaba: SO_CONNDATA = 0x7000, 4e2933c620 2015-04-21 kinaba: SO_CONNOPT = 0x7001, 4e2933c620 2015-04-21 kinaba: SO_DISCDATA = 0x7002, 4e2933c620 2015-04-21 kinaba: SO_DISCOPT = 0x7003, 4e2933c620 2015-04-21 kinaba: SO_CONNDATALEN = 0x7004, 4e2933c620 2015-04-21 kinaba: SO_CONNOPTLEN = 0x7005, 4e2933c620 2015-04-21 kinaba: SO_DISCDATALEN = 0x7006, 4e2933c620 2015-04-21 kinaba: SO_DISCOPTLEN = 0x7007, 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: /* WinNT4: 4e2933c620 2015-04-21 kinaba: ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/socket_options.htm */ 4e2933c620 2015-04-21 kinaba: SO_UPDATE_ACCEPT_CONTENT = 0x700B, 4e2933c620 2015-04-21 kinaba: } 4e2933c620 2015-04-21 kinaba: } 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: enum { 4e2933c620 2015-04-21 kinaba: /* Win95+, WinNT4+ but apparently shouldn't used: mark as deprecated? 4e2933c620 2015-04-21 kinaba: ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/socket_options.htm */ 4e2933c620 2015-04-21 kinaba: SO_OPENTYPE = 0x7008, 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: /* Win95+; these two are passed to the SO_OPENTYPE option as arguments, 4e2933c620 2015-04-21 kinaba: so would they be deprecated as well? 4e2933c620 2015-04-21 kinaba: ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/socket_options.htm */ 4e2933c620 2015-04-21 kinaba: SO_SYNCHRONOUS_ALERT = 0x0010, 4e2933c620 2015-04-21 kinaba: SO_SYNCHRONOUS_NONALERT = 0x0020, 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: /* Win95: 4e2933c620 2015-04-21 kinaba: ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/socket_options.htm */ 4e2933c620 2015-04-21 kinaba: SO_CONNECT_TIME = 0x700C, 4e2933c620 2015-04-21 kinaba: } 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: static if (_WIN32_WINNT_ONLY) { 4e2933c620 2015-04-21 kinaba: enum { 4e2933c620 2015-04-21 kinaba: TCP_BSDURGENT = 0x7000, 4e2933c620 2015-04-21 kinaba: } 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: /* These *appear* to be constants for passing to the TransmitFile / 4e2933c620 2015-04-21 kinaba: TransmitPackets functions, which are available in WinNT3.51+ 4e2933c620 2015-04-21 kinaba: ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/transmitfile_2.htm */ 4e2933c620 2015-04-21 kinaba: enum { 4e2933c620 2015-04-21 kinaba: TF_DISCONNECT = 1, 4e2933c620 2015-04-21 kinaba: TF_REUSE_SOCKET = 2, 4e2933c620 2015-04-21 kinaba: TF_WRITE_BEHIND = 4, 4e2933c620 2015-04-21 kinaba: TF_USE_DEFAULT_WORKER = 0, 4e2933c620 2015-04-21 kinaba: TF_USE_SYSTEM_THREAD = 16, 4e2933c620 2015-04-21 kinaba: TF_USE_KERNEL_APC = 32 4e2933c620 2015-04-21 kinaba: } 4e2933c620 2015-04-21 kinaba: } 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: /* Win95+, WinNT3.51+ 4e2933c620 2015-04-21 kinaba: ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/transmit_file_buffers_2.htm */ 4e2933c620 2015-04-21 kinaba: struct TRANSMIT_FILE_BUFFERS { 4e2933c620 2015-04-21 kinaba: PVOID Head; 4e2933c620 2015-04-21 kinaba: DWORD HeadLength; 4e2933c620 2015-04-21 kinaba: PVOID Tail; 4e2933c620 2015-04-21 kinaba: DWORD TailLength; 4e2933c620 2015-04-21 kinaba: } 4e2933c620 2015-04-21 kinaba: alias TRANSMIT_FILE_BUFFERS* PTRANSMIT_FILE_BUFFERS, LPTRANSMIT_FILE_BUFFERS; 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: extern(Windows) { 4e2933c620 2015-04-21 kinaba: /* Win95+, WinNT3.51+ 4e2933c620 2015-04-21 kinaba: ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/wsarecvex_2.htm */ 4e2933c620 2015-04-21 kinaba: int WSARecvEx(SOCKET, char*, int, int*); 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: /* Win95+, WinNT3.51+ 4e2933c620 2015-04-21 kinaba: ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/getacceptexSOCKADDRs_2.htm */ 4e2933c620 2015-04-21 kinaba: VOID GetAcceptExSockaddrs(PVOID, DWORD, DWORD, DWORD, SOCKADDR**, LPINT, SOCKADDR**, LPINT); 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: static if (_WIN32_WINNT_ONLY) { 4e2933c620 2015-04-21 kinaba: /* WinNT3.51+ 4e2933c620 2015-04-21 kinaba: ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/transmitfile_2.htm */ 4e2933c620 2015-04-21 kinaba: BOOL TransmitFile(SOCKET, HANDLE, DWORD, DWORD, LPOVERLAPPED, LPTRANSMIT_FILE_BUFFERS, DWORD); 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: /* WinNT3.51+ 4e2933c620 2015-04-21 kinaba: ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/acceptex_2.htm */ 4e2933c620 2015-04-21 kinaba: alias BOOL function(SOCKET, SOCKET, PVOID, DWORD, DWORD, DWORD, LPDWORD, LPOVERLAPPED) LPFN_ACCEPTEX; 4e2933c620 2015-04-21 kinaba: const GUID WSAID_ACCEPTEX = {0xb5367df1,0xcbac,0x11cf,[0x95,0xca,0x00,0x80,0x5f,0x48,0xa1,0x92]}; 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: alias BOOL function(SOCKET, SOCKADDR*, int, PVOID, DWORD, LPDWORD, LPOVERLAPPED) LPFN_CONNECTEX; 4e2933c620 2015-04-21 kinaba: const GUID WSAID_CONNECTEX = {0x25a207b9,0xddf3,0x4660,[0x8e,0xe9,0x76,0xe5,0x8c,0x74,0x06,0x3e]}; 4e2933c620 2015-04-21 kinaba: } 4e2933c620 2015-04-21 kinaba: } 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: version(Win32_Winsock1) { 4e2933c620 2015-04-21 kinaba: } else { 4e2933c620 2015-04-21 kinaba: static if (WINVER > 0x501) { 4e2933c620 2015-04-21 kinaba: /* These appear to be constants for the TRANSMIT_PACKETS_ELEMENT 4e2933c620 2015-04-21 kinaba: * structure below, so I've given them the same minimum version 4e2933c620 2015-04-21 kinaba: */ 4e2933c620 2015-04-21 kinaba: enum { 4e2933c620 2015-04-21 kinaba: TP_ELEMENT_FILE = 1, 4e2933c620 2015-04-21 kinaba: TP_ELEMENT_MEMORY = 2, 4e2933c620 2015-04-21 kinaba: TP_ELEMENT_EOP = 4 4e2933c620 2015-04-21 kinaba: } 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: /* WinXP+, Srv2k3+ 4e2933c620 2015-04-21 kinaba: * ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/transmit_packets_element_2.htm 4e2933c620 2015-04-21 kinaba: */ 4e2933c620 2015-04-21 kinaba: struct TRANSMIT_PACKETS_ELEMENT { 4e2933c620 2015-04-21 kinaba: ULONG dwElFlags; 4e2933c620 2015-04-21 kinaba: ULONG cLength; 4e2933c620 2015-04-21 kinaba: union { 4e2933c620 2015-04-21 kinaba: struct { 4e2933c620 2015-04-21 kinaba: LARGE_INTEGER nFileOffset; 4e2933c620 2015-04-21 kinaba: HANDLE hFile; 4e2933c620 2015-04-21 kinaba: } 4e2933c620 2015-04-21 kinaba: PVOID pBuffer; 4e2933c620 2015-04-21 kinaba: } 4e2933c620 2015-04-21 kinaba: } 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: /* WinXP+, Server2003+: 4e2933c620 2015-04-21 kinaba: * ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/wsamsg_2.htm 4e2933c620 2015-04-21 kinaba: */ 4e2933c620 2015-04-21 kinaba: struct WSAMSG { 4e2933c620 2015-04-21 kinaba: LPSOCKADDR name; 4e2933c620 2015-04-21 kinaba: INT namelen; 4e2933c620 2015-04-21 kinaba: LPWSABUF lpBuffers; 4e2933c620 2015-04-21 kinaba: DWORD dwBufferCount; 4e2933c620 2015-04-21 kinaba: WSABUF Control; 4e2933c620 2015-04-21 kinaba: DWORD dwFlags; 4e2933c620 2015-04-21 kinaba: } 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: alias WSAMSG* PWSAMSG, LPWSAMSG; 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: /* According to MSDN docs, the WSAMSG.Control buffer starts with a 4e2933c620 2015-04-21 kinaba: cmsghdr header of the following form. See also RFC 2292. */ 4e2933c620 2015-04-21 kinaba: /* DK: Confirmed. So I suppose these should get the same version as 4e2933c620 2015-04-21 kinaba: WSAMSG... */ 4e2933c620 2015-04-21 kinaba: struct WSACMSGHDR { 4e2933c620 2015-04-21 kinaba: UINT cmsg_len; 4e2933c620 2015-04-21 kinaba: INT cmsg_level; 4e2933c620 2015-04-21 kinaba: INT cmsg_type; 4e2933c620 2015-04-21 kinaba: // followed by UCHAR cmsg_data[]; 4e2933c620 2015-04-21 kinaba: } 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: /* TODO: Standard Posix.1g macros as per RFC 2292, with WSA_uglification. */ 4e2933c620 2015-04-21 kinaba: /* DK: MinGW doesn't define these, and neither does the MSDN docs. Might have 4e2933c620 2015-04-21 kinaba: to actually look up RFC 2292... */ 4e2933c620 2015-04-21 kinaba: /+ 4e2933c620 2015-04-21 kinaba: #if 0 4e2933c620 2015-04-21 kinaba: #define WSA_CMSG_FIRSTHDR(mhdr) 4e2933c620 2015-04-21 kinaba: #define WSA_CMSG_NXTHDR(mhdr, cmsg) 4e2933c620 2015-04-21 kinaba: #define WSA_CMSG_SPACE(length) 4e2933c620 2015-04-21 kinaba: #define WSA_CMSG_LEN(length) 4e2933c620 2015-04-21 kinaba: #endif 4e2933c620 2015-04-21 kinaba: +/ 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: extern(Windows) 4e2933c620 2015-04-21 kinaba: { 4e2933c620 2015-04-21 kinaba: /* WinXP+, Srv2k3+ 4e2933c620 2015-04-21 kinaba: * ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/disconnectex_2.htm 4e2933c620 2015-04-21 kinaba: */ 4e2933c620 2015-04-21 kinaba: BOOL DisconnectEx(SOCKET, LPOVERLAPPED, DWORD, DWORD); 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: /* WinXP+, Srv2k3+ 4e2933c620 2015-04-21 kinaba: * ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/wsarecvmsg_2.htm 4e2933c620 2015-04-21 kinaba: */ 4e2933c620 2015-04-21 kinaba: int WSARecvMsg(SOCKET, LPWSAMSG, LPDWORD, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE); 4e2933c620 2015-04-21 kinaba: } 4e2933c620 2015-04-21 kinaba: } 4e2933c620 2015-04-21 kinaba: }