/* Copyright (c) 2011-2016 Dovecot authors, see the included COPYING file */
#include "lib.h"
+#include "llist.h"
#include "strescape.h"
#include "istream.h"
#include "ostream.h"
#define MAX_INBUF_SIZE (PIPE_BUF*2)
struct fifo_input_connection {
+ struct fifo_input_connection *prev, *next;
+
int fd;
struct istream *input;
struct io *io;
};
+static struct fifo_input_connection *fifo_conns = NULL;
+
static int
fifo_input_connection_request(const char *const *args, const char **error_r)
{
conn->fd = fd;
conn->input = i_stream_create_fd(fd, MAX_INBUF_SIZE, FALSE);
conn->io = io_add(fd, IO_READ, fifo_input_connection_input, conn);
+ DLLIST_PREPEND(&fifo_conns, conn);
return conn;
}
*_conn = NULL;
+ DLLIST_REMOVE(&fifo_conns, conn);
io_remove(&conn->io);
i_stream_destroy(&conn->input);
if (close(conn->fd) < 0)
i_error("close(conn) failed: %m");
i_free(conn);
}
+
+void fifo_input_connections_destroy_all(void)
+{
+ while (fifo_conns != NULL) {
+ struct fifo_input_connection *conn = fifo_conns;
+
+ fifo_input_connection_destroy(&conn);
+ }
+}
#include "mail-stats.h"
#include "client.h"
-static struct fifo_input_connection *fifo_input_conn = NULL;
static struct module *modules = NULL;
static void client_connected(struct master_service_connection *conn)
{
- if (conn->fifo) {
- if (fifo_input_conn != NULL) {
- i_error("Received another mail-server connection");
- return;
- }
- fifo_input_conn = fifo_input_connection_create(conn->fd);
- } else {
+ if (conn->fifo)
+ (void)fifo_input_connection_create(conn->fd);
+ else
(void)client_create(conn->fd);
- }
master_service_client_connection_accept(conn);
}
master_service_run(master_service, client_connected);
clients_destroy_all();
+ fifo_input_connections_destroy_all();
mail_commands_deinit();
mail_sessions_deinit();
mail_users_deinit();
mail_ips_deinit();
mail_global_deinit();
- if (fifo_input_conn != NULL)
- fifo_input_connection_destroy(&fifo_input_conn);
-
module_dir_unload(&modules);
i_assert(global_used_memory == 0);
master_service_deinit(&master_service);