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