changeset 22658:ff99e7bff132

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.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Fri, 27 Oct 2017 16:24:54 +0300
parents 98408dc06937
children 69f827f71014
files src/director/main.c src/director/notify-connection.c src/director/notify-connection.h
diffstat 3 files changed, 18 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- 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;
 	}
 }
 
--- 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);
 }
 
--- 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