changeset 9882:52027b59beb5 HEAD

anvil: Fixed reading from FIFOs.
author Timo Sirainen <tss@iki.fi>
date Sun, 06 Sep 2009 15:47:46 -0400
parents 8ad868df4649
children 87fed6f0bbfe
files src/anvil/anvil-connection.c
diffstat 1 files changed, 23 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/anvil/anvil-connection.c	Fri Sep 04 18:10:19 2009 -0400
+++ b/src/anvil/anvil-connection.c	Sun Sep 06 15:47:46 2009 -0400
@@ -25,7 +25,7 @@
 	struct ostream *output;
 	struct io *io;
 	unsigned char *fifo_inbuf;
-	size_t fifo_inbuf_size;
+	size_t fifo_inbuf_size, fifo_inbuf_next;
 
 	unsigned int version_received:1;
 	unsigned int handshaked:1;
@@ -35,10 +35,30 @@
 struct anvil_connection *anvil_connections = NULL;
 
 static const char *
+anvil_connection_get_next_line(struct anvil_connection *conn)
+{
+	char *line, *p;
+
+	line = (char *)conn->fifo_inbuf + conn->fifo_inbuf_next;
+
+	p = strchr(line, '\n');
+	if (p == NULL)
+		conn->fifo_inbuf_next = 0;
+	else {
+		*p = '\0';
+		conn->fifo_inbuf_next = p - line + 1;
+	}
+	return line;
+}
+
+static const char *
 anvil_connection_fifo_read_line(struct anvil_connection *conn)
 {
 	ssize_t ret;
 
+	if (conn->fifo_inbuf_next > 0)
+		return anvil_connection_get_next_line(conn);
+
 	ret = read(conn->fd, conn->fifo_inbuf, conn->fifo_inbuf_size);
 	if (ret > 0) {
 		if (conn->fifo_inbuf[ret-1] != '\n') {
@@ -46,8 +66,9 @@
 			return NULL;
 		}
 		conn->fifo_inbuf[ret-1] = '\0';
-		return (const char *)conn->fifo_inbuf;
+		return anvil_connection_get_next_line(conn);
 	}
+
 	if (ret == 0) {
 		/* disconnected */
 	} else {