// SPDX-FileCopyrightText: 2024 Lizzy Fleckenstein // // SPDX-License-Identifier: AGPL-3.0-or-later #ifndef NET_H #define NET_H #include #include #include #include #include #include "str.h" #define SET_NONBLOCK(X) fcntl((X), F_SETFL, fcntl((X), F_GETFL, 0) | O_NONBLOCK) #define PEER_INBUFFER_SIZE 0x100000 // 1MB #define PEER_OUTBUFFER_SIZE 0x200000 // 2MB typedef uint32_t pkt_header; typedef struct { int socket; bool disco; struct { bool header; size_t len; size_t promised; uint8_t *buffer; } in; // TODO: ring buffer struct { size_t avail; size_t cursor; uint8_t *buffer; } out; } peer; void invalid_pkt(str from, str pkt); int socket_create(const char *host, const char *port, bool server); int socket_accept(int accept_fd); void peer_init(peer *p, int socket); void peer_free(peer *p); struct pollfd peer_prepare(peer *p); str peer_recv(peer *p, struct pollfd pfd); bool peer_send(peer *p, void *data, size_t len); #endif