ws2_32.odin 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. // +build windows
  2. package sys_windows
  3. // Define flags to be used with the WSAAsyncSelect() call.
  4. FD_READ :: 0x01
  5. FD_WRITE :: 0x02
  6. FD_OOB :: 0x04
  7. FD_ACCEPT :: 0x08
  8. FD_CONNECT :: 0x10
  9. FD_CLOSE :: 0x20
  10. FD_MAX_EVENTS :: 10
  11. INADDR_LOOPBACK :: 0x7f000001
  12. // Event flag definitions for WSAPoll().
  13. POLLRDNORM :: 0x0100
  14. POLLRDBAND :: 0x0200
  15. POLLIN :: (POLLRDNORM | POLLRDBAND)
  16. POLLPRI :: 0x0400
  17. POLLWRNORM :: 0x0010
  18. POLLOUT :: (POLLWRNORM)
  19. POLLWRBAND :: 0x0020
  20. POLLERR :: 0x0001
  21. POLLHUP :: 0x0002
  22. POLLNVAL :: 0x0004
  23. WSA_POLLFD :: struct{
  24. fd: SOCKET,
  25. events: c_short,
  26. revents: c_short,
  27. }
  28. WSANETWORKEVENTS :: struct {
  29. lNetworkEvents: c_long,
  30. iErrorCode: [FD_MAX_EVENTS]c_int,
  31. }
  32. WSAEVENT :: HANDLE
  33. WSAID_ACCEPTEX :: GUID{0xb5367df1, 0xcbac, 0x11cf, {0x95, 0xca, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92}}
  34. WSAID_GETACCEPTEXSOCKADDRS :: GUID{0xb5367df2, 0xcbac, 0x11cf, {0x95, 0xca, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92}}
  35. WSAID_CONNECTX :: GUID{0x25a207b9, 0xddf3, 0x4660, {0x8e, 0xe9, 0x76, 0xe5, 0x8c, 0x74, 0x06, 0x3e}}
  36. SIO_GET_EXTENSION_FUNCTION_POINTER :: IOC_INOUT | IOC_WS2 | 6
  37. IOC_OUT :: 0x40000000
  38. IOC_IN :: 0x80000000
  39. IOC_INOUT :: (IOC_IN | IOC_OUT)
  40. IOC_WS2 :: 0x08000000
  41. SO_UPDATE_ACCEPT_CONTEXT :: 28683
  42. LPFN_CONNECTEX :: #type proc "system" (
  43. s: SOCKET,
  44. sockaddr: ^SOCKADDR_STORAGE_LH,
  45. namelen: c_int,
  46. lpSendBuffer: PVOID,
  47. dwSendDataLength: DWORD,
  48. lpdwBytesSent: LPDWORD,
  49. lpOverlapped: LPOVERLAPPED,
  50. ) -> BOOL
  51. LPFN_ACCEPTEX :: #type proc "system" (
  52. sListenSocket: SOCKET,
  53. sAcceptSocket: SOCKET,
  54. lpOutputBuffer: PVOID,
  55. dwReceiveDataLength: DWORD,
  56. dwLocalAddressLength: DWORD,
  57. dwRemoteAddressLength: DWORD,
  58. lpdwBytesReceived: LPDWORD,
  59. lpOverlapped: LPOVERLAPPED,
  60. ) -> BOOL
  61. /*
  62. Example Load:
  63. load_accept_ex :: proc(listener: SOCKET, fn_acceptex: ^LPFN_ACCEPTEX) {
  64. bytes: u32
  65. guid_accept_ex := WSAID_ACCEPTEX
  66. rc := WSAIoctl(listener, SIO_GET_EXTENSION_FUNCTION_POINTER, &guid_accept_ex, size_of(guid_accept_ex),
  67. fn_acceptex, size_of(fn_acceptex), &bytes, nil, nil)
  68. assert(rc != windows.SOCKET_ERROR)
  69. }
  70. */
  71. foreign import ws2_32 "system:Ws2_32.lib"
  72. @(default_calling_convention="system")
  73. foreign ws2_32 {
  74. // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsastartup)
  75. WSAStartup :: proc(wVersionRequested: WORD, lpWSAData: LPWSADATA) -> c_int ---
  76. // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsacleanup)
  77. WSACleanup :: proc() -> c_int ---
  78. // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsagetlasterror)
  79. WSAGetLastError :: proc() -> c_int ---
  80. // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsapoll)
  81. WSAPoll :: proc(fdArray: ^WSA_POLLFD, fds: c_ulong, timeout: c_int) -> c_int ---
  82. // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsaduplicatesocketw)
  83. WSADuplicateSocketW :: proc(
  84. s: SOCKET,
  85. dwProcessId: DWORD,
  86. lpProtocolInfo: LPWSAPROTOCOL_INFO,
  87. ) -> c_int ---
  88. // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsasend)
  89. WSASend :: proc(
  90. s: SOCKET,
  91. lpBuffers: LPWSABUF,
  92. dwBufferCount: DWORD,
  93. lpNumberOfBytesSent: LPDWORD,
  94. dwFlags: DWORD,
  95. lpOverlapped: LPWSAOVERLAPPED,
  96. lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE,
  97. ) -> c_int ---
  98. // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsarecv)
  99. WSARecv :: proc(
  100. s: SOCKET,
  101. lpBuffers: LPWSABUF,
  102. dwBufferCount: DWORD,
  103. lpNumberOfBytesRecvd: LPDWORD,
  104. lpFlags: LPDWORD,
  105. lpOverlapped: LPWSAOVERLAPPED,
  106. lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE,
  107. ) -> c_int ---
  108. // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsasocketw)
  109. WSASocketW :: proc(
  110. af: c_int,
  111. kind: c_int,
  112. protocol: c_int,
  113. lpProtocolInfo: LPWSAPROTOCOL_INFO,
  114. g: GROUP,
  115. dwFlags: DWORD,
  116. ) -> SOCKET ---
  117. // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsaioctl)
  118. WSAIoctl :: proc(s: SOCKET, dwIoControlCode: DWORD, lpvInBuffer: rawptr, cbInBuffer: DWORD, lpvOutBuffer: rawptr, cbOutBuffer: DWORD, lpcbBytesReturned: ^DWORD, lpOverlapped: ^OVERLAPPED, lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE) -> c_int ---
  119. // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsaeventselect)
  120. WSAEventSelect :: proc(s: SOCKET, hEventObject: WSAEVENT, lNetworkEvents: i32) -> c_int ---
  121. // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsawaitformultipleevents)
  122. WSAWaitForMultipleEvents :: proc(cEvents: DWORD, lphEvents: ^WSAEVENT, fWaitAll: BOOL, dwTimeout: DWORD, fAlertable: BOOL) -> DWORD ---
  123. // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsaenumnetworkevents)
  124. WSAEnumNetworkEvents :: proc(s: SOCKET, hEventObject: WSAEVENT, lpNetworkEvents: ^WSANETWORKEVENTS) -> c_int ---
  125. //[MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsagetoverlappedresult)
  126. WSAGetOverlappedResult :: proc(s: SOCKET, lpOverlapped: ^OVERLAPPED, lpcbTransfer: ^DWORD, fWait: BOOL, lpdwFlags: ^DWORD) -> BOOL ---
  127. // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-socket)
  128. socket :: proc(
  129. af: c_int,
  130. type: c_int,
  131. protocol: c_int,
  132. ) -> SOCKET ---
  133. // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-ioctlsocket)
  134. ioctlsocket :: proc(s: SOCKET, cmd: c_long, argp: ^c_ulong) -> c_int ---
  135. // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-closesocket)
  136. closesocket :: proc(socket: SOCKET) -> c_int ---
  137. // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock/nf-winsock-recv)
  138. recv :: proc(socket: SOCKET, buf: rawptr, len: c_int, flags: c_int) -> c_int ---
  139. // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-send)
  140. send :: proc(socket: SOCKET, buf: rawptr, len: c_int, flags: c_int) -> c_int ---
  141. // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-recvfrom)
  142. recvfrom :: proc(
  143. socket: SOCKET,
  144. buf: rawptr,
  145. len: c_int,
  146. flags: c_int,
  147. addr: ^SOCKADDR_STORAGE_LH,
  148. addrlen: ^c_int,
  149. ) -> c_int ---
  150. // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-sendto)
  151. sendto :: proc(
  152. socket: SOCKET,
  153. buf: rawptr,
  154. len: c_int,
  155. flags: c_int,
  156. addr: ^SOCKADDR_STORAGE_LH,
  157. addrlen: c_int,
  158. ) -> c_int ---
  159. // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-shutdown)
  160. shutdown :: proc(socket: SOCKET, how: c_int) -> c_int ---
  161. // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-accept)
  162. accept :: proc(socket: SOCKET, address: ^SOCKADDR_STORAGE_LH, address_len: ^c_int) -> SOCKET ---
  163. // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt)
  164. setsockopt :: proc(
  165. s: SOCKET,
  166. level: c_int,
  167. optname: c_int,
  168. optval: rawptr,
  169. optlen: c_int,
  170. ) -> c_int ---
  171. // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getsockname)
  172. getsockname :: proc(socket: SOCKET, address: ^SOCKADDR_STORAGE_LH, address_len: ^c_int) -> c_int ---
  173. // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getpeername)
  174. getpeername :: proc(socket: SOCKET, address: ^SOCKADDR_STORAGE_LH, address_len: ^c_int) -> c_int ---
  175. // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-bind)
  176. bind :: proc(socket: SOCKET, address: ^SOCKADDR_STORAGE_LH, address_len: socklen_t) -> c_int ---
  177. // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-listen)
  178. listen :: proc(socket: SOCKET, backlog: c_int) -> c_int ---
  179. // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-connect)
  180. connect :: proc(socket: SOCKET, address: ^SOCKADDR_STORAGE_LH, len: c_int) -> c_int ---
  181. // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/ws2tcpip/nf-ws2tcpip-getaddrinfo)
  182. getaddrinfo :: proc(
  183. node: cstring,
  184. service: cstring,
  185. hints: ^ADDRINFOA,
  186. res: ^^ADDRINFOA,
  187. ) -> c_int ---
  188. // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/ws2tcpip/nf-ws2tcpip-freeaddrinfo)
  189. freeaddrinfo :: proc(res: ^ADDRINFOA) ---
  190. // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/ws2tcpip/nf-ws2tcpip-freeaddrinfoexw)
  191. FreeAddrInfoExW :: proc(pAddrInfoEx: PADDRINFOEXW) ---
  192. // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/ws2tcpip/nf-ws2tcpip-getaddrinfoexw)
  193. GetAddrInfoExW :: proc(
  194. pName: PCWSTR,
  195. pServiceName: PCWSTR,
  196. dwNameSpace: DWORD,
  197. lpNspId: LPGUID,
  198. hints: ^ADDRINFOEXW,
  199. ppResult: ^PADDRINFOEXW,
  200. timeout: ^timeval,
  201. lpOverlapped: LPOVERLAPPED,
  202. lpCompletionRoutine: LPLOOKUPSERVICE_COMPLETION_ROUTINE,
  203. lpHandle: LPHANDLE) -> INT ---
  204. // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-select)
  205. select :: proc(
  206. nfds: c_int,
  207. readfds: ^fd_set,
  208. writefds: ^fd_set,
  209. exceptfds: ^fd_set,
  210. timeout: ^timeval,
  211. ) -> c_int ---
  212. // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getsockopt)
  213. getsockopt :: proc(
  214. s: SOCKET,
  215. level: c_int,
  216. optname: c_int,
  217. optval: ^c_char,
  218. optlen: ^c_int,
  219. ) -> c_int ---
  220. // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-ntohl)
  221. ntohl :: proc(netlong: c_ulong) -> c_ulong ---
  222. // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-ntohs)
  223. ntohs :: proc(netshort: c_ushort) -> c_ushort ---
  224. // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-htonl)
  225. @(deprecated="Use endian specific integers instead, https://odin-lang.org/docs/overview/#basic-types")
  226. htonl :: proc(hostlong: c_ulong) -> c_ulong ---
  227. // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-htons)
  228. @(deprecated="Use endian specific integers instead, https://odin-lang.org/docs/overview/#basic-types")
  229. htons :: proc(hostshort: c_ushort) -> c_ushort ---
  230. }