]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
anvil: Fixed reading from FIFOs.
authorTimo Sirainen <tss@iki.fi>
Sun, 6 Sep 2009 19:47:46 +0000 (15:47 -0400)
committerTimo Sirainen <tss@iki.fi>
Sun, 6 Sep 2009 19:47:46 +0000 (15:47 -0400)
--HG--
branch : HEAD

src/anvil/anvil-connection.c

index 7868e9e3f4be66a1537231aee084eb13c5d31959..7314e9d0a22f1ffbf7af1814406b798bbdda8fa9 100644 (file)
@@ -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;
@@ -34,11 +34,31 @@ struct anvil_connection {
 
 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 @@ anvil_connection_fifo_read_line(struct anvil_connection *conn)
                        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 {