replace the horrible error system with multiple returns

This commit is contained in:
2026-05-28 17:28:57 +02:00
parent 0b16cc4513
commit f181cfe675
18 changed files with 138 additions and 199 deletions

View File

@@ -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