From ce425b9ce573509920dff8bdf3bd96a9bab9d1de Mon Sep 17 00:00:00 2001 From: Eugene Wissner Date: Thu, 14 Sep 2017 07:31:26 +0200 Subject: [PATCH] Move simple socket definitions to sys.windows --- source/tanya/async/event/iocp.d | 14 +- source/tanya/async/iocp.d | 2 +- source/tanya/network/socket.d | 387 ++++++++++++---------------- source/tanya/sys/windows/def.d | 39 +++ source/tanya/sys/windows/error.d | 114 ++++++++ source/tanya/sys/windows/package.d | 19 ++ source/tanya/sys/windows/winsock2.d | 102 ++++++++ 7 files changed, 444 insertions(+), 233 deletions(-) create mode 100644 source/tanya/sys/windows/def.d create mode 100644 source/tanya/sys/windows/error.d create mode 100644 source/tanya/sys/windows/package.d create mode 100644 source/tanya/sys/windows/winsock2.d diff --git a/source/tanya/async/event/iocp.d b/source/tanya/async/event/iocp.d index 826d6dd..e682ab9 100644 --- a/source/tanya/async/event/iocp.d +++ b/source/tanya/async/event/iocp.d @@ -27,10 +27,8 @@ import tanya.async.watcher; import tanya.memory; import tanya.memory.mmappool; import tanya.network.socket; -import core.sys.windows.basetyps; import core.sys.windows.mswsock; import core.sys.windows.winbase; -import core.sys.windows.windef; import core.sys.windows.winsock2; /** @@ -185,7 +183,7 @@ final class IOCPLoop : Loop { super(); - completionPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0); + completionPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE, null, 0, 0); if (!completionPort) { throw make!BadLoopException(defaultAllocator, @@ -215,7 +213,7 @@ final class IOCPLoop : Loop if (CreateIoCompletionPort(cast(HANDLE) socket.handle, completionPort, - cast(ULONG_PTR) (cast(void*) watcher), + cast(size_t) (cast(void*) watcher), 0) !is completionPort) { return false; @@ -241,7 +239,7 @@ final class IOCPLoop : Loop if (CreateIoCompletionPort(cast(HANDLE) transport.socket.handle, completionPort, - cast(ULONG_PTR) (cast(void*) watcher), + cast(size_t) (cast(void*) watcher), 0) !is completionPort) { return false; @@ -286,7 +284,7 @@ final class IOCPLoop : Loop override protected void poll() @nogc { DWORD lpNumberOfBytes; - ULONG_PTR key; + size_t key; LPOVERLAPPED overlap; immutable timeout = cast(immutable int) blockTime.total!"msecs"; @@ -295,7 +293,7 @@ final class IOCPLoop : Loop &key, &overlap, timeout); - if (result == FALSE && overlap == NULL) + if (result == FALSE && overlap is null) { return; // Timeout } @@ -388,4 +386,4 @@ final class IOCPLoop : Loop assert(false, "Unknown event"); } } -} +} \ No newline at end of file diff --git a/source/tanya/async/iocp.d b/source/tanya/async/iocp.d index 47a01f6..afe16ef 100644 --- a/source/tanya/async/iocp.d +++ b/source/tanya/async/iocp.d @@ -54,4 +54,4 @@ class State /// For keeping events or event masks. int event; -} +} \ No newline at end of file diff --git a/source/tanya/network/socket.d b/source/tanya/network/socket.d index 0d9ba75..eb193be 100644 --- a/source/tanya/network/socket.d +++ b/source/tanya/network/socket.d @@ -44,12 +44,55 @@ version (Posix) } else version (Windows) { + import core.sys.windows.basetyps : GUID; + import core.sys.windows.mswsock : WSAID_ACCEPTEX; + import core.sys.windows.winbase : LPOVERLAPPED, + GetModuleHandle, + GetProcAddress, + GetOverlappedResult, + ERROR_IO_PENDING, + ERROR_IO_INCOMPLETE; + import core.sys.windows.winsock2 : sockaddr, + freeaddrinfo, + getaddrinfo, + SD_RECEIVE, + SD_SEND, + SD_BOTH, + MSG_OOB, + MSG_PEEK, + MSG_DONTROUTE, + socklen_t, + SOCKADDR, + SOCKADDR_STORAGE, + LPWSAOVERLAPPED_COMPLETION_ROUTINE, + addrinfo, + sockaddr_in, + sockaddr_in6, + shutdown, + closesocket, + listen, + socket, + bind, + accept, + WSAGetLastError, + recv, + send, + getsockopt, + setsockopt, + ioctlsocket, + FIONBIO, + SOL_SOCKET, + SO_TYPE; import tanya.async.iocp; - import core.sys.windows.basetyps; - import core.sys.windows.mswsock; - import core.sys.windows.winbase; - import core.sys.windows.windef; - import core.sys.windows.winsock2; + import tanya.sys.windows.error : EWOULDBLOCK = WSAEWOULDBLOCK, + ECONNABORTED = WSAECONNABORTED, + ENOBUFS = WSAENOBUFS, + EOPNOTSUPP = WSAEOPNOTSUPP, + EPROTONOSUPPORT = WSAEPROTONOSUPPORT, + EPROTOTYPE = WSAEPROTOTYPE, + ETIMEDOUT = WSAETIMEDOUT, + ESOCKTNOSUPPORT = WSAESOCKTNOSUPPORT; + public import tanya.sys.windows.winsock2; enum SocketType : size_t { @@ -58,71 +101,6 @@ else version (Windows) private alias LingerField = ushort; - enum : uint - { - IOC_UNIX = 0x00000000, - IOC_WS2 = 0x08000000, - IOC_PROTOCOL = 0x10000000, - IOC_VOID = 0x20000000, // No parameters. - IOC_OUT = 0x40000000, // Copy parameters back. - IOC_IN = 0x80000000, // Copy parameters into. - IOC_VENDOR = 0x18000000, - IOC_INOUT = (IOC_IN | IOC_OUT), // Copy parameter into and get back. - } - - template _WSAIO(int x, int y) - { - enum _WSAIO = IOC_VOID | x | y; - } - template _WSAIOR(int x, int y) - { - enum _WSAIOR = IOC_OUT | x | y; - } - template _WSAIOW(int x, int y) - { - enum _WSAIOW = IOC_IN | x | y; - } - template _WSAIORW(int x, int y) - { - enum _WSAIORW = IOC_INOUT | x | y; - } - - alias SIO_ASSOCIATE_HANDLE = _WSAIOW!(IOC_WS2, 1); - alias SIO_ENABLE_CIRCULAR_QUEUEING = _WSAIO!(IOC_WS2, 2); - alias SIO_FIND_ROUTE = _WSAIOR!(IOC_WS2, 3); - alias SIO_FLUSH = _WSAIO!(IOC_WS2, 4); - alias SIO_GET_BROADCAST_ADDRESS = _WSAIOR!(IOC_WS2, 5); - alias SIO_GET_EXTENSION_FUNCTION_POINTER = _WSAIORW!(IOC_WS2, 6); - alias SIO_GET_QOS = _WSAIORW!(IOC_WS2, 7); - alias SIO_GET_GROUP_QOS = _WSAIORW!(IOC_WS2, 8); - alias SIO_MULTIPOINT_LOOPBACK = _WSAIOW!(IOC_WS2, 9); - alias SIO_MULTICAST_SCOPE = _WSAIOW!(IOC_WS2, 10); - alias SIO_SET_QOS = _WSAIOW!(IOC_WS2, 11); - alias SIO_SET_GROUP_QOS = _WSAIOW!(IOC_WS2, 12); - alias SIO_TRANSLATE_HANDLE = _WSAIORW!(IOC_WS2, 13); - alias SIO_ROUTING_INTERFACE_QUERY = _WSAIORW!(IOC_WS2, 20); - alias SIO_ROUTING_INTERFACE_CHANGE = _WSAIOW!(IOC_WS2, 21); - alias SIO_ADDRESS_LIST_QUERY = _WSAIOR!(IOC_WS2, 22); - alias SIO_ADDRESS_LIST_CHANGE = _WSAIO!(IOC_WS2, 23); - alias SIO_QUERY_TARGET_PNP_HANDLE = _WSAIOR!(IOC_WS2, 24); - alias SIO_NSP_NOTIFY_CHANGE = _WSAIOW!(IOC_WS2, 25); - - private alias GROUP = uint; - - enum - { - WSA_FLAG_OVERLAPPED = 0x01, - MAX_PROTOCOL_CHAIN = 7, - WSAPROTOCOL_LEN = 255, - } - - struct WSAPROTOCOLCHAIN - { - int ChainLen; - DWORD[MAX_PROTOCOL_CHAIN] ChainEntries; - } - alias LPWSAPROTOCOLCHAIN = WSAPROTOCOLCHAIN*; - struct WSAPROTOCOL_INFO { DWORD dwServiceFlags1; @@ -157,16 +135,16 @@ else version (Windows) GROUP g, DWORD dwFlags); int WSARecv(SOCKET s, - LPWSABUF lpBuffers, + WSABUF* lpBuffers, DWORD dwBufferCount, - LPDWORD lpNumberOfBytesRecvd, - LPDWORD lpFlags, + DWORD* lpNumberOfBytesRecvd, + DWORD* lpFlags, LPOVERLAPPED lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine); int WSASend(SOCKET s, - LPWSABUF lpBuffers, + WSABUF* lpBuffers, DWORD dwBufferCount, - LPDWORD lpNumberOfBytesRecvd, + DWORD* lpNumberOfBytesRecvd, DWORD lpFlags, LPOVERLAPPED lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine); @@ -181,39 +159,32 @@ else version (Windows) LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine); alias LPFN_ACCEPTEX = BOOL function(SOCKET, SOCKET, - PVOID, + void*, DWORD, DWORD, DWORD, - LPDWORD, + DWORD*, LPOVERLAPPED); } alias WSASocket = WSASocketW; - alias LPFN_GETACCEPTEXSOCKADDRS = VOID function(PVOID, + alias LPFN_GETACCEPTEXSOCKADDRS = void function(void*, DWORD, DWORD, DWORD, SOCKADDR**, - LPINT, + INT*, SOCKADDR**, - LPINT); + INT*); const GUID WSAID_GETACCEPTEXSOCKADDRS = { 0xb5367df2, 0xcbac, 0x11cf, [ 0x95, 0xca, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92 ], }; - struct WSABUF - { - ULONG len; - CHAR* buf; - } - alias WSABUF* LPWSABUF; - struct WSAOVERLAPPED { - ULONG_PTR Internal; - ULONG_PTR InternalHigh; + size_t Internal; + size_t InternalHigh; union { struct @@ -221,7 +192,7 @@ else version (Windows) DWORD Offset; DWORD OffsetHigh; } - PVOID Pointer; + void* Pointer; } HANDLE hEvent; } @@ -241,13 +212,38 @@ else version (Windows) private WSABUF buffer; } + /** + * Socket returned if a connection has been established. + * + * Note: Available only on Windows. + */ class OverlappedConnectedSocket : ConnectedSocket { + /** + * Create a socket. + * + * Params: + * handle = Socket handle. + * af = Address family. + */ this(SocketType handle, AddressFamily af) @nogc { super(handle, af); } + /** + * Begins to asynchronously receive data from a connected socket. + * + * Params: + * buffer = Storage location for the received data. + * flags = Flags. + * overlapped = Unique operation identifier. + * + * Returns: $(D_KEYWORD true) if the operation could be finished synchronously. + * $(D_KEYWORD false) otherwise. + * + * Throws: $(D_PSYMBOL SocketException) if unable to receive. + */ bool beginReceive(ubyte[] buffer, SocketState overlapped, Flags flags = Flags(Flag.none)) @nogc @trusted @@ -262,10 +258,10 @@ else version (Windows) auto result = WSARecv(handle_, &overlapped.buffer, 1u, - NULL, + null, &receiveFlags, &overlapped.overlapped, - NULL); + null); if (result == socketError && !wouldHaveBlocked) { @@ -274,6 +270,18 @@ else version (Windows) return result == 0; } + /** + * Ends a pending asynchronous read. + * + * Params: + * overlapped = Unique operation identifier. + * + * Returns: Number of bytes received. + * + * Throws: $(D_PSYMBOL SocketException) if unable to receive. + * + * Postcondition: $(D_INLINECODE result >= 0). + */ int endReceive(SocketState overlapped) @nogc @trusted out (count) { @@ -298,6 +306,19 @@ else version (Windows) return lpNumber; } + /** + * Sends data asynchronously to a connected socket. + * + * Params: + * buffer = Data to be sent. + * flags = Flags. + * overlapped = Unique operation identifier. + * + * Returns: $(D_KEYWORD true) if the operation could be finished synchronously. + * $(D_KEYWORD false) otherwise. + * + * Throws: $(D_PSYMBOL SocketException) if unable to send. + */ bool beginSend(ubyte[] buffer, SocketState overlapped, Flags flags = Flags(Flag.none)) @nogc @trusted @@ -310,10 +331,10 @@ else version (Windows) auto result = WSASend(handle_, &overlapped.buffer, 1u, - NULL, + null, cast(DWORD) flags, &overlapped.overlapped, - NULL); + null); if (result == socketError && !wouldHaveBlocked) { @@ -323,6 +344,18 @@ else version (Windows) return result == 0; } + /** + * Ends a pending asynchronous send. + * + * Params: + * overlapped = Unique operation identifier. + * + * Returns: Number of bytes sent. + * + * Throws: $(D_PSYMBOL SocketException) if unable to receive. + * + * Postcondition: $(D_INLINECODE result >= 0). + */ int endSend(SocketState overlapped) @nogc @trusted out (count) { @@ -344,11 +377,22 @@ else version (Windows) } } + /** + * Windows stream socket overlapped I/O. + */ class OverlappedStreamSocket : StreamSocket { // Accept extension function pointer. package LPFN_ACCEPTEX acceptExtension; + /** + * Create a socket. + * + * Params: + * af = Address family. + * + * Throws: $(D_PSYMBOL SocketException) on errors. + */ this(AddressFamily af) @nogc @trusted { super(af); @@ -368,8 +412,8 @@ else version (Windows) &acceptExtension, acceptExtension.sizeof, &dwBytes, - NULL, - NULL); + null, + null); if (!result == socketError) { throw make!SocketException(defaultAllocator, @@ -377,6 +421,17 @@ else version (Windows) } } + /** + * Begins an asynchronous operation to accept an incoming connection attempt. + * + * Params: + * overlapped = Unique operation identifier. + * + * Returns: $(D_KEYWORD true) if the operation could be finished synchronously. + * $(D_KEYWORD false) otherwise. + * + * Throws: $(D_PSYMBOL SocketException) on accept errors. + */ bool beginAccept(SocketState overlapped) @nogc @trusted { auto socket = cast(SocketType) socket(addressFamily, 1, 0); @@ -412,6 +467,17 @@ else version (Windows) return result == TRUE; } + /** + * Asynchronously accepts an incoming connection attempt and creates a + * new socket to handle remote host communication. + * + * Params: + * overlapped = Unique operation identifier. + * + * Returns: Connected socket. + * + * Throws: $(D_PSYMBOL SocketException) if unable to accept. + */ OverlappedConnectedSocket endAccept(SocketState overlapped) @nogc @trusted { @@ -433,133 +499,6 @@ else version (Windows) } } } -else version (D_Ddoc) -{ - /// Native socket representation type. - enum SocketType; - - /** - * Socket returned if a connection has been established. - * - * Note: Available only on Windows. - */ - class OverlappedConnectedSocket : ConnectedSocket - { - /** - * Create a socket. - * - * Params: - * handle = Socket handle. - * af = Address family. - */ - this(SocketType handle, AddressFamily af) @nogc; - - /** - * Begins to asynchronously receive data from a connected socket. - * - * Params: - * buffer = Storage location for the received data. - * flags = Flags. - * overlapped = Unique operation identifier. - * - * Returns: $(D_KEYWORD true) if the operation could be finished synchronously. - * $(D_KEYWORD false) otherwise. - * - * Throws: $(D_PSYMBOL SocketException) if unable to receive. - */ - bool beginReceive(ubyte[] buffer, - SocketState overlapped, - Flags flags = Flags(Flag.none)) @nogc @trusted; - - /** - * Ends a pending asynchronous read. - * - * Params: - * overlapped = Unique operation identifier. - * - * Returns: Number of bytes received. - * - * Throws: $(D_PSYMBOL SocketException) if unable to receive. - * - * Postcondition: $(D_INLINECODE result >= 0). - */ - int endReceive(SocketState overlapped) @nogc @trusted; - - /** - * Sends data asynchronously to a connected socket. - * - * Params: - * buffer = Data to be sent. - * flags = Flags. - * overlapped = Unique operation identifier. - * - * Returns: $(D_KEYWORD true) if the operation could be finished synchronously. - * $(D_KEYWORD false) otherwise. - * - * Throws: $(D_PSYMBOL SocketException) if unable to send. - */ - bool beginSend(ubyte[] buffer, - SocketState overlapped, - Flags flags = Flags(Flag.none)) @nogc @trusted; - - /** - * Ends a pending asynchronous send. - * - * Params: - * overlapped = Unique operation identifier. - * - * Returns: Number of bytes sent. - * - * Throws: $(D_PSYMBOL SocketException) if unable to receive. - * - * Postcondition: $(D_INLINECODE result >= 0). - */ - int endSend(SocketState overlapped) @nogc @trusted; - } - - /** - * Windows stream socket overlapped I/O. - */ - class OverlappedStreamSocket : StreamSocket - { - /** - * Create a socket. - * - * Params: - * af = Address family. - * - * Throws: $(D_PSYMBOL SocketException) on errors. - */ - this(AddressFamily af) @nogc @trusted; - - /** - * Begins an asynchronous operation to accept an incoming connection attempt. - * - * Params: - * overlapped = Unique operation identifier. - * - * Returns: $(D_KEYWORD true) if the operation could be finished synchronously. - * $(D_KEYWORD false) otherwise. - * - * Throws: $(D_PSYMBOL SocketException) on accept errors. - */ - bool beginAccept(SocketState overlapped) @nogc @trusted; - - /** - * Asynchronously accepts an incoming connection attempt and creates a - * new socket to handle remote host communication. - * - * Params: - * overlapped = Unique operation identifier. - * - * Returns: Connected socket. - * - * Throws: $(D_PSYMBOL SocketException) if unable to accept. - */ - OverlappedConnectedSocket endAccept(SocketState overlapped) - @nogc @trusted; - } -} /** * Socket option that specifies what should happen when the socket that @@ -1624,4 +1563,4 @@ private @property int lastError() nothrow @safe @nogc { return errno; } -} +} \ No newline at end of file diff --git a/source/tanya/sys/windows/def.d b/source/tanya/sys/windows/def.d new file mode 100644 index 0000000..6b0634e --- /dev/null +++ b/source/tanya/sys/windows/def.d @@ -0,0 +1,39 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * Copyright: Eugene Wissner 2017. + * License: $(LINK2 https://www.mozilla.org/en-US/MPL/2.0/, + * Mozilla Public License, v. 2.0). + * Authors: $(LINK2 mailto:info@caraus.de, Eugene Wissner) + * Source: $(LINK2 https://github.com/caraus-ecms/tanya/blob/master/source/tanya/sys/windows/def.d, + * tanya/sys/windows/def.d) + */ +module tanya.sys.windows.def; + +version (Windows): + +alias BYTE = ubyte; +alias TBYTE = wchar; // If Unicode, otherwise char. +alias CHAR = char; // Signed or unsigned char. +alias TCHAR = wchar; // If Unicode, otherwise char. +alias SHORT = short; +alias USHORT = ushort; +alias WORD = ushort; +alias INT = int; +alias UINT = uint; +alias LONG = int; +alias ULONG = uint; +alias DWORD = uint; +alias LONGLONG = long; // Or double. +alias ULONGLONG = ulong; // Or double. +alias DWORDLONG = ulong; +alias FLOAT = float; +alias BOOL = int; +alias BOOLEAN = BYTE; + +alias HANDLE = void*; + +enum TRUE = 1; +enum FALSE = 0; \ No newline at end of file diff --git a/source/tanya/sys/windows/error.d b/source/tanya/sys/windows/error.d new file mode 100644 index 0000000..0b8c9e9 --- /dev/null +++ b/source/tanya/sys/windows/error.d @@ -0,0 +1,114 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * Copyright: Eugene Wissner 2017. + * License: $(LINK2 https://www.mozilla.org/en-US/MPL/2.0/, + * Mozilla Public License, v. 2.0). + * Authors: $(LINK2 mailto:info@caraus.de, Eugene Wissner) + * Source: $(LINK2 https://github.com/caraus-ecms/tanya/blob/master/source/tanya/sys/windows/error.d, + * tanya/sys/windows/error.d) + */ +module tanya.sys.windows.error; + +version (Windows): + +private enum WSABASEERR = 10000; +enum +{ + WSAEINTR = WSABASEERR + 4, + WSAEBADF = WSABASEERR + 9, + WSAEACCES = WSABASEERR + 13, + WSAEFAULT = WSABASEERR + 14, + WSAEINVAL = WSABASEERR + 22, + WSAEMFILE = WSABASEERR + 24, + + WSAEWOULDBLOCK = WSABASEERR + 35, + WSAEINPROGRESS = WSABASEERR + 36, + WSAEALREADY = WSABASEERR + 37, + WSAENOTSOCK = WSABASEERR + 38, + WSAEDESTADDRREQ = WSABASEERR + 39, + WSAEMSGSIZE = WSABASEERR + 40, + WSAEPROTOTYPE = WSABASEERR + 41, + WSAENOPROTOOPT = WSABASEERR + 42, + WSAEPROTONOSUPPORT = WSABASEERR + 43, + WSAESOCKTNOSUPPORT = WSABASEERR + 44, + WSAEOPNOTSUPP = WSABASEERR + 45, + WSAEPFNOSUPPORT = WSABASEERR + 46, + WSAEAFNOSUPPORT = WSABASEERR + 47, + WSAEADDRINUSE = WSABASEERR + 48, + WSAEADDRNOTAVAIL = WSABASEERR + 49, + WSAENETDOWN = WSABASEERR + 50, + WSAENETUNREACH = WSABASEERR + 51, + WSAENETRESET = WSABASEERR + 52, + WSAECONNABORTED = WSABASEERR + 53, + WSAECONNRESET = WSABASEERR + 54, + WSAENOBUFS = WSABASEERR + 55, + WSAEISCONN = WSABASEERR + 56, + WSAENOTCONN = WSABASEERR + 57, + WSAESHUTDOWN = WSABASEERR + 58, + WSAETOOMANYREFS = WSABASEERR + 59, + WSAETIMEDOUT = WSABASEERR + 60, + WSAECONNREFUSED = WSABASEERR + 61, + WSAELOOP = WSABASEERR + 62, + WSAENAMETOOLONG = WSABASEERR + 63, + WSAEHOSTDOWN = WSABASEERR + 64, + WSAEHOSTUNREACH = WSABASEERR + 65, + WSAENOTEMPTY = WSABASEERR + 66, + WSAEPROCLIM = WSABASEERR + 67, + WSAEUSERS = WSABASEERR + 68, + WSAEDQUOT = WSABASEERR + 69, + WSAESTALE = WSABASEERR + 70, + WSAEREMOTE = WSABASEERR + 71, + + WSASYSNOTREADY = WSABASEERR + 91, + WSAVERNOTSUPPORTED = WSABASEERR + 92, + WSANOTINITIALISED = WSABASEERR + 93, + WSAEDISCON = WSABASEERR + 101, + WSAENOMORE = WSABASEERR + 102, + WSAECANCELLED = WSABASEERR + 103, + WSAEINVALIDPROCTABLE = WSABASEERR + 104, + WSAEINVALIDPROVIDER = WSABASEERR + 105, + WSAEPROVIDERFAILEDINIT = WSABASEERR + 106, + WSASYSCALLFAILURE = WSABASEERR + 107, + WSASERVICE_NOT_FOUND = WSABASEERR + 108, + WSATYPE_NOT_FOUND = WSABASEERR + 109, + WSA_E_NO_MORE = WSABASEERR + 110, + WSA_E_CANCELLED = WSABASEERR + 111, + WSAEREFUSED = WSABASEERR + 112, + + WSAHOST_NOT_FOUND = WSABASEERR + 1001, + WSATRY_AGAIN = WSABASEERR + 1002, + WSANO_RECOVERY = WSABASEERR + 1003, + WSANO_DATA = WSABASEERR + 1004, + + WSA_QOS_RECEIVERS = WSABASEERR + 1005, + WSA_QOS_SENDERS = WSABASEERR + 1006, + WSA_QOS_NO_SENDERS = WSABASEERR + 1007, + WSA_QOS_NO_RECEIVERS = WSABASEERR + 1008, + WSA_QOS_REQUEST_CONFIRMED = WSABASEERR + 1009, + WSA_QOS_ADMISSION_FAILURE = WSABASEERR + 1010, + WSA_QOS_POLICY_FAILURE = WSABASEERR + 1011, + WSA_QOS_BAD_STYLE = WSABASEERR + 1012, + WSA_QOS_BAD_OBJECT = WSABASEERR + 1013, + + WSA_QOS_TRAFFIC_CTRL_ERROR = WSABASEERR + 1014, + WSA_QOS_GENERIC_ERROR = WSABASEERR + 1015, + WSA_QOS_ESERVICETYPE = WSABASEERR + 1016, + WSA_QOS_EFLOWSPEC = WSABASEERR + 1017, + WSA_QOS_EPROVSPECBUF = WSABASEERR + 1018, + WSA_QOS_EFILTERSTYLE = WSABASEERR + 1019, + WSA_QOS_EFILTERTYPE = WSABASEERR + 1020, + WSA_QOS_EFILTERCOUNT = WSABASEERR + 1021, + WSA_QOS_EOBJLENGTH = WSABASEERR + 1022, + WSA_QOS_EFLOWCOUNT = WSABASEERR + 1023, + WSA_QOS_EUNKOWNPSOBJ = WSABASEERR + 1024, + WSA_QOS_EPOLICYOBJ = WSABASEERR + 1025, + WSA_QOS_EFLOWDESC = WSABASEERR + 1026, + WSA_QOS_EPSFLOWSPEC = WSABASEERR + 1027, + WSA_QOS_EPSFILTERSPEC = WSABASEERR + 1028, + WSA_QOS_ESDMODEOBJ = WSABASEERR + 1029, + WSA_QOS_ESHAPERATEOBJ = WSABASEERR + 1030, + WSA_QOS_RESERVED_PETYPE = WSABASEERR + 1031, +} \ No newline at end of file diff --git a/source/tanya/sys/windows/package.d b/source/tanya/sys/windows/package.d new file mode 100644 index 0000000..f9991a9 --- /dev/null +++ b/source/tanya/sys/windows/package.d @@ -0,0 +1,19 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * Copyright: Eugene Wissner 2017. + * License: $(LINK2 https://www.mozilla.org/en-US/MPL/2.0/, + * Mozilla Public License, v. 2.0). + * Authors: $(LINK2 mailto:info@caraus.de, Eugene Wissner) + * Source: $(LINK2 https://github.com/caraus-ecms/tanya/blob/master/source/tanya/sys/windows/package.d, + * tanya/sys/windows/package.d) + */ +module tanya.sys.windows; + +version (Windows): + +public import tanya.sys.windows.def; +public import tanya.sys.windows.error; +public import tanya.sys.windows.winsock2; \ No newline at end of file diff --git a/source/tanya/sys/windows/winsock2.d b/source/tanya/sys/windows/winsock2.d new file mode 100644 index 0000000..31139d0 --- /dev/null +++ b/source/tanya/sys/windows/winsock2.d @@ -0,0 +1,102 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * Copyright: Eugene Wissner 2017. + * License: $(LINK2 https://www.mozilla.org/en-US/MPL/2.0/, + * Mozilla Public License, v. 2.0). + * Authors: $(LINK2 mailto:info@caraus.de, Eugene Wissner) + * Source: $(LINK2 https://github.com/caraus-ecms/tanya/blob/master/source/tanya/sys/windows/winsock2.d, + * tanya/sys/windows/winsock2.d) + */ +module tanya.sys.windows.winsock2; + +version (Windows): + +public import tanya.sys.windows.def; + +alias SOCKET = size_t; +enum SOCKET INVALID_SOCKET = ~0; +enum SOCKET_ERROR = -1; + +enum +{ + IOC_UNIX = 0x00000000, + IOC_WS2 = 0x08000000, + IOC_PROTOCOL = 0x10000000, + IOC_VOID = 0x20000000, // No parameters. + IOC_OUT = 0x40000000, // Copy parameters back. + IOC_IN = 0x80000000, // Copy parameters into. + IOC_VENDOR = 0x18000000, + IOC_WSK = (IOC_WS2 | 0x07000000), // _WIN32_WINNT >= 0x0600. + IOC_INOUT = (IOC_IN | IOC_OUT), // Copy parameter into and get back. +} + +template _WSAIO(int x, int y) +{ + enum _WSAIO = IOC_VOID | x | y; +} +template _WSAIOR(int x, int y) +{ + enum _WSAIOR = IOC_OUT | x | y; +} +template _WSAIOW(int x, int y) +{ + enum _WSAIOW = IOC_IN | x | y; +} +template _WSAIORW(int x, int y) +{ + enum _WSAIORW = IOC_INOUT | x | y; +} + +alias SIO_ASSOCIATE_HANDLE = _WSAIOW!(IOC_WS2, 1); +alias SIO_ENABLE_CIRCULAR_QUEUEING = _WSAIO!(IOC_WS2, 2); +alias SIO_FIND_ROUTE = _WSAIOR!(IOC_WS2, 3); +alias SIO_FLUSH = _WSAIO!(IOC_WS2, 4); +alias SIO_GET_BROADCAST_ADDRESS = _WSAIOR!(IOC_WS2, 5); +alias SIO_GET_EXTENSION_FUNCTION_POINTER = _WSAIORW!(IOC_WS2, 6); +alias SIO_GET_QOS = _WSAIORW!(IOC_WS2, 7); +alias SIO_GET_GROUP_QOS = _WSAIORW!(IOC_WS2, 8); +alias SIO_MULTIPOINT_LOOPBACK = _WSAIOW!(IOC_WS2, 9); +alias SIO_MULTICAST_SCOPE = _WSAIOW!(IOC_WS2, 10); +alias SIO_SET_QOS = _WSAIOW!(IOC_WS2, 11); +alias SIO_SET_GROUP_QOS = _WSAIOW!(IOC_WS2, 12); +alias SIO_TRANSLATE_HANDLE = _WSAIORW!(IOC_WS2, 13); +alias SIO_ROUTING_INTERFACE_QUERY = _WSAIORW!(IOC_WS2, 20); +alias SIO_ROUTING_INTERFACE_CHANGE = _WSAIOW!(IOC_WS2, 21); +alias SIO_ADDRESS_LIST_QUERY = _WSAIOR!(IOC_WS2, 22); +alias SIO_ADDRESS_LIST_CHANGE = _WSAIO!(IOC_WS2, 23); +alias SIO_QUERY_TARGET_PNP_HANDLE = _WSAIOR!(IOC_WS2, 24); +alias SIO_NSP_NOTIFY_CHANGE = _WSAIOW!(IOC_WS2, 25); + +alias GROUP = uint; + +enum +{ + WSA_FLAG_OVERLAPPED = 0x01, + WSA_FLAG_MULTIPOINT_C_ROOT = 0x02, + WSA_FLAG_MULTIPOINT_C_LEAF = 0x04, + WSA_FLAG_MULTIPOINT_D_ROOT = 0x08, + WSA_FLAG_MULTIPOINT_D_LEAF = 0x10, + WSA_FLAG_ACCESS_SYSTEM_SECURITY = 0x40, + WSA_FLAG_NO_HANDLE_INHERIT = 0x80, + WSA_FLAG_REGISTERED_IO = 0x100, +} + +enum MAX_PROTOCOL_CHAIN = 7; +enum BASE_PROTOCOL = 1; +enum LAYERED_PROTOCOL = 0; +enum WSAPROTOCOL_LEN = 255; + +struct WSAPROTOCOLCHAIN +{ + int ChainLen; + DWORD[MAX_PROTOCOL_CHAIN] ChainEntries; +} + +struct WSABUF +{ + ULONG len; + CHAR* buf; +} \ No newline at end of file