rumpk/libs/membrane/socket.nim

40 lines
1.0 KiB
Nim

# Nexus Membrane: Socket Shim
# Manages state for fake file descriptors.
import net_glue
const MAX_SOCKETS = 1024
var socket_table: array[MAX_SOCKETS, ptr NexusSock]
proc new_socket*(): int =
## Allocate a new NexusSocket and return a fake FD.
## Reserve FDs 0-99 for system/vfs.
for i in 100 ..< MAX_SOCKETS:
if socket_table[i] == nil:
var s = create(NexusSock)
s.fd = i
s.state = CLOSED
socket_table[i] = s
return i
return -1
proc get_socket*(fd: int): ptr NexusSock =
if fd < 0 or fd >= MAX_SOCKETS: return nil
return socket_table[fd]
proc connect_flow*(fd: int, ip: uint32, port: uint16): int =
let s = get_socket(fd)
if s == nil: return -1
return glue_connect(s, cast[ptr IpAddr](addr ip), port)
proc send_flow*(fd: int, buf: pointer, len: int): int =
let s = get_socket(fd)
if s == nil: return -1
return glue_write(s, buf, len)
proc recv_flow*(fd: int, buf: pointer, len: int): int =
let s = get_socket(fd)
if s == nil: return -1
return glue_read(s, buf, len)