summary refs log tree commit diff
path: root/peer.c
diff options
context:
space:
mode:
Diffstat (limited to 'peer.c')
-rw-r--r--peer.c15
1 files changed, 10 insertions, 5 deletions
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;
 }