54 lines
1.4 KiB
C
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
|