summaryrefslogtreecommitdiff
path: root/src/net.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/net.h')
-rw-r--r--src/net.h63
1 files changed, 63 insertions, 0 deletions
diff --git a/src/net.h b/src/net.h
new file mode 100644
index 0000000..08c566a
--- /dev/null
+++ b/src/net.h
@@ -0,0 +1,63 @@
+// SPDX-FileCopyrightText: 2024 Lizzy Fleckenstein <lizzy@vlhl.dev>
+//
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
+#ifndef NET_H
+#define NET_H
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <poll.h>
+#include <fcntl.h>
+#include "str.h"
+#include "ser.h"
+#include "content.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;
+ str *name;
+ 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;
+
+#define SEND_PKT(CONN, TYPE, ...) \
+ { strbuf pkt = NILSBUF; \
+ ser_pkt_type(&pkt, TYPE); \
+ __VA_ARGS__ \
+ if (!peer_send(&(CONN), pkt.data, pkt.len)) \
+ fprintf(stderr, "failed to send " #TYPE " to %.*s\n", PSTR(*(CONN).name)); \
+ free(pkt.data); }
+
+void invalid_pkt(peer *p, 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, str *name);
+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