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