replace the horrible error system with multiple returns
This commit is contained in:
@@ -4,18 +4,15 @@ const SOCK_DGRAM = 2
|
||||
const SOL_SOCKET = 1
|
||||
const SO_REUSEADDR = 2
|
||||
|
||||
func net.listen?[packed_host: i64, port: i64] : i64
|
||||
err.clear()
|
||||
func net.listen[packed_host: i64, port: i64] : i64, bool
|
||||
s := _builtin_syscall(SYS_socket, AF_INET, SOCK_STREAM, 0)
|
||||
if s < 0
|
||||
err.set(ERR_SYSCALL_FAILED, "net.listen?: failed to create a socket")
|
||||
return -1
|
||||
return -1, false
|
||||
|
||||
optval := 1
|
||||
if _builtin_syscall(SYS_setsockopt, s, SOL_SOCKET, SO_REUSEADDR, ^optval, 8) < 0
|
||||
_builtin_syscall(SYS_close, s)
|
||||
err.set(ERR_SYSCALL_FAILED, "net.listen?: setsockopt() failed")
|
||||
return -1
|
||||
return -1, false
|
||||
|
||||
sa := mem.alloc(16)
|
||||
mem.zero(sa, 16)
|
||||
@@ -31,23 +28,19 @@ func net.listen?[packed_host: i64, port: i64] : i64
|
||||
if _builtin_syscall(SYS_bind, s, sa, 16) < 0
|
||||
_builtin_syscall(SYS_close, s)
|
||||
mem.free(sa)
|
||||
err.set(ERR_SYSCALL_FAILED, "net.listen?: failed to bind")
|
||||
return -1
|
||||
return -1, false
|
||||
mem.free(sa)
|
||||
|
||||
if _builtin_syscall(SYS_listen, s, 128) < 0
|
||||
_builtin_syscall(SYS_close, s)
|
||||
err.set(ERR_SYSCALL_FAILED, "net.listen?: listen() failed")
|
||||
return -1
|
||||
return -1, false
|
||||
|
||||
return s
|
||||
return s, true
|
||||
|
||||
func net.connect?[packed_host: i64, port: i64] : i64
|
||||
err.clear()
|
||||
func net.connect[packed_host: i64, port: i64] : i64, bool
|
||||
s := _builtin_syscall(SYS_socket, AF_INET, SOCK_STREAM, 0)
|
||||
if s < 0
|
||||
err.set(ERR_SYSCALL_FAILED, "net.connect?: failed to create a socket")
|
||||
return -1
|
||||
return -1, false
|
||||
|
||||
sa := mem.alloc(16)
|
||||
mem.zero(sa, 16)
|
||||
@@ -63,11 +56,10 @@ func net.connect?[packed_host: i64, port: i64] : i64
|
||||
if _builtin_syscall(SYS_connect, s, sa, 16) < 0
|
||||
mem.free(sa)
|
||||
_builtin_syscall(SYS_close, s)
|
||||
err.set(ERR_CONNECTION_FAILED, "net.connect?: connection failed")
|
||||
return -1
|
||||
return -1, false
|
||||
|
||||
mem.free(sa)
|
||||
return s
|
||||
return s, true
|
||||
|
||||
func net.accept[s: i64, addr: ptr] : i64
|
||||
addrlen := 16
|
||||
@@ -89,15 +81,13 @@ struct net.UDPSocket
|
||||
fd: i64
|
||||
addr: ptr
|
||||
|
||||
func net.create_udp_client?[packed_host: i64, port: i64] : net.UDPSocket
|
||||
err.clear()
|
||||
func net.create_udp_client[packed_host: i64, port: i64] : net.UDPSocket, bool
|
||||
s := new* net.UDPSocket
|
||||
|
||||
s->fd = _builtin_syscall(SYS_socket, AF_INET, SOCK_DGRAM, 0)
|
||||
if s->fd < 0
|
||||
mem.free(s)
|
||||
err.set(ERR_SYSCALL_FAILED, "net.create_udp_client?: failed to create a socket")
|
||||
return 0 as net.UDPSocket
|
||||
return 0 as net.UDPSocket, false
|
||||
|
||||
s->addr = mem.alloc(16)
|
||||
mem.zero(s->addr, 16)
|
||||
@@ -109,20 +99,18 @@ func net.create_udp_client?[packed_host: i64, port: i64] : net.UDPSocket
|
||||
s->addr[5] = (packed_host >> 16) & 255
|
||||
s->addr[6] = (packed_host >> 8) & 255
|
||||
s->addr[7] = packed_host & 255
|
||||
return s
|
||||
return s, true
|
||||
|
||||
func net.create_udp_server?[packed_host: i64, port: i64] : net.UDPSocket
|
||||
err.clear()
|
||||
s := net.create_udp_client?(packed_host, port)
|
||||
if err.check()
|
||||
return 0 as net.UDPSocket
|
||||
func net.create_udp_server[packed_host: i64, port: i64] : net.UDPSocket, bool
|
||||
~s, ok := net.create_udp_client(packed_host, port)
|
||||
if !ok
|
||||
return 0 as net.UDPSocket, false
|
||||
|
||||
if _builtin_syscall(SYS_bind, s->fd, s->addr, 16) < 0
|
||||
net.UDPSocket.close_and_free(s)
|
||||
err.set(ERR_SYSCALL_FAILED, "net.create_udp_server?: failed to bind")
|
||||
return 0 as net.UDPSocket
|
||||
return 0 as net.UDPSocket, false
|
||||
|
||||
return s
|
||||
return s, true
|
||||
|
||||
func net.udp_send_to[s: net.UDPSocket, addr: ptr, data: ptr, size: i64] : void
|
||||
_builtin_syscall(SYS_sendto, s->fd, data, size, 0, addr, 16)
|
||||
@@ -158,7 +146,7 @@ const DNS_RECURSION_DESIRED = 256
|
||||
|
||||
func net.encode_dns_name[domain: str] : Blob
|
||||
domain_len := str.len(domain)
|
||||
buf : Blob = must(Blob.alloc?(domain_len + 2))
|
||||
buf := Blob.alloc(domain_len + 2)
|
||||
out_pos := 0
|
||||
part_start := 0
|
||||
i := 0
|
||||
@@ -177,7 +165,7 @@ func net.encode_dns_name[domain: str] : Blob
|
||||
|
||||
func net.build_dns_query[domain_name: str, record_type: i64] : Blob
|
||||
name := net.encode_dns_name(domain_name)
|
||||
out : Blob = must(Blob.alloc?(12 + name->size + 4))
|
||||
out := Blob.alloc(12 + name->size + 4)
|
||||
|
||||
// header
|
||||
id := math.abs(os.urandom_i64() % 65536)
|
||||
@@ -197,14 +185,13 @@ func net.build_dns_query[domain_name: str, record_type: i64] : Blob
|
||||
return out
|
||||
|
||||
// TODO: dont resolve if its already an IP
|
||||
func net.resolve?[domain: str] : i64
|
||||
err.clear()
|
||||
func net.resolve[domain: str] : i64, bool
|
||||
query := net.build_dns_query(domain, DNS_TYPE_A)
|
||||
|
||||
// TODO: this probably shouldnt be hardcoded
|
||||
s := net.create_udp_client?(net.pack_addr(1, 1, 1, 1), 53)
|
||||
if err.check()
|
||||
return -1
|
||||
~s, ok := net.create_udp_client(net.pack_addr(1, 1, 1, 1), 53)
|
||||
if !ok
|
||||
return -1, false
|
||||
|
||||
net.udp_send_to(s, s->addr, query->data, query->size)
|
||||
Blob.free(query)
|
||||
@@ -224,4 +211,4 @@ func net.resolve?[domain: str] : i64
|
||||
|
||||
out := net.pack_addr(pkt->data[pos] as i64, pkt->data[pos+1] as i64, pkt->data[pos+2] as i64, pkt->data[pos+3] as i64)
|
||||
net.UDPPacket.free(pkt)
|
||||
return out
|
||||
return out, true
|
||||
|
||||
Reference in New Issue
Block a user