]> 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 <timo.sirainen@dovecot.fi>
Tue, 7 Nov 2017 19:28:36 +0000 (21:28 +0200)
This callback gets called whenever director has performed
a kick.

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

index 31116732f33898f8cef8e2ff768bb77514d22c5e..e13403126cc4c3fa39abe235183c435d5c0b3e61 100644 (file)
@@ -986,6 +986,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;
 
@@ -1159,6 +1162,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,
@@ -1395,7 +1400,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;
 
@@ -1404,6 +1410,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 9537af69b0f21baf832601a3e67e18446f3fa003..74ded879ed1a281de22732d7bad9bf7d03978c39 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 55bbadb3c980a7164d1e254845eff81be50e1517..c248b99c1fd5b0ca34a2b769443c098049e2191b 100644 (file)
@@ -284,7 +284,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,