doveadm-mail.c revision b4adb461ce12bf578d2d70806b205cf3cbf1a51d
2454dfa32c93c20a8522c6ed42fe057baaac9f9aStephan Bosch/* Copyright (c) 2009-2017 Dovecot authors, see the included COPYING file */
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipek#define DOVEADM_MAIL_CMD_INPUT_TIMEOUT_MSECS (5*60*1000)
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' SipekARRAY_TYPE(doveadm_mail_cmd) doveadm_mail_cmds;
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipekvoid (*hook_doveadm_mail_init)(struct doveadm_mail_cmd_context *ctx);
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipek doveadm_mail_cmd_module_register = { 0 };
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipekvoid doveadm_mail_failed_error(struct doveadm_mail_cmd_context *ctx,
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipek /* tempfail overrides all other exit codes, otherwise use whatever
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipek error happened first */
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipek if (ctx->exit_code == 0 || exit_code == EX_TEMPFAIL)
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipekvoid doveadm_mail_failed_storage(struct doveadm_mail_cmd_context *ctx,
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipek mail_storage_get_last_error(storage, &error);
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipekvoid doveadm_mail_failed_mailbox(struct doveadm_mail_cmd_context *ctx,
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipek doveadm_mail_failed_storage(ctx, mailbox_get_storage(box));
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipekvoid doveadm_mail_failed_list(struct doveadm_mail_cmd_context *ctx,
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipek mailbox_list_get_last_error(list, &error);
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipek i_assert(size >= sizeof(struct doveadm_mail_cmd_context));
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipek pool = pool_alloconly_create("doveadm mail cmd", 1024);
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipekcmd_purge_run(struct doveadm_mail_cmd_context *ctx, struct mail_user *user)
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipek for (ns = user->namespaces; ns != NULL; ns = ns->next) {
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipek if (ns->type != MAIL_NAMESPACE_TYPE_PRIVATE ||
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipek storage = mail_namespace_get_default_storage(ns);
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipek i_error("Purging namespace '%s' failed: %s", ns->prefix,
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipek mail_storage_get_last_error(storage, NULL));
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipek doveadm_mail_failed_storage(ctx, storage);
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipekstatic struct doveadm_mail_cmd_context *cmd_purge_alloc(void)
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipek ctx = doveadm_mail_cmd_alloc(struct doveadm_mail_cmd_context);
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipekstatic void doveadm_mail_cmd_input_input(struct doveadm_mail_cmd_context *ctx)
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipek const unsigned char *data;
3bb59b47d47cba85a92df67823b0e49d2c383307Timo Sirainen while (i_stream_read_more(ctx->cmd_input, &data, &size) > 0)
3bb59b47d47cba85a92df67823b0e49d2c383307Timo Sirainenstatic void doveadm_mail_cmd_input_timeout(struct doveadm_mail_cmd_context *ctx)
3bb59b47d47cba85a92df67823b0e49d2c383307Timo Sirainen input = i_stream_create_error_str(ETIMEDOUT, "Timed out in %u secs",
3bb59b47d47cba85a92df67823b0e49d2c383307Timo Sirainen i_stream_set_name(input, i_stream_get_name(ctx->cmd_input));
3bb59b47d47cba85a92df67823b0e49d2c383307Timo Sirainenstatic void doveadm_mail_cmd_input_read(struct doveadm_mail_cmd_context *ctx)
3bb59b47d47cba85a92df67823b0e49d2c383307Timo Sirainen to = timeout_add(DOVEADM_MAIL_CMD_INPUT_TIMEOUT_MSECS,
3bb59b47d47cba85a92df67823b0e49d2c383307Timo Sirainen /* read the pending input from stream. */
3bb59b47d47cba85a92df67823b0e49d2c383307Timo Sirainenvoid doveadm_mail_get_input(struct doveadm_mail_cmd_context *ctx)
3bb59b47d47cba85a92df67823b0e49d2c383307Timo Sirainen inputs[0] = i_stream_create_dot(ctx->conn->input, FALSE);
3bb59b47d47cba85a92df67823b0e49d2c383307Timo Sirainen inputs[0] = i_stream_create_fd(STDIN_FILENO, 1024*1024);
3bb59b47d47cba85a92df67823b0e49d2c383307Timo Sirainen ctx->cmd_input_fd = i_stream_get_fd(inputs[0]);
3bb59b47d47cba85a92df67823b0e49d2c383307Timo Sirainen ctx->cmd_input = i_stream_create_seekable_path(inputs, 1024*256,
3bb59b47d47cba85a92df67823b0e49d2c383307Timo Sirainen i_stream_set_name(ctx->cmd_input, i_stream_get_name(inputs[0]));
3bb59b47d47cba85a92df67823b0e49d2c383307Timo Sirainendoveadm_mailbox_find(struct mail_user *user, const char *mailbox)
7c681809344b880aae61e99b6ab74ae19945ff9eAki Tuomi ns = mail_namespace_find(user->namespaces, mailbox);
7c681809344b880aae61e99b6ab74ae19945ff9eAki Tuomi return mailbox_alloc(ns->list, mailbox, MAILBOX_FLAG_IGNORE_ACLS);
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipekdoveadm_mail_build_search_args(const char *const args[])
return sargs;
int ret = 0;
return ret;
int ret = 0;
} T_END;
return ret;
const char *const args[])
return ctx;
const char **error_r)
int ret;
if (ret != 0)
return ret;
if (ret <= 0) {
if (ret < 0) {
error);
return ret;
if (ret < 0) {
return ret;
const char **error_r)
const char *wildcard_user)
unsigned int user_idx;
int ret;
user_idx = 0;
T_BEGIN {
if (ret < 0)
else if (ret == 0)
} T_END;
if (doveadm_verbose) {
if (killed_signo != 0) {
if (doveadm_verbose)
if (ret < 0) {
const char **username_r)
struct doveadm_mail_cmd_context *
return ctx;
static struct doveadm_mail_cmd_context *
if (doveadm_debug)
return ctx;
const char *wildcard_user)
int ret;
const char *error;
if (doveadm_print_is_initialized() &&
if (ret < 0) {
} else if (ret == 0) {
const char *const **argv)
return FALSE;
return FALSE;
return FALSE;
return TRUE;
const struct doveadm_mail_cmd *
const char *const **argv)
const char *const *orig_argv;
int orig_argc;
return cmd;
return cmd;
return NULL;
return FALSE;
return TRUE;
return cmd;
return NULL;
return TRUE;
return FALSE;
void doveadm_mail_init(void)
&mod_set);
void doveadm_mail_deinit(void)
const char *wildcard_user;
const char *fieldstr;