Mercurial > dovecot > core-2.2
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 {