]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
director: Add kick_callback to director
authorAki Tuomi <aki.tuomi@dovecot.fi>
Tue, 7 Nov 2017 12:34:32 +0000 (14:34 +0200)
committerTimo Sirainen <tss@dovecot.fi>
Tue, 7 Nov 2017 14:51:38 +0000 (16:51 +0200)
This callback gets called whenever director has performed
a kick.

src/director/director.c
src/director/director.h
src/director/main.c

index ceab94cc4d68c36814875de5c4a148e955d8b1e7..4443b622338ea1c0f8d735c130b031a3caf7e128 100644 (file)
@@ -982,6 +982,9 @@ static void director_kill_user_callback(enum ipc_client_cmd_state state,
 
        i_assert(ctx->dir->users_kicking_count > 0);
        ctx->dir->users_kicking_count--;
+       if (ctx->dir->kick_callback != NULL)
+               ctx->dir->kick_callback(ctx->dir);
+
 
        ctx->callback_pending = FALSE;
 
@@ -1155,6 +1158,8 @@ director_kick_user_callback(enum ipc_client_cmd_state state,
 
        i_assert(dir->users_kicking_count > 0);
        dir->users_kicking_count--;
+       if (dir->kick_callback != NULL)
+               dir->kick_callback(dir);
 }
 
 void director_kick_user(struct director *dir, struct director_host *src,
@@ -1390,7 +1395,8 @@ static void director_user_freed(struct user *user)
 struct director *
 director_init(const struct director_settings *set,
              const struct ip_addr *listen_ip, in_port_t listen_port,
-             director_state_change_callback_t *callback)
+             director_state_change_callback_t *callback,
+             director_kick_callback_t *kick_callback)
 {
        struct director *dir;
 
@@ -1399,6 +1405,7 @@ director_init(const struct director_settings *set,
        dir->self_port = listen_port;
        dir->self_ip = *listen_ip;
        dir->state_change_callback = callback;
+       dir->kick_callback = kick_callback;
        i_array_init(&dir->dir_hosts, 16);
        i_array_init(&dir->pending_requests, 16);
        i_array_init(&dir->connections, 8);
index 71cb4041f8a8bac2b760eb2f68e79a4628799513..2f582aa661abc4aa46048c4a1b47e2806d50417d 100644 (file)
@@ -63,6 +63,7 @@ enum user_kill_state {
 extern const char *user_kill_state_names[USER_KILL_STATE_DELAY+1];
 
 typedef void director_state_change_callback_t(struct director *dir);
+typedef director_state_change_callback_t director_kick_callback_t;
 
 /* When a user gets freed, the kill_ctx may still be left alive. It's also
    possible for the user to come back, in which case the kill_ctx is usually
@@ -132,6 +133,7 @@ struct director {
        struct timeout *to_handshake_warning;
 
        director_state_change_callback_t *state_change_callback;
+       director_kick_callback_t *kick_callback;
 
        /* director hosts are sorted by IP (and port) */
        ARRAY(struct director_host *) dir_hosts;
@@ -174,7 +176,8 @@ extern bool director_debug;
 struct director *
 director_init(const struct director_settings *set,
              const struct ip_addr *listen_ip, in_port_t listen_port,
-             director_state_change_callback_t *callback);
+             director_state_change_callback_t *callback,
+             director_kick_callback_t *kick_callback);
 void director_deinit(struct director **dir);
 void director_find_self(struct director *dir);
 
index b7943d0673b3321ee8f9627625471f1d7bc0d298..20c16a6f4b098f6eaeccc33b5e35bddcb557d3f0 100644 (file)
@@ -279,7 +279,7 @@ static void main_preinit(void)
 
        directors_init();
        director = director_init(set, &listen_ip, listen_port,
-                                director_state_changed);
+                                director_state_changed, NULL);
        director_host_add_from_string(director, set->director_servers);
        director_find_self(director);
        if (mail_hosts_parse_and_add(director->mail_hosts,