From 93450332fe1fb28922b6f701d15e2733bf6d8961 Mon Sep 17 00:00:00 2001
From: Přemysl Janouch
Date: Sat, 12 Jul 2014 23:06:39 +0200
Subject: Implement irc_try_read()
---
src/kike.c | 33 +++++++++++++++++++++++++++++++--
1 file changed, 31 insertions(+), 2 deletions(-)
(limited to 'src')
diff --git a/src/kike.c b/src/kike.c
index 80e554c..f79b537 100644
--- a/src/kike.c
+++ b/src/kike.c
@@ -380,8 +380,37 @@ irc_process_message (const struct irc_message *msg,
static bool
irc_try_read (struct connection *conn)
{
- // TODO
- return true;
+ struct str *buf = &conn->read_buffer;
+ ssize_t n_read;
+
+ while (true)
+ {
+ str_ensure_space (buf, 512);
+ n_read = recv (conn->socket_fd, buf->str + buf->len,
+ buf->alloc - buf->len - 1 /* null byte */, 0);
+
+ if (n_read > 0)
+ {
+ buf->str[buf->len += n_read] = '\0';
+ // TODO: discard characters above the 512 character limit
+ irc_process_buffer (buf, irc_process_message, conn);
+ continue;
+ }
+ if (n_read == 0)
+ {
+ connection_abort (conn, NULL);
+ return false;
+ }
+
+ if (errno == EAGAIN)
+ return true;
+ if (errno == EINTR)
+ continue;
+
+ print_debug ("%s: %s: %s", __func__, "recv", strerror (errno));
+ connection_abort (conn, strerror (errno));
+ return false;
+ }
}
static bool
--
cgit v1.2.3-70-g09d2