errors_windows.odin 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. #+build windows
  2. package net
  3. /*
  4. Package net implements cross-platform Berkeley Sockets, DNS resolution and associated procedures.
  5. For other protocols and their features, see subdirectories of this package.
  6. */
  7. /*
  8. Copyright 2022 Tetralux <[email protected]>
  9. Copyright 2022 Colin Davidson <[email protected]>
  10. Copyright 2022 Jeroen van Rijn <[email protected]>.
  11. Copyright 2024 Feoramund <[email protected]>.
  12. Made available under Odin's BSD-3 license.
  13. List of contributors:
  14. Tetralux: Initial implementation
  15. Colin Davidson: Linux platform code, OSX platform code, Odin-native DNS resolver
  16. Jeroen van Rijn: Cross platform unification, code style, documentation
  17. Feoramund: FreeBSD platform code
  18. */
  19. import "core:reflect"
  20. import win "core:sys/windows"
  21. _last_platform_error :: proc() -> i32 {
  22. return i32(win.WSAGetLastError())
  23. }
  24. _last_platform_error_string :: proc() -> string {
  25. description, _ := reflect.enum_name_from_value(win.System_Error(win.WSAGetLastError()))
  26. return description
  27. }
  28. _set_last_platform_error :: proc(err: i32) {
  29. win.WSASetLastError(err)
  30. }
  31. _create_socket_error :: proc() -> Create_Socket_Error {
  32. #partial switch win.System_Error(win.WSAGetLastError()) {
  33. case .WSANOTINITIALISED, .WSAENETDOWN, .WSAEINVALIDPROVIDER, .WSAEINVALIDPROCTABLE, .WSAEPROVIDERFAILEDINIT:
  34. return .Network_Unreachable
  35. case .WSAEAFNOSUPPORT, .WSAEINPROGRESS, .WSAEINVAL, .WSAEPROTOTYPE, .WSAESOCKTNOSUPPORT:
  36. return .Invalid_Argument
  37. case .WSAEMFILE, .WSAENOBUFS, .WSAEPROTONOSUPPORT:
  38. return .Insufficient_Resources
  39. case:
  40. return .Unknown
  41. }
  42. }
  43. _dial_error :: proc() -> Dial_Error {
  44. #partial switch win.System_Error(win.WSAGetLastError()) {
  45. case .WSANOTINITIALISED, .WSAENETDOWN:
  46. return .Network_Unreachable
  47. case .WSAEADDRINUSE:
  48. return .Address_In_Use
  49. case .WSAEINTR:
  50. return .Interrupted
  51. case .WSAEWOULDBLOCK:
  52. return .Would_Block
  53. case .WSAEALREADY:
  54. return .Already_Connecting
  55. case .WSAEADDRNOTAVAIL, .WSAEAFNOSUPPORT, .WSAEFAULT, .WSAENOTSOCK, .WSAEINPROGRESS, .WSAEINVAL:
  56. return .Invalid_Argument
  57. case .WSAECONNREFUSED:
  58. return .Refused
  59. case .WSAEISCONN:
  60. return .Already_Connected
  61. case .WSAEHOSTUNREACH:
  62. return .Host_Unreachable
  63. case .WSAENOBUFS:
  64. return .Insufficient_Resources
  65. case .WSAETIMEDOUT:
  66. return .Timeout
  67. case .WSAEACCES:
  68. return .Broadcast_Not_Supported
  69. case:
  70. return .Unknown
  71. }
  72. }
  73. _bind_error :: proc() -> Bind_Error {
  74. #partial switch win.System_Error(win.WSAGetLastError()) {
  75. case .WSANOTINITIALISED, .WSAENETDOWN:
  76. return .Network_Unreachable
  77. case .WSAEADDRINUSE:
  78. return .Address_In_Use
  79. case .WSAEADDRNOTAVAIL, .WSAEFAULT, .WSAEINPROGRESS, .WSAEACCES, .WSAEINVAL, .WSAENOTSOCK:
  80. return .Invalid_Argument
  81. case:
  82. return .Unknown
  83. }
  84. }
  85. _listen_error :: proc() -> Listen_Error {
  86. #partial switch win.System_Error(win.WSAGetLastError()) {
  87. case .WSANOTINITIALISED, .WSAENETDOWN:
  88. return .Network_Unreachable
  89. case .WSAEMFILE, .WSAENOBUFS:
  90. return .Insufficient_Resources
  91. case .WSAEADDRINUSE:
  92. return .Address_In_Use
  93. case .WSAEINPROGRESS, .WSAENOTSOCK:
  94. return .Invalid_Argument
  95. case .WSAEISCONN:
  96. return .Already_Connected
  97. case .WSAEOPNOTSUPP, .WSAEINVAL:
  98. return .Unsupported_Socket
  99. case:
  100. return .Unknown
  101. }
  102. }
  103. _accept_error :: proc() -> Accept_Error {
  104. #partial switch win.System_Error(win.WSAGetLastError()) {
  105. case .WSANOTINITIALISED, .WSAENETDOWN:
  106. return .Network_Unreachable
  107. case .WSAEMFILE, .WSAENOBUFS:
  108. return .Insufficient_Resources
  109. case .WSAECONNRESET:
  110. return .Aborted
  111. case .WSAEFAULT, .WSAEINPROGRESS, .WSAENOTSOCK:
  112. return .Invalid_Argument
  113. case .WSAEINTR:
  114. return .Interrupted
  115. case .WSAEINVAL:
  116. return .Not_Listening
  117. case .WSAEWOULDBLOCK:
  118. return .Would_Block
  119. case .WSAEOPNOTSUPP:
  120. return .Unsupported_Socket
  121. case:
  122. return .Unknown
  123. }
  124. }
  125. _tcp_recv_error :: proc() -> TCP_Recv_Error {
  126. #partial switch win.System_Error(win.WSAGetLastError()) {
  127. case .WSANOTINITIALISED, .WSAENETDOWN:
  128. return .Network_Unreachable
  129. case .WSAEFAULT, .WSAEINPROGRESS, .WSAENOTSOCK, .WSAEMSGSIZE, .WSAEINVAL, .WSAEOPNOTSUPP:
  130. return .Invalid_Argument
  131. case .WSAENOTCONN:
  132. return .Not_Connected
  133. case .WSAEINTR:
  134. return .Interrupted
  135. case .WSAENETRESET, .WSAESHUTDOWN, .WSAECONNABORTED, .WSAECONNRESET:
  136. return .Connection_Closed
  137. case .WSAEWOULDBLOCK:
  138. return .Would_Block
  139. case .WSAETIMEDOUT:
  140. return .Timeout
  141. case:
  142. return .Unknown
  143. }
  144. }
  145. _udp_recv_error :: proc() -> UDP_Recv_Error {
  146. #partial switch win.System_Error(win.WSAGetLastError()) {
  147. case .WSANOTINITIALISED, .WSAENETDOWN:
  148. return .Network_Unreachable
  149. case .WSAEFAULT, .WSAEINPROGRESS, .WSAEINVAL, .WSAEISCONN, .WSAENOTSOCK, .WSAEOPNOTSUPP, .WSAEMSGSIZE:
  150. return .Invalid_Argument
  151. case .WSAEINTR:
  152. return .Interrupted
  153. case .WSAENETRESET, .WSAESHUTDOWN, .WSAECONNRESET:
  154. return .Connection_Refused
  155. case .WSAEWOULDBLOCK:
  156. return .Would_Block
  157. case .WSAETIMEDOUT:
  158. return .Timeout
  159. case:
  160. return .Unknown
  161. }
  162. }
  163. _tcp_send_error :: proc() -> TCP_Send_Error {
  164. #partial switch win.System_Error(win.WSAGetLastError()) {
  165. case .WSANOTINITIALISED, .WSAENETDOWN:
  166. return .Network_Unreachable
  167. case .WSAENOBUFS:
  168. return .Insufficient_Resources
  169. case .WSAEACCES, .WSAEINPROGRESS, .WSAEFAULT, .WSAENOTSOCK, .WSAEOPNOTSUPP, .WSAEMSGSIZE, .WSAEINVAL:
  170. return .Invalid_Argument
  171. case .WSAEINTR:
  172. return .Interrupted
  173. case .WSAENETRESET, .WSAESHUTDOWN, .WSAECONNABORTED, .WSAECONNRESET:
  174. return .Connection_Closed
  175. case .WSAENOTCONN:
  176. return .Not_Connected
  177. case .WSAEWOULDBLOCK:
  178. return .Would_Block
  179. case .WSAETIMEDOUT:
  180. return .Timeout
  181. case .WSAEHOSTUNREACH:
  182. return .Host_Unreachable
  183. case:
  184. return .Unknown
  185. }
  186. }
  187. _udp_send_error :: proc() -> UDP_Send_Error {
  188. #partial switch win.System_Error(win.WSAGetLastError()) {
  189. case .WSANOTINITIALISED, .WSAENETDOWN, .WSAENETUNREACH:
  190. return .Network_Unreachable
  191. case .WSAENOBUFS:
  192. return .Insufficient_Resources
  193. case .WSAEACCES, .WSAEINVAL, .WSAEINPROGRESS, .WSAEFAULT, .WSAENOTCONN, .WSAENOTSOCK, .WSAEOPNOTSUPP, .WSAEADDRNOTAVAIL, .WSAEAFNOSUPPORT, .WSAEDESTADDRREQ:
  194. return .Invalid_Argument
  195. case .WSAEINTR:
  196. return .Interrupted
  197. case .WSAENETRESET, .WSAESHUTDOWN, .WSAECONNRESET:
  198. return .Connection_Refused
  199. case .WSAEWOULDBLOCK:
  200. return .Would_Block
  201. case .WSAETIMEDOUT:
  202. return .Timeout
  203. case:
  204. return .Unknown
  205. }
  206. }
  207. _shutdown_error :: proc() -> Shutdown_Error {
  208. #partial switch win.System_Error(win.WSAGetLastError()) {
  209. case .WSAENETDOWN, .WSANOTINITIALISED:
  210. return .Network_Unreachable
  211. case .WSAECONNABORTED, .WSAECONNRESET:
  212. return .Connection_Closed
  213. case .WSAEINPROGRESS, .WSAEINVAL, .WSAENOTCONN, .WSAENOTSOCK:
  214. return .Invalid_Argument
  215. case:
  216. return .Unknown
  217. }
  218. }
  219. _socket_info_error :: proc() -> Socket_Info_Error {
  220. #partial switch win.System_Error(win.WSAGetLastError()) {
  221. case .WSAEFAULT, .WSAEINPROGRESS, .WSAENOTSOCK, .WSAEINVAL:
  222. return .Invalid_Argument
  223. case .WSANOTINITIALISED, .WSAENETDOWN, .WSAENOTCONN:
  224. return .Network_Unreachable
  225. case:
  226. return .Unknown
  227. }
  228. }
  229. _socket_option_error :: proc() -> Socket_Option_Error {
  230. #partial switch win.System_Error(win.WSAGetLastError()) {
  231. case .WSAENETDOWN, .WSANOTINITIALISED:
  232. return .Network_Unreachable
  233. case .WSAEFAULT, .WSAEINVAL:
  234. return .Invalid_Value
  235. case .WSAENETRESET, .WSAENOTCONN, .WSAENOTSOCK:
  236. return .Invalid_Socket
  237. case .WSAENOPROTOOPT:
  238. return .Invalid_Option
  239. case:
  240. return .Unknown
  241. }
  242. }
  243. _set_blocking_error :: proc() -> Set_Blocking_Error {
  244. #partial switch win.System_Error(win.WSAGetLastError()) {
  245. case .WSAENETDOWN, .WSANOTINITIALISED:
  246. return .Network_Unreachable
  247. case .WSAEINPROGRESS, .WSAENOTSOCK, .WSAEFAULT:
  248. return .Invalid_Argument
  249. case:
  250. return .Unknown
  251. }
  252. }