errors_darwin.odin 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. #+build darwin
  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 "core:sys/posix"
  21. _last_platform_error :: proc() -> i32 {
  22. return i32(posix.errno())
  23. }
  24. _last_platform_error_string :: proc() -> string {
  25. description, _ := reflect.enum_name_from_value(posix.errno())
  26. return description
  27. }
  28. _set_last_platform_error :: proc(err: i32) {
  29. posix.errno(posix.Errno(err))
  30. }
  31. _create_socket_error :: proc() -> Create_Socket_Error {
  32. #partial switch posix.errno() {
  33. case .EMFILE, .ENOBUFS, .ENOMEM, .EPROTONOSUPPORT, .EISCONN, .ENFILE:
  34. return .Insufficient_Resources
  35. case .EAFNOSUPPORT, .EPROTOTYPE:
  36. return .Invalid_Argument
  37. case .EACCES:
  38. return .Insufficient_Permissions
  39. case:
  40. return .Unknown
  41. }
  42. }
  43. _dial_error :: proc() -> Dial_Error {
  44. #partial switch posix.errno() {
  45. case .ENOBUFS:
  46. return .Insufficient_Resources
  47. case .EAFNOSUPPORT, .EBADF, .EFAULT, .EINVAL, .ENOTSOCK, .EPROTOTYPE, .EADDRNOTAVAIL:
  48. return .Invalid_Argument
  49. case .EISCONN:
  50. return .Already_Connected
  51. case .EALREADY:
  52. return .Already_Connecting
  53. case .EADDRINUSE:
  54. return .Address_In_Use
  55. case .ENETDOWN:
  56. return .Network_Unreachable
  57. case .EHOSTUNREACH:
  58. return .Host_Unreachable
  59. case .ECONNREFUSED:
  60. return .Refused
  61. case .ECONNRESET:
  62. return .Reset
  63. case .ETIMEDOUT:
  64. return .Timeout
  65. case .EINPROGRESS:
  66. return .Would_Block
  67. case .EINTR:
  68. return .Interrupted
  69. case .EACCES:
  70. return .Broadcast_Not_Supported
  71. case:
  72. return .Unknown
  73. }
  74. }
  75. _bind_error :: proc() -> Bind_Error {
  76. #partial switch posix.errno() {
  77. case .EADDRNOTAVAIL, .EAFNOSUPPORT, .EBADF, .EDESTADDRREQ, .EFAULT, .ENOTSOCK, .EOPNOTSUPP:
  78. return .Invalid_Argument
  79. case .EINVAL:
  80. return .Already_Bound
  81. case .EACCES:
  82. return .Insufficient_Permissions_For_Address
  83. case .EADDRINUSE:
  84. return .Address_In_Use
  85. case:
  86. return .Unknown
  87. }
  88. }
  89. _listen_error :: proc() -> Listen_Error {
  90. #partial switch posix.errno() {
  91. case .EBADF, .ENOTSOCK:
  92. return .Invalid_Argument
  93. case .EDESTADDRREQ, .EOPNOTSUPP:
  94. return .Unsupported_Socket
  95. case .EINVAL:
  96. return .Already_Connected
  97. case:
  98. return .Unknown
  99. }
  100. }
  101. _accept_error :: proc() -> Accept_Error {
  102. #partial switch posix.errno() {
  103. case .EMFILE, .ENFILE, .ENOMEM:
  104. return .Insufficient_Resources
  105. case .EBADF, .ENOTSOCK, .EFAULT:
  106. return .Invalid_Argument
  107. case .EOPNOTSUPP:
  108. return .Unsupported_Socket
  109. case .ECONNABORTED:
  110. return .Aborted
  111. case .EWOULDBLOCK:
  112. return .Would_Block
  113. case .EINTR:
  114. return .Interrupted
  115. case:
  116. return .Unknown
  117. }
  118. }
  119. _tcp_recv_error :: proc() -> TCP_Recv_Error {
  120. #partial switch posix.errno() {
  121. case .EBADF, .EFAULT, .EINVAL, .ENOTSOCK, .EOPNOTSUPP:
  122. return .Invalid_Argument
  123. case .ENOBUFS:
  124. return .Insufficient_Resources
  125. case .ENOTCONN:
  126. return .Not_Connected
  127. case .ECONNRESET:
  128. return .Connection_Closed
  129. case .ETIMEDOUT:
  130. return .Timeout
  131. case .EAGAIN:
  132. return .Would_Block
  133. case .EINTR:
  134. return .Interrupted
  135. case:
  136. return .Unknown
  137. }
  138. }
  139. _udp_recv_error :: proc() -> UDP_Recv_Error {
  140. #partial switch posix.errno() {
  141. case .EBADF, .EFAULT, .EINVAL, .ENOTSOCK, .EOPNOTSUPP, .EMSGSIZE:
  142. return .Invalid_Argument
  143. case .ENOBUFS, .ENOMEM:
  144. return .Insufficient_Resources
  145. case .ECONNRESET, .ENOTCONN:
  146. return .Connection_Refused
  147. case .ETIMEDOUT:
  148. return .Timeout
  149. case .EAGAIN:
  150. return .Would_Block
  151. case .EINTR:
  152. return .Interrupted
  153. case:
  154. return .Unknown
  155. }
  156. }
  157. _tcp_send_error :: proc() -> TCP_Send_Error {
  158. #partial switch posix.errno() {
  159. case .EACCES, .EBADF, .EFAULT, .EMSGSIZE, .ENOTSOCK, .EOPNOTSUPP:
  160. return .Invalid_Argument
  161. case .ENOBUFS:
  162. return .Insufficient_Resources
  163. case .ECONNRESET, .EPIPE:
  164. return .Connection_Closed
  165. case .ENOTCONN:
  166. return .Not_Connected
  167. case .EHOSTUNREACH:
  168. return .Host_Unreachable
  169. case .ENETDOWN, .ENETUNREACH:
  170. return .Network_Unreachable
  171. case .ETIMEDOUT:
  172. return .Timeout
  173. case .EAGAIN:
  174. return .Would_Block
  175. case .EINTR:
  176. return .Interrupted
  177. case:
  178. return .Unknown
  179. }
  180. }
  181. _udp_send_error :: proc() -> UDP_Send_Error {
  182. #partial switch posix.errno() {
  183. case .EACCES, .EBADF, .EFAULT, .EMSGSIZE, .ENOTSOCK, .EOPNOTSUPP, .EAFNOSUPPORT, .EDESTADDRREQ:
  184. return .Invalid_Argument
  185. case .ENOBUFS, .ENOMEM:
  186. return .Insufficient_Resources
  187. case .ECONNRESET, .EPIPE:
  188. return .Connection_Refused
  189. case .EHOSTUNREACH:
  190. return .Host_Unreachable
  191. case .ENETDOWN, .ENETUNREACH:
  192. return .Network_Unreachable
  193. case .ETIMEDOUT:
  194. return .Timeout
  195. case .EAGAIN:
  196. return .Would_Block
  197. case .EINTR:
  198. return .Interrupted
  199. case:
  200. return .Unknown
  201. }
  202. }
  203. _shutdown_error :: proc() -> Shutdown_Error {
  204. #partial switch posix.errno() {
  205. case .EBADF, .EINVAL, .ENOTSOCK, .ENOTCONN:
  206. return .Invalid_Argument
  207. case:
  208. return .Unknown
  209. }
  210. }
  211. _socket_info_error :: proc() -> Socket_Info_Error {
  212. #partial switch posix.errno() {
  213. case .EBADF, .ENOTSOCK:
  214. return .Invalid_Argument
  215. case .ENOTCONN:
  216. return .Network_Unreachable
  217. case .EOPNOTSUPP:
  218. return .Unsupported_Socket
  219. case .EINVAL:
  220. return .Connection_Closed
  221. case .ENOBUFS:
  222. return .Insufficient_Resources
  223. case:
  224. return .Unknown
  225. }
  226. }
  227. _socket_option_error :: proc() -> Socket_Option_Error {
  228. #partial switch posix.errno() {
  229. case .ENOBUFS:
  230. return .Insufficient_Resources
  231. case .EBADF, .ENOTSOCK, .EISCONN:
  232. return .Invalid_Socket
  233. case .EINVAL, .ENOPROTOOPT:
  234. return .Invalid_Option
  235. case .EFAULT, .EDOM:
  236. return .Invalid_Value
  237. case:
  238. return .Unknown
  239. }
  240. }
  241. _set_blocking_error :: proc() -> Set_Blocking_Error {
  242. #partial switch posix.errno() {
  243. case .EBADF:
  244. return .Invalid_Argument
  245. case:
  246. return .Unknown
  247. }
  248. }