/* Copyright (c) 2010-2013 Dovecot authors, see the included COPYING file */
#include "lib.h"
+#include "lib-signals.h"
#include "base64.h"
#include "ioloop.h"
#include "istream.h"
const struct mail_storage_service_input *input)
{
const char *error;
+ struct ioloop *ioloop, *prev_ioloop = current_ioloop;
int ret;
ctx->conn = conn;
+ /* some commands will want to call io_loop_run(), but we're already
+ running one and we can't call the original one recursively, so
+ create a new ioloop. */
+ ioloop = io_loop_create();
+ lib_signals_reset_ioloop();
if (ctx->v.preinit != NULL)
ctx->v.preinit(ctx);
doveadm_print_flush();
mail_storage_service_deinit(&ctx->storage_service);
+ current_ioloop = prev_ioloop;
+ lib_signals_reset_ioloop();
+ current_ioloop = ioloop;
+ io_loop_destroy(&ioloop);
+
if (ret < 0) {
i_error("%s: %s", ctx->cmd->name, error);
o_stream_nsend(conn->output, "\n-\n", 3);
return FALSE;
}
- /* make sure client_connection_input() isn't called by the ioloop that
- is going to be run by doveadm_mail_cmd_server_run() */
- io_remove(&conn->io);
-
o_stream_cork(conn->output);
ctx = doveadm_mail_cmd_server_parse(cmd_name, conn->set, &input, argc, args);
if (ctx == NULL)
net_set_nonblock(conn->fd, FALSE);
(void)o_stream_flush(conn->output);
net_set_nonblock(conn->fd, TRUE);
-
- conn->io = io_add(conn->fd, IO_READ, client_connection_input, conn);
return TRUE;
}
unsigned int count = array_count(&server->queue);
do {
- master_service_run(master_service, NULL);
+ io_loop_run(current_ioloop);
} while (array_count(&server->queue) == count &&
doveadm_server_have_used_connections(server) &&
!DOVEADM_MAIL_SERVER_FAILED());