]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
director: Support multiple proxy-notify connections
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Fri, 27 Oct 2017 13:20:15 +0000 (16:20 +0300)
committerAki Tuomi <aki.tuomi@dovecot.fi>
Tue, 7 Nov 2017 13:11:05 +0000 (15:11 +0200)
src/director/main.c
src/director/notify-connection.c
src/director/notify-connection.h

index 09b4023e7f9788fcf3b17dceeb7253fa79c65a4c..306dc982ed5ff7bbb080fbd57de35c208d7f0c02 100644 (file)
@@ -36,7 +36,6 @@ enum director_socket_type {
 };
 
 static struct director *director;
-static struct notify_connection *notify_conn;
 static struct timeout *to_proctitle_refresh;
 static ARRAY(enum director_socket_type) listener_socket_types;
 
@@ -176,12 +175,8 @@ static void client_connected(struct master_service_connection *conn)
        bool userdb;
 
        if (conn->fifo) {
-               if (notify_conn != NULL) {
-                       i_error("Received another proxy-notify connection");
-                       return;
-               }
                master_service_client_connection_accept(conn);
-               notify_conn = notify_connection_init(director, conn->fd);
+               notify_connection_init(director, conn->fd);
                return;
        }
 
@@ -292,8 +287,7 @@ static void main_preinit(void)
 static void main_deinit(void)
 {
        timeout_remove(&to_proctitle_refresh);
-       if (notify_conn != NULL)
-               notify_connection_deinit(&notify_conn);
+       notify_connections_deinit();
        /* deinit doveadm connections before director, so it can clean up
           its pending work, such as abort user moves. */
        doveadm_connections_deinit();
index 74607bab0fc989ba7a13c43780d5f2f7b1446f05..f04818f75a3c32e83b3db89cc50be6276aa21285 100644 (file)
@@ -2,6 +2,7 @@
 
 #include "lib.h"
 #include "array.h"
+#include "llist.h"
 #include "ioloop.h"
 #include "istream.h"
 #include "master-service.h"
 #include <unistd.h>
 
 struct notify_connection {
+       struct notify_connection *prev, *next;
+
        int fd;
        struct io *io;
        struct istream *input;
        struct director *dir;
 };
 
+static struct notify_connection *notify_connections = NULL;
+
+static void notify_connection_deinit(struct notify_connection **_conn);
+
 static void notify_update_user(struct director *dir, struct mail_tag *tag,
                               const char *username, unsigned int username_hash)
 {
@@ -59,8 +66,7 @@ static void notify_connection_input(struct notify_connection *conn)
        }
 }
 
-struct notify_connection *
-notify_connection_init(struct director *dir, int fd)
+void notify_connection_init(struct director *dir, int fd)
 {
        struct notify_connection *conn;
 
@@ -69,18 +75,27 @@ notify_connection_init(struct director *dir, int fd)
        conn->dir = dir;
        conn->input = i_stream_create_fd(conn->fd, 1024);
        conn->io = io_add(conn->fd, IO_READ, notify_connection_input, conn);
-       return conn;
+       DLLIST_PREPEND(&notify_connections, conn);
 }
 
-void notify_connection_deinit(struct notify_connection **_conn)
+static void notify_connection_deinit(struct notify_connection **_conn)
 {
        struct notify_connection *conn = *_conn;
 
        *_conn = NULL;
 
+       DLLIST_REMOVE(&notify_connections, conn);
        io_remove(&conn->io);
        i_stream_unref(&conn->input);
        if (close(conn->fd) < 0)
                i_error("close(notify connection) failed: %m");
        i_free(conn);
 }
+
+void notify_connections_deinit(void)
+{
+       while (notify_connections != NULL) {
+               struct notify_connection *conn = notify_connections;
+               notify_connection_deinit(&conn);
+       }
+}
index cb6217015e13a69c1d7b7d5945c309391e780297..1a0d09e62829d42e7dc73b4113c360773fa8b323 100644 (file)
@@ -3,7 +3,7 @@
 
 struct director;
 
-struct notify_connection *notify_connection_init(struct director *dir, int fd);
-void notify_connection_deinit(struct notify_connection **conn);
+void notify_connection_init(struct director *dir, int fd);
+void notify_connections_deinit(void);
 
 #endif