64 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			V
		
	
	
			
		
		
	
	
			64 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			V
		
	
	
| module net
 | |
| 
 | |
| const (
 | |
| 	errors_base = 0
 | |
| )
 | |
| 
 | |
| // Well defined errors that are returned from socket functions
 | |
| pub const (
 | |
| 	err_new_socket_failed   = error_with_code('net: new_socket failed to create socket',
 | |
| 		errors_base + 1)
 | |
| 	err_option_not_settable = error_with_code('net: set_option_xxx option not settable',
 | |
| 		errors_base + 2)
 | |
| 	err_option_wrong_type   = error_with_code('net: set_option_xxx option wrong type',
 | |
| 		errors_base + 3)
 | |
| 	err_port_out_of_range   = error_with_code('', errors_base + 5)
 | |
| 	err_no_udp_remote       = error_with_code('', errors_base + 6)
 | |
| 	err_connect_failed      = error_with_code('net: connect failed', errors_base + 7)
 | |
| 	err_connect_timed_out   = error_with_code('net: connect timed out', errors_base + 8)
 | |
| 	err_timed_out           = error_with_code('net: op timed out', errors_base + 9)
 | |
| 	err_timed_out_code      = errors_base + 9
 | |
| )
 | |
| 
 | |
| pub fn socket_error(potential_code int) ?int {
 | |
| 	$if windows {
 | |
| 		if potential_code < 0 {
 | |
| 			last_error_int := C.WSAGetLastError()
 | |
| 			last_error := wsa_error(last_error_int)
 | |
| 			return error_with_code('net: socket error: ($last_error_int) $last_error',
 | |
| 				int(last_error))
 | |
| 		}
 | |
| 	} $else {
 | |
| 		if potential_code < 0 {
 | |
| 			last_error := error_code()
 | |
| 			return error_with_code('net: socket error: $last_error', last_error)
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	return potential_code
 | |
| }
 | |
| 
 | |
| pub fn wrap_error(error_code int) ? {
 | |
| 	$if windows {
 | |
| 		enum_error := wsa_error(error_code)
 | |
| 		return error_with_code('net: socket error: $enum_error', error_code)
 | |
| 	} $else {
 | |
| 		if error_code == 0 {
 | |
| 			return
 | |
| 		}
 | |
| 		return error_with_code('net: socket error: $error_code', error_code)
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // wrap_read_result takes a read result and sees if it is 0 for graceful
 | |
| // connection termination and returns none
 | |
| // e.g. res := wrap_read_result(C.recv(c.sock.handle, buf_ptr, len, 0))?
 | |
| [inline]
 | |
| fn wrap_read_result(result int) ?int {
 | |
| 	if result > 0 || result < 0 {
 | |
| 		return result
 | |
| 	}
 | |
| 
 | |
| 	return none
 | |
| }
 |