dovecot: Make sure all client connections are freed when exiting.
dovecot at dovecot.org
dovecot at dovecot.org
Wed Nov 28 09:16:20 EET 2007
details: http://hg.dovecot.org/dovecot/rev/373beccc2468
changeset: 6870:373beccc2468
user: Timo Sirainen <tss at iki.fi>
date: Wed Nov 28 09:16:17 2007 +0200
description:
Make sure all client connections are freed when exiting.
diffstat:
1 file changed, 19 insertions(+)
src/dict/dict-server.c | 19 +++++++++++++++++++
diffs (57 lines):
diff -r 5f97bba6df15 -r 373beccc2468 src/dict/dict-server.c
--- a/src/dict/dict-server.c Wed Nov 28 09:11:30 2007 +0200
+++ b/src/dict/dict-server.c Wed Nov 28 09:16:17 2007 +0200
@@ -19,6 +19,7 @@ struct dict_server_transaction {
};
struct dict_client_connection {
+ struct dict_client_connection *prev, *next;
struct dict_server *server;
char *username;
@@ -40,6 +41,8 @@ struct dict_server {
char *path;
int fd;
struct io *io;
+
+ struct dict_client_connection *connections;
};
struct dict_client_cmd {
@@ -412,6 +415,13 @@ static void dict_client_connection_deini
const struct dict_server_transaction *transactions;
unsigned int i, count;
+ if (conn->prev == NULL)
+ conn->server->connections = conn->next;
+ else
+ conn->prev->next = conn->next;
+ if (conn->next != NULL)
+ conn->next->prev = conn->prev;
+
if (array_is_created(&conn->transactions)) {
transactions = array_get(&conn->transactions, &count);
for (i = 0; i < count; i++)
@@ -444,6 +454,12 @@ dict_client_connection_init(struct dict_
FALSE);
conn->output = o_stream_create_fd(fd, 128*1024, FALSE);
conn->io = io_add(fd, IO_READ, dict_client_connection_input, conn);
+
+ if (server->connections != NULL) {
+ conn->next = server->connections;
+ server->connections->prev = conn;
+ }
+ server->connections = conn;
return conn;
}
@@ -494,6 +510,9 @@ struct dict_server *dict_server_init(con
void dict_server_deinit(struct dict_server *server)
{
+ while (server->connections != NULL)
+ dict_client_connection_deinit(server->connections);
+
io_remove(&server->io);
if (close(server->fd) < 0)
i_error("close(%s) failed: %m", server->path);
More information about the dovecot-cvs
mailing list