]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib: connection - Add disconnected field
authorAki Tuomi <aki.tuomi@dovecot.fi>
Fri, 23 Nov 2018 11:44:17 +0000 (13:44 +0200)
committerAki Tuomi <aki.tuomi@dovecot.fi>
Tue, 27 Nov 2018 17:30:40 +0000 (19:30 +0200)
src/lib/connection.c
src/lib/connection.h

index 3cad53f4811f030723875b6b77d4985446e79705..05fb0f6e2c251c8946cbcd9798c354fabb7ec491 100644 (file)
@@ -129,6 +129,8 @@ void connection_input_resume(struct connection *conn)
 {
        const struct connection_settings *set = &conn->list->set;
 
+       i_assert(!conn->disconnected);
+
        if (conn->io != NULL)
                return;
        if (conn->from_streams || set->input_max_size != 0) {
@@ -173,6 +175,7 @@ static void connection_init_streams(struct connection *conn)
                o_stream_set_name(conn->output, conn->name);
                o_stream_switch_ioloop_to(conn->output, conn->ioloop);
        }
+       conn->disconnected = FALSE;
        connection_input_resume(conn);
        if (conn->input_idle_timeout_secs != 0) {
                conn->to = timeout_add_to(conn->ioloop,
@@ -229,6 +232,7 @@ void connection_init(struct connection_list *list,
        conn->ioloop = current_ioloop;
        conn->fd_in = -1;
        conn->fd_out = -1;
+       conn->disconnected = TRUE;
 
        i_free(conn->name);
 
@@ -361,6 +365,7 @@ void connection_init_from_streams(struct connection_list *list,
        event_set_append_log_prefix(conn->event,
                                    t_strdup_printf("(%s): ", conn->name));
 
+       conn->disconnected = FALSE;
        connection_input_resume(conn);
 
        if (list->v.client_connected != NULL)
@@ -397,6 +402,7 @@ int connection_client_connect(struct connection *conn)
                return -1;
        conn->fd_in = conn->fd_out = fd;
        conn->connect_started = ioloop_timeval;
+       conn->disconnected = FALSE;
 
        if (conn->port != 0 ||
            conn->list->set.delayed_unix_client_connected_callback) {
@@ -425,20 +431,19 @@ static void connection_update_counters(struct connection *conn)
 
 void connection_disconnect(struct connection *conn)
 {
+       if (conn->disconnected)
+               return;
        connection_update_counters(conn);
        /* client connects to a Server, and Server gets connection from Client */
        const char *ename = conn->list->set.client ?
                "server_connection_disconnected" :
                "client_connection_disconnected";
 
-       /* probably isn't connected anymore if it's 0 */
-       if (conn->fd_in > 0) {
-               struct event_passthrough *e = event_create_passthrough(conn->event)->
-                       set_name(ename)->
-                       add_str("reason", connection_disconnect_reason(conn));
-               e_debug(e->event(), "Disconnected: %s (fd=%u)",
-                       connection_disconnect_reason(conn), conn->fd_in);
-       }
+       struct event_passthrough *e = event_create_passthrough(conn->event)->
+               set_name(ename)->
+               add_str("reason", connection_disconnect_reason(conn));
+       e_debug(e->event(), "Disconnected: %s (fd=%u)",
+               connection_disconnect_reason(conn), conn->fd_in);
 
        conn->last_input = 0;
        i_zero(&conn->last_input_tv);
@@ -449,6 +454,7 @@ void connection_disconnect(struct connection *conn)
        o_stream_close(conn->output);
        o_stream_destroy(&conn->output);
        fd_close_maybe_stdio(&conn->fd_in, &conn->fd_out);
+       conn->disconnected = TRUE;
 }
 
 void connection_deinit(struct connection *conn)
index fe51b7b37e4d21ee5cf59c9d13fd5a5587b7f9f1..c5ffd18c938429b5ddaec90187b612a80a4d8581 100644 (file)
@@ -115,6 +115,7 @@ struct connection {
        bool version_received:1;
        bool unix_socket:1;
        bool from_streams:1;
+       bool disconnected:1;
 };
 
 struct connection_list {