]> 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)
committerAki Tuomi <aki.tuomi@dovecot.fi>
Tue, 7 Nov 2017 13:11:05 +0000 (15:11 +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 306dc982ed5ff7bbb080fbd57de35c208d7f0c02..b7943d0673b3321ee8f9627625471f1d7bc0d298 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;
 }
@@ -176,7 +179,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;
        }
 
@@ -216,6 +219,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 f04818f75a3c32e83b3db89cc50be6276aa21285..86e90d356dfbbbf0a689a944ae798ccf72878388 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;
@@ -57,7 +59,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",
@@ -66,12 +69,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);
        conn->io = io_add(conn->fd, IO_READ, notify_connection_input, conn);
@@ -89,6 +93,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