summary refs log tree commit diff
diff options
context:
space:
mode:
authorNakidai <nakidai@disroot.org>2026-02-04 16:22:52 +0300
committerNakidai <nakidai@disroot.org>2026-02-04 16:42:42 +0300
commiteba9ea345af1f259bf27936f3d0941ab2a2f5bfb (patch)
tree95b86ef2c9f28dc56e0082ad4438375f74636a67
parentce0f41da41a2d97d4a8e7159747464ecef72de4c (diff)
downloadlibreircd-eba9ea345af1f259bf27936f3d0941ab2a2f5bfb.tar.gz
libreircd-eba9ea345af1f259bf27936f3d0941ab2a2f5bfb.zip
Allow lf as well as crlf
For configuration it's important to allow IRC messages to end with \n.
This also fixes a TODO from a previous commit and allows to connect to
ircd using netcat
-rw-r--r--config.irc4
-rw-r--r--peer.c15
2 files changed, 12 insertions, 7 deletions
diff --git a/config.irc b/config.irc
index 9902de4..d86cc62 100644
--- a/config.irc
+++ b/config.irc
@@ -1,2 +1,2 @@
-setcreation :Thu Jan 1 1970 at 00:00:00 UTC

-setinfo :The best IRC server ever \o/

+setcreation :Thu Jan 1 1970 at 00:00:00 UTC
+setinfo :The best IRC server ever \o/
diff --git a/peer.c b/peer.c
index e737f82..5ac80aa 100644
--- a/peer.c
+++ b/peer.c
@@ -37,19 +37,24 @@ handle(struct Peer *peer)
 {
 	struct Message msg;
 	char *p, *c;
+	int cr;
 
-	while ((p = memmem(peer->buf, sizeof(peer->buf), "\r\n", 2)))
+	while ((p = memchr(peer->buf, '\n', sizeof(peer->buf))))
 	{
+		cr = 0;
 		if (memchr(peer->buf, '\0', p - peer->buf))
 		{
 			warnx("got 0 from %d", peer->fd);
 			goto next;
 		}
+		if (p > peer->buf && p[-1] == '\r')
+		{
+			--p;
+			++cr;
+		}
 
 		*p = 0;
-		if (strchr(peer->buf, '\n')
-		 || strchr(peer->buf, '\r')
-		 || parse_message(peer->buf, &msg))
+		if (strchr(peer->buf, '\r') || parse_message(peer->buf, &msg))
 		{
 			warnx("malformed input from %d", peer->fd);
 			goto next;
@@ -60,7 +65,7 @@ handle(struct Peer *peer)
 		if (find(msg.command)(&msg, peer))
 			return 1;
 next:
-		move(peer, p - peer->buf + 2);
+		move(peer, p - peer->buf + cr + 1);
 	}
 	return 0;
 }