power_play/src/sock.h

54 lines
1.4 KiB
C

#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