struct doveadm_mail_server_cmd {
struct doveadm_server *server;
struct doveadm_client *conn;
+ struct doveadm_mail_cmd_context *cmd_ctx;
char *username;
ARRAY(struct doveadm_proxy_redirect) redirect_path;
static HASH_TABLE(char *, struct doveadm_server *) servers;
static pool_t server_pool;
-static struct doveadm_mail_cmd_context *cmd_ctx;
static bool internal_failure = FALSE;
static ARRAY(struct doveadm_server_request) doveadm_server_request_queue;
void *context);
static void doveadm_mail_server_handle(struct doveadm_server *server,
struct doveadm_client *conn,
+ struct doveadm_mail_cmd_context *cmd_ctx,
const char *username,
bool print_username);
enum auth_proxy_ssl_flags ssl_flags,
const char **error_r)
{
+ struct doveadm_mail_cmd_context *cmd_ctx = servercmd->cmd_ctx;
struct doveadm_server *new_server;
struct doveadm_client *conn;
struct doveadm_proxy_redirect *redirect;
const char *host, in_port_t port,
const char *destuser, const char **error_r)
{
+ struct doveadm_mail_cmd_context *cmd_ctx = servercmd->cmd_ctx;
struct auth_proxy_settings proxy_set;
const char *const *fields, *auth_socket_path;
pool_t auth_pool;
const char *destination)
{
struct doveadm_server *orig_server = servercmd->server;
+ struct doveadm_mail_cmd_context *cmd_ctx = servercmd->cmd_ctx;
const struct doveadm_client_settings *client_set =
doveadm_client_get_settings(servercmd->conn);
struct ip_addr ip;
{
struct doveadm_mail_server_cmd *servercmd = context;
struct doveadm_client *conn = servercmd->conn;
+ struct doveadm_mail_cmd_context *cmd_ctx = servercmd->cmd_ctx;
struct doveadm_server *server = servercmd->server;
struct doveadm_server_request *request;
int ret;
request);
array_delete(&doveadm_server_request_queue, idx, 1);
- doveadm_mail_server_handle(server, conn,
+ doveadm_mail_server_handle(server, conn, cmd_ctx,
request_copy.username,
request_copy.print_username);
doveadm_server_request_free(&request_copy);
static void doveadm_mail_server_handle(struct doveadm_server *server,
struct doveadm_client *conn,
+ struct doveadm_mail_cmd_context *cmd_ctx,
const char *username,
bool print_username)
{
servercmd = i_new(struct doveadm_mail_server_cmd, 1);
servercmd->conn = conn;
servercmd->server = server;
+ servercmd->cmd_ctx = cmd_ctx;
servercmd->username = i_strdup(username);
servercmd->cmdline = i_strdup(str_c(cmd));
servercmd->input = cmd_ctx->cmd_input;
doveadm_cmd_callback, servercmd);
}
-static int doveadm_mail_server_request_queue_handle_next(const char **error_r)
+static int
+doveadm_mail_server_request_queue_handle_next(struct doveadm_mail_cmd_context *cmd_ctx,
+ const char **error_r)
{
struct doveadm_server_request *request, request_copy;
struct doveadm_client *conn;
internal_failure = TRUE;
return -1;
}
- doveadm_mail_server_handle(request_copy.server, conn,
+ doveadm_mail_server_handle(request_copy.server, conn, cmd_ctx,
request_copy.username,
request_copy.print_username);
doveadm_server_request_free(&request_copy);
doveadm_print_is_initialized() && !ctx->iterate_single_user;
int ret;
- i_assert(cmd_ctx == ctx || cmd_ctx == NULL);
- cmd_ctx = ctx;
-
doveadm_mail_cmd_extra_fields_parse(ctx);
ret = doveadm_mail_server_user_get_host(ctx, &proxy_set, &socket_path,
&referral, error_r);
connections. */
if (doveadm_clients_count() < limit &&
array_count(&doveadm_server_request_queue) > 0) {
- if (doveadm_mail_server_request_queue_handle_next(error_r) < 0)
+ if (doveadm_mail_server_request_queue_handle_next(ctx, error_r) < 0)
return -1;
continue;
}
internal_failure = TRUE;
return -1;
} else {
- doveadm_mail_server_handle(server, conn,
+ doveadm_mail_server_handle(server, conn, ctx,
proxy_set.username,
print_username);
doveadm_client_unref(&conn);
return DOVEADM_MAIL_SERVER_FAILED() ? -1 : 1;
}
-void doveadm_mail_server_flush(void)
+void doveadm_mail_server_flush(struct doveadm_mail_cmd_context *ctx)
{
struct doveadm_server_request *request;
const char *error;
- if (!hash_table_is_created(servers)) {
- cmd_ctx = NULL;
+ if (!hash_table_is_created(servers))
return;
- }
/* flush the queue */
unsigned int limit = I_MAX(doveadm_settings->doveadm_worker_count, 1);
if (array_count(&doveadm_server_request_queue) == 0)
break;
- if (doveadm_mail_server_request_queue_handle_next(&error) < 0) {
- e_error(cmd_ctx->cctx->event, "%s", error);
+ if (doveadm_mail_server_request_queue_handle_next(ctx, &error) < 0) {
+ e_error(ctx->cctx->event, "%s", error);
break;
}
}
doveadm_clients_destroy_all();
if (master_service_is_killed(master_service))
- e_error(cmd_ctx->cctx->event, "Aborted");
+ e_error(ctx->cctx->event, "Aborted");
if (DOVEADM_MAIL_SERVER_FAILED())
- doveadm_mail_failed_error(cmd_ctx, MAIL_ERROR_TEMP);
+ doveadm_mail_failed_error(ctx, MAIL_ERROR_TEMP);
/* queue may not be empty if something failed */
array_foreach_modifiable(&doveadm_server_request_queue, request)
array_free(&doveadm_server_request_queue);
hash_table_destroy(&servers);
pool_unref(&server_pool);
- cmd_ctx = NULL;
}