about summary refs log tree commit diff
path: root/peer.c
diff options
context:
space:
mode:
authorNakidai <nakidai@disroot.org>2026-01-04 17:41:32 +0300
committerNakidai <nakidai@disroot.org>2026-01-04 17:44:09 +0300
commit78426afe18d9ce730a4d92033ca261f9b2f173a0 (patch)
tree0c511b571e9a37496f170fce08737a849a8ba5ef /peer.c
downloadlibreircd-78426afe18d9ce730a4d92033ca261f9b2f173a0.tar.gz
libreircd-78426afe18d9ce730a4d92033ca261f9b2f173a0.zip
Add code
Diffstat (limited to 'peer.c')
-rw-r--r--peer.c73
1 files changed, 73 insertions, 0 deletions
diff --git a/peer.c b/peer.c
new file mode 100644
index 0000000..21dba70
--- /dev/null
+++ b/peer.c
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2026 Nakidai Perumenei <nakidai at disroot dot org>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include "ircd.h"
+
+#include <ctype.h>
+#include <stdio.h>
+#include <stddef.h>
+#include <string.h>
+
+#include <err.h>
+
+
+static void
+move(struct Peer *peer, size_t n)
+{
+	memmove(peer->buf, peer->buf + n, sizeof(peer->buf) - n);
+	memset(peer->buf + sizeof(peer->buf) - n, 0, n);
+	peer->recvd -= n;
+}
+
+int
+handle(struct Peer *peer)
+{
+	struct Message msg;
+	char *p, *c;
+
+	while ((p = memmem(peer->buf, sizeof(peer->buf), "\r\n", 2)))
+	{
+		if (memchr(peer->buf, '\0', p - peer->buf))
+		{
+			warnx("got 0 from %d", peer->fd);
+			goto next;
+		}
+
+		*p = 0;
+		if (parse_message(peer->buf, &msg))
+		{
+			warnx("malformed input from %d", peer->fd);
+			goto next;
+		}
+
+		for (c = msg.command; *c; ++c)
+			*c = tolower(*c);
+		if (find(msg.command)(&msg, peer))
+			return 1;
+next:
+		move(peer, p - peer->buf + 2);
+	}
+	if (peer->recvd == sizeof(peer->buf))
+	{
+		/*
+	 	* TODO: maybe somehow be more careful with peer data?
+	 	* or drop them?
+	 	*/
+		memset(peer->buf, 0, sizeof(peer->buf));
+		peer->recvd = 0;
+	}
+	return 0;
+}