# HG changeset patch # User Timo Sirainen # Date 1509110694 -10800 # Node ID ff99e7bff132b6fe5a19db32cf1b0c161087adf4 # Parent 98408dc069375bec38b7a153a84bf851a6b2abdc director: Allow proxy-notify to optionally be a socket Dovecot isn't using this currently, but it can be useful if external services want to send notifications. diff -r 98408dc06937 -r ff99e7bff132 src/director/main.c --- a/src/director/main.c Fri Oct 27 16:20:15 2017 +0300 +++ b/src/director/main.c Fri Oct 27 16:24:54 2017 +0300 @@ -32,7 +32,8 @@ 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 @@ 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 @@ 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 @@ 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; } } diff -r 98408dc06937 -r ff99e7bff132 src/director/notify-connection.c --- a/src/director/notify-connection.c Fri Oct 27 16:20:15 2017 +0300 +++ b/src/director/notify-connection.c Fri Oct 27 16:24:54 2017 +0300 @@ -19,6 +19,8 @@ struct io *io; struct istream *input; struct director *dir; + + bool fifo:1; }; static struct notify_connection *notify_connections = NULL; @@ -56,7 +58,8 @@ 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 @@ } } -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 @@ 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); } diff -r 98408dc06937 -r ff99e7bff132 src/director/notify-connection.h --- a/src/director/notify-connection.h Fri Oct 27 16:20:15 2017 +0300 +++ b/src/director/notify-connection.h Fri Oct 27 16:24:54 2017 +0300 @@ -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