1 | module net |
2 | |
3 | // Well defined errors that are returned from socket functions |
4 | pub const ( |
5 | errors_base = 0 |
6 | err_new_socket_failed = error_with_code('net: new_socket failed to create socket', |
7 | errors_base + 1) |
8 | err_option_not_settable = error_with_code('net: set_option_xxx option not settable', |
9 | errors_base + 2) |
10 | err_option_wrong_type = error_with_code('net: set_option_xxx option wrong type', |
11 | errors_base + 3) |
12 | err_port_out_of_range = error_with_code('net: port out of range', errors_base + 5) |
13 | err_no_udp_remote = error_with_code('net: no udp remote', errors_base + 6) |
14 | err_connect_failed = error_with_code('net: connect failed', errors_base + 7) |
15 | err_connect_timed_out = error_with_code('net: connect timed out', errors_base + 8) |
16 | err_timed_out = error_with_code('net: op timed out', errors_base + 9) |
17 | err_timed_out_code = errors_base + 9 |
18 | err_connection_refused = error_with_code('net: connection refused', errors_base + 10) |
19 | ) |
20 | |
21 | pub fn socket_error_message(potential_code int, s string) !int { |
22 | return socket_error(potential_code) or { return error('${err.msg()}; ${s}') } |
23 | } |
24 | |
25 | pub fn socket_error(potential_code int) !int { |
26 | $if windows { |
27 | if potential_code < 0 { |
28 | last_error_int := C.WSAGetLastError() |
29 | last_error := wsa_error(last_error_int) |
30 | return error_with_code('net: socket error: (${last_error_int}) ${last_error}', |
31 | int(last_error)) |
32 | } |
33 | } $else { |
34 | if potential_code < 0 { |
35 | last_error := error_code() |
36 | return error_with_code('net: socket error: ${last_error}', last_error) |
37 | } |
38 | } |
39 | |
40 | return potential_code |
41 | } |
42 | |
43 | pub fn wrap_error(error_code int) ! { |
44 | if error_code == 0 { |
45 | return |
46 | } |
47 | $if windows { |
48 | enum_error := wsa_error(error_code) |
49 | return error_with_code('net: socket error: ${enum_error}', error_code) |
50 | } $else { |
51 | return error_with_code('net: socket error: ${error_code}', error_code) |
52 | } |
53 | } |
54 | |
55 | // wrap_read_result takes a read result and sees if it is 0 for graceful |
56 | // connection termination and returns none |
57 | // e.g. res := wrap_read_result(C.recv(c.sock.handle, voidptr(buf_ptr), len, 0))? |
58 | [inline] |
59 | fn wrap_read_result(result int) !int { |
60 | if result == 0 { |
61 | return error('none') |
62 | } |
63 | return result |
64 | } |
65 | |
66 | [inline] |
67 | fn wrap_write_result(result int) !int { |
68 | if result == 0 { |
69 | return error('none') |
70 | } |
71 | return result |
72 | } |