new var declaration syntax
This commit is contained in:
@@ -6,18 +6,18 @@ const SO_REUSEADDR = 2
|
||||
|
||||
func net.listen?[packed_host: i64, port: i64] : i64
|
||||
err.clear()
|
||||
let s = _builtin_syscall(SYS_socket, AF_INET, SOCK_STREAM, 0)
|
||||
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
|
||||
|
||||
let optval = 1
|
||||
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
|
||||
|
||||
let sa = mem.alloc(16)
|
||||
sa := mem.alloc(16)
|
||||
mem.zero(sa, 16)
|
||||
sa[0] = 2
|
||||
sa[1] = 0
|
||||
@@ -44,12 +44,12 @@ func net.listen?[packed_host: i64, port: i64] : i64
|
||||
|
||||
func net.connect?[packed_host: i64, port: i64] : i64
|
||||
err.clear()
|
||||
let s = _builtin_syscall(SYS_socket, AF_INET, SOCK_STREAM, 0)
|
||||
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
|
||||
|
||||
let sa = mem.alloc(16)
|
||||
sa := mem.alloc(16)
|
||||
mem.zero(sa, 16)
|
||||
sa[0] = AF_INET
|
||||
sa[1] = 0
|
||||
@@ -95,7 +95,7 @@ struct net.UDPPacket
|
||||
|
||||
func net.create_udp_client?[packed_host: i64, port: i64] : net.UDPSocket
|
||||
err.clear()
|
||||
let s = new net.UDPSocket
|
||||
s := new net.UDPSocket
|
||||
|
||||
s->fd = _builtin_syscall(SYS_socket, AF_INET, SOCK_DGRAM, 0)
|
||||
if s->fd < 0
|
||||
@@ -117,7 +117,7 @@ func net.create_udp_client?[packed_host: i64, port: i64] : net.UDPSocket
|
||||
|
||||
func net.create_udp_server?[packed_host: i64, port: i64] : net.UDPSocket
|
||||
err.clear()
|
||||
let s = net.create_udp_client?(packed_host, port)
|
||||
s := net.create_udp_client?(packed_host, port)
|
||||
if err.check()
|
||||
return 0 as net.UDPSocket
|
||||
|
||||
@@ -132,12 +132,12 @@ 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)
|
||||
|
||||
func net.udp_receive[s: net.UDPSocket, size: i64] : net.UDPPacket
|
||||
let pkt = new net.UDPPacket
|
||||
pkt := new net.UDPPacket
|
||||
pkt->data = mem.alloc(size)
|
||||
pkt->source_addr = mem.alloc(16)
|
||||
mem.zero(pkt->source_addr, 16)
|
||||
|
||||
let addrlen = 16
|
||||
addrlen := 16
|
||||
pkt->size = _builtin_syscall(SYS_recvfrom, s->fd, pkt->data, size, 0, pkt->source_addr, ^addrlen)
|
||||
return pkt
|
||||
|
||||
@@ -156,14 +156,14 @@ const DNS_CLASS_IN = 1
|
||||
const DNS_RECURSION_DESIRED = 256
|
||||
|
||||
func net.encode_dns_name[domain: str] : io.Buffer
|
||||
let domain_len = str.len(domain)
|
||||
let buf: io.Buffer = must(io.Buffer.alloc?(domain_len + 2))
|
||||
let out_pos = 0
|
||||
let part_start = 0
|
||||
let i = 0
|
||||
domain_len := str.len(domain)
|
||||
buf : io.Buffer = must(io.Buffer.alloc?(domain_len + 2))
|
||||
out_pos := 0
|
||||
part_start := 0
|
||||
i := 0
|
||||
while i <= domain_len
|
||||
if i == domain_len || domain[i] == '.'
|
||||
let part_len = i - part_start
|
||||
part_len := i - part_start
|
||||
buf->data[out_pos] = part_len & 0xff
|
||||
out_pos = out_pos + 1
|
||||
mem.copy(domain as ptr + part_start, buf->data + out_pos, part_len)
|
||||
@@ -175,11 +175,11 @@ func net.encode_dns_name[domain: str] : io.Buffer
|
||||
return buf
|
||||
|
||||
func net.build_dns_query[domain_name: str, record_type: i64] : io.Buffer
|
||||
let name = net.encode_dns_name(domain_name)
|
||||
let out: io.Buffer = must(io.Buffer.alloc?(12 + name->size + 4))
|
||||
name := net.encode_dns_name(domain_name)
|
||||
out : io.Buffer = must(io.Buffer.alloc?(12 + name->size + 4))
|
||||
|
||||
// header
|
||||
let id = math.abs(os.urandom_i64() % 65536)
|
||||
id := math.abs(os.urandom_i64() % 65536)
|
||||
mem.write16be(out->data + 0, id)
|
||||
mem.write16be(out->data + 2, DNS_RECURSION_DESIRED)
|
||||
mem.write16be(out->data + 4, 1) // num_questions
|
||||
@@ -198,21 +198,21 @@ func net.build_dns_query[domain_name: str, record_type: i64] : io.Buffer
|
||||
// TODO: dont resolve IPs
|
||||
func net.resolve?[domain: str] : i64
|
||||
err.clear()
|
||||
let query = net.build_dns_query(domain, DNS_TYPE_A)
|
||||
query := net.build_dns_query(domain, DNS_TYPE_A)
|
||||
|
||||
// TODO: this probably shouldnt be hardcoded
|
||||
let s = net.create_udp_client?(net.pack_addr(1, 1, 1, 1), 53)
|
||||
s := net.create_udp_client?(net.pack_addr(1, 1, 1, 1), 53)
|
||||
if err.check()
|
||||
return -1
|
||||
|
||||
net.udp_send_to(s, s->addr, query->data, query->size)
|
||||
io.Buffer.free(query)
|
||||
let pkt = net.udp_receive(s, 1024)
|
||||
pkt := net.udp_receive(s, 1024)
|
||||
net.UDPSocket.close_and_free(s)
|
||||
|
||||
// TODO: do actual parsing
|
||||
|
||||
let pos = 12 // skip header (12 bytes)
|
||||
pos := 12 // skip header (12 bytes)
|
||||
|
||||
while pkt->data[pos] != 0
|
||||
pos = pos + pkt->data[pos] + 1 // skip question
|
||||
@@ -221,6 +221,6 @@ func net.resolve?[domain: str] : i64
|
||||
|
||||
pos = pos + 12 // skip name(2), type(2), class(2), ttl(4), rdlength(2)
|
||||
|
||||
let 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)
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user