From: Timo Sirainen Date: Fri, 27 Oct 2017 13:24:54 +0000 (+0300) Subject: director: Allow proxy-notify to optionally be a socket X-Git-Tag: 2.3.0.rc1~501 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=9dd8a75971a2d9e46fb0c80feddc0aaec1181def;p=thirdparty%2Fdovecot%2Fcore.git 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 --git a/src/director/main.c b/src/director/main.c index 306dc982ed..b7943d0673 100644 --- a/src/director/main.c +++ b/src/director/main.c @@ -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; } } diff --git a/src/director/notify-connection.c b/src/director/notify-connection.c index f04818f75a..86e90d356d 100644 --- a/src/director/notify-connection.c +++ b/src/director/notify-connection.c @@ -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); } diff --git a/src/director/notify-connection.h b/src/director/notify-connection.h index 1a0d09e628..8f1bd02965 100644 --- a/src/director/notify-connection.h +++ b/src/director/notify-connection.h @@ -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