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