]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
director: Allow proxy-notify to optionally be a socket
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Fri, 27 Oct 2017 13:24:54 +0000 (16:24 +0300)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Tue, 7 Nov 2017 19:28:19 +0000 (21:28 +0200)
Dovecot isn't using this currently, but it can be useful if external
services want to send notifications.

src/director/main.c
src/director/notify-connection.c
src/director/notify-connection.h

index d51ebbc917a017ce9c1e4965b9bb954591d276a6..55bbadb3c980a7164d1e254845eff81be50e1517 100644 (file)
@@ -32,7 +32,8 @@ enum director_socket_type {
        DIRECTOR_SOCKET_TYPE_USERDB,
        DIRECTOR_SOCKET_TYPE_AUTHREPLY,
        DIRECTOR_SOCKET_TYPE_RING,
-       DIRECTOR_SOCKET_TYPE_DOVEADM
+       DIRECTOR_SOCKET_TYPE_DOVEADM,
+       DIRECTOR_SOCKET_TYPE_PROXY_NOTIFY,
 };
 
 static struct director *director;
@@ -104,6 +105,8 @@ director_socket_type_get_from_name(const char *path)
        else if (strcmp(suffix, "admin") == 0 ||
                 strcmp(suffix, "doveadm") == 0)
                return DIRECTOR_SOCKET_TYPE_DOVEADM;
+       else if (strcmp(suffix, "notify") == 0)
+               return DIRECTOR_SOCKET_TYPE_PROXY_NOTIFY;
        else
                return DIRECTOR_SOCKET_TYPE_UNKNOWN;
 }
@@ -181,7 +184,7 @@ static void client_connected(struct master_service_connection *conn)
 
        if (conn->fifo) {
                master_service_client_connection_accept(conn);
-               notify_connection_init(director, conn->fd);
+               notify_connection_init(director, conn->fd, TRUE);
                return;
        }
 
@@ -221,6 +224,10 @@ static void client_connected(struct master_service_connection *conn)
                master_service_client_connection_accept(conn);
                (void)doveadm_connection_init(director, conn->fd);
                break;
+       case DIRECTOR_SOCKET_TYPE_PROXY_NOTIFY:
+               master_service_client_connection_accept(conn);
+               notify_connection_init(director, conn->fd, FALSE);
+               break;
        }
 }
 
index 2ba62addb7f990cac1fe5e01e37f1b357e084bb6..1f6686a3538a3e0cf3fddb645c385b4646217f20 100644 (file)
@@ -19,6 +19,8 @@ struct notify_connection {
        struct io *io;
        struct istream *input;
        struct director *dir;
+
+       bool fifo:1;
 };
 
 static struct notify_connection *notify_connections = NULL;
@@ -56,7 +58,8 @@ static void notify_connection_input(struct notify_connection *conn)
                        notify_update_user(conn->dir, *tagp, line, hash);
        }
        if (conn->input->eof) {
-               i_error("notify: read() unexpectedly returned EOF");
+               if (conn->fifo)
+                       i_error("notify: read() unexpectedly returned EOF");
                notify_connection_deinit(&conn);
        } else if (conn->input->stream_errno != 0) {
                i_error("notify: read() failed: %s",
@@ -65,12 +68,13 @@ static void notify_connection_input(struct notify_connection *conn)
        }
 }
 
-void notify_connection_init(struct director *dir, int fd)
+void notify_connection_init(struct director *dir, int fd, bool fifo)
 {
        struct notify_connection *conn;
 
        conn = i_new(struct notify_connection, 1);
        conn->fd = fd;
+       conn->fifo = fifo;
        conn->dir = dir;
        conn->input = i_stream_create_fd(conn->fd, 1024, FALSE);
        conn->io = io_add(conn->fd, IO_READ, notify_connection_input, conn);
@@ -88,6 +92,8 @@ static void notify_connection_deinit(struct notify_connection **_conn)
        i_stream_unref(&conn->input);
        if (close(conn->fd) < 0)
                i_error("close(notify connection) failed: %m");
+       if (!conn->fifo)
+               master_service_client_connection_destroyed(master_service);
        i_free(conn);
 }
 
index 1a0d09e62829d42e7dc73b4113c360773fa8b323..8f1bd029654de2f8d6cf1283de60329b0108029c 100644 (file)
@@ -3,7 +3,7 @@
 
 struct director;
 
-void notify_connection_init(struct director *dir, int fd);
+void notify_connection_init(struct director *dir, int fd, bool fifo);
 void notify_connections_deinit(void);
 
 #endif