]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-master: Keep linked list of master_login_clients per connection
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Fri, 4 May 2018 10:07:50 +0000 (13:07 +0300)
committerVille Savolainen <ville.savolainen@dovecot.fi>
Fri, 18 May 2018 14:08:08 +0000 (17:08 +0300)
This allows improving logging on connection errors.

src/lib-master/master-login.c
src/lib-master/master-login.h

index c1206450d35099913c1f7e8ef541b568b68e1f8c..3e9fa9e6bcca2f838c0c3e245631626e5258a915 100644 (file)
@@ -24,6 +24,7 @@ struct master_login_connection {
        struct master_login_connection *prev, *next;
 
        struct master_login *login;
+       struct master_login_client *clients;
        int refcount;
        int fd;
        struct io *io;
@@ -192,6 +193,7 @@ static void master_login_client_free(struct master_login_client **_client)
                i_assert(client->conn->refcount > 1);
                client->conn->refcount--;
        }
+       DLLIST_REMOVE(&client->conn->clients, client);
        master_login_conn_unref(&client->conn);
        i_free(client->session_id);
        i_free(client);
@@ -444,6 +446,7 @@ static void master_login_conn_input(struct master_login_connection *conn)
        client->session_id = i_strndup(data, session_len);
        memcpy(client->data, data+i, req.data_size);
        conn->refcount++;
+       DLLIST_PREPEND(&conn->clients, client);
 
        master_login_auth_request(login->auth, &req,
                                  master_login_auth_callback, client);
@@ -491,6 +494,7 @@ static void master_login_conn_unref(struct master_login_connection **_conn)
                return;
 
        *_conn = NULL;
+       i_assert(conn->clients == NULL);
        master_login_conn_close(conn);
        o_stream_unref(&conn->output);
 
index 1b9014a4a336465c1f3f21833b8ffa0441edd074..e77ad04978a5c27d44d9e0f4454cff715126ad55 100644 (file)
@@ -6,6 +6,7 @@
 #define MASTER_POSTLOGIN_TIMEOUT_DEFAULT 60
 
 struct master_login_client {
+       struct master_login_client *prev, *next;
        struct master_login_connection *conn;
        int fd;