dovecot-2.0: anvil: Fixed reading from FIFOs.

dovecot at dovecot.org dovecot at dovecot.org
Sun Sep 6 22:47:53 EEST 2009


details:   http://hg.dovecot.org/dovecot-2.0/rev/52027b59beb5
changeset: 9882:52027b59beb5
user:      Timo Sirainen <tss at iki.fi>
date:      Sun Sep 06 15:47:46 2009 -0400
description:
anvil: Fixed reading from FIFOs.

diffstat:

1 file changed, 24 insertions(+), 3 deletions(-)
src/anvil/anvil-connection.c |   27 ++++++++++++++++++++++++---

diffs (54 lines):

diff -r 8ad868df4649 -r 52027b59beb5 src/anvil/anvil-connection.c
--- 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 anvil_connection {
 	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,9 +35,29 @@ struct anvil_connection *anvil_connectio
 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) {
@@ -46,8 +66,9 @@ anvil_connection_fifo_read_line(struct a
 			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 {


More information about the dovecot-cvs mailing list