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;
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;
}
if (conn->fifo) {
master_service_client_connection_accept(conn);
- notify_connection_init(director, conn->fd);
+ notify_connection_init(director, conn->fd, TRUE);
return;
}
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;
}
}
struct io *io;
struct istream *input;
struct director *dir;
+
+ bool fifo:1;
};
static struct notify_connection *notify_connections = NULL;
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",
}
}
-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);
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);
}