#ifndef SOCK_H #define SOCK_H #include "memory.h" enum sock_address_family { SOCK_ADDRESS_FAMILY_IPV4, SOCK_ADDRESS_FAMILY_IPV6 }; struct sock; struct sock_array { struct sock **socks; u64 count; }; struct sock_address { b32 valid; enum sock_address_family family; /* NOTE: ipnb & portnb are stored in network byte order */ u8 ipnb[16]; u16 portnb; }; struct sock_read_result { b32 valid; /* Since data.len = 0 can be valid */ struct sock_address address; struct string data; }; struct sock_startup_receipt { i32 _; }; struct sock_startup_receipt sock_startup(void); struct sock_address sock_address_from_string(struct string str); struct sock_address sock_address_from_port(u16 port); struct string sock_string_from_address(struct arena *arena, struct sock_address address); INLINE b32 sock_address_eq(struct sock_address a, struct sock_address b) { return MEMEQ_STRUCT(&a, &b); } struct sock *sock_alloc(u16 listen_port, u64 sndbuf_size, u64 rcvbuf_size); void sock_release(struct sock *sock); /* Wake anyone blocking on sock read */ void sock_wake(struct sock *sock); struct sock *sock_wait_for_available_read(struct sock_array socks, f32 timeout); struct sock_read_result sock_read(struct sock *sock, struct string read_buff); void sock_write(struct sock *sock, struct sock_address address, struct string data); #endif