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;
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,
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;
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);
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
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;
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);
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,