]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
stats: Support multiple FIFO listeners.
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Tue, 26 Apr 2016 14:12:25 +0000 (17:12 +0300)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Tue, 26 Apr 2016 14:13:00 +0000 (17:13 +0300)
src/stats/fifo-input-connection.c
src/stats/fifo-input-connection.h
src/stats/main.c

index 64a623d16e93eeccc69e87605cf6157f317b8e13..4c9e060414ed518c28359a47e46832678ffca515 100644 (file)
@@ -1,6 +1,7 @@
 /* Copyright (c) 2011-2016 Dovecot authors, see the included COPYING file */
 
 #include "lib.h"
+#include "llist.h"
 #include "strescape.h"
 #include "istream.h"
 #include "ostream.h"
 #define MAX_INBUF_SIZE (PIPE_BUF*2)
 
 struct fifo_input_connection {
+       struct fifo_input_connection *prev, *next;
+
        int fd;
        struct istream *input;
        struct io *io;
 };
 
+static struct fifo_input_connection *fifo_conns = NULL;
+
 static int
 fifo_input_connection_request(const char *const *args, const char **error_r)
 {
@@ -75,6 +80,7 @@ struct fifo_input_connection *fifo_input_connection_create(int fd)
        conn->fd = fd;
        conn->input = i_stream_create_fd(fd, MAX_INBUF_SIZE, FALSE);
        conn->io = io_add(fd, IO_READ, fifo_input_connection_input, conn);
+       DLLIST_PREPEND(&fifo_conns, conn);
        return conn;
 }
 
@@ -84,9 +90,19 @@ void fifo_input_connection_destroy(struct fifo_input_connection **_conn)
 
        *_conn = NULL;
 
+       DLLIST_REMOVE(&fifo_conns, conn);
        io_remove(&conn->io);
        i_stream_destroy(&conn->input);
        if (close(conn->fd) < 0)
                i_error("close(conn) failed: %m");
        i_free(conn);
 }
+
+void fifo_input_connections_destroy_all(void)
+{
+       while (fifo_conns != NULL) {
+               struct fifo_input_connection *conn = fifo_conns;
+
+               fifo_input_connection_destroy(&conn);
+       }
+}
index af6bad644e758ac075f48f99293d40ba725d5a7d..ff394a50603284fb820dd1a625daebba0ef2be47 100644 (file)
@@ -4,4 +4,6 @@
 struct fifo_input_connection *fifo_input_connection_create(int fd);
 void fifo_input_connection_destroy(struct fifo_input_connection **conn);
 
+void fifo_input_connections_destroy_all(void);
+
 #endif
index e81ce505f448aeae9cef130cf710296ce73d1ef7..c731d548501ce0f5f3955476ba2902f8dac52cc1 100644 (file)
 #include "mail-stats.h"
 #include "client.h"
 
-static struct fifo_input_connection *fifo_input_conn = NULL;
 static struct module *modules = NULL;
 
 static void client_connected(struct master_service_connection *conn)
 {
-       if (conn->fifo) {
-               if (fifo_input_conn != NULL) {
-                       i_error("Received another mail-server connection");
-                       return;
-               }
-               fifo_input_conn = fifo_input_connection_create(conn->fd);
-       } else {
+       if (conn->fifo)
+               (void)fifo_input_connection_create(conn->fd);
+       else
                (void)client_create(conn->fd);
-       }
        master_service_client_connection_accept(conn);
 }
 
@@ -85,6 +79,7 @@ int main(int argc, char *argv[])
        master_service_run(master_service, client_connected);
 
        clients_destroy_all();
+       fifo_input_connections_destroy_all();
        mail_commands_deinit();
        mail_sessions_deinit();
        mail_users_deinit();
@@ -92,9 +87,6 @@ int main(int argc, char *argv[])
        mail_ips_deinit();
        mail_global_deinit();
 
-       if (fifo_input_conn != NULL)
-               fifo_input_connection_destroy(&fifo_input_conn);
-
        module_dir_unload(&modules);
        i_assert(global_used_memory == 0);
        master_service_deinit(&master_service);