doveadm-mail.c revision 23878bd03d1de531e3261a25598beec621351910
5e0ce63bb65db34d7f48b34bbb5545fa791781c4Timo Sirainen/* Copyright (c) 2009-2010 Dovecot authors, see the included COPYING file */
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen#include "lib.h"
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen#include "array.h"
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen#include "lib-signals.h"
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen#include "ioloop.h"
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen#include "module-dir.h"
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen#include "master-service.h"
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen#include "mail-user.h"
cd56a23e21f1df3f79648cf07e2f4385e2fadebbTimo Sirainen#include "mail-namespace.h"
cd56a23e21f1df3f79648cf07e2f4385e2fadebbTimo Sirainen#include "mail-storage.h"
cd56a23e21f1df3f79648cf07e2f4385e2fadebbTimo Sirainen#include "mail-storage-settings.h"
cd56a23e21f1df3f79648cf07e2f4385e2fadebbTimo Sirainen#include "mail-storage-service.h"
cd56a23e21f1df3f79648cf07e2f4385e2fadebbTimo Sirainen#include "mail-search-build.h"
cd56a23e21f1df3f79648cf07e2f4385e2fadebbTimo Sirainen#include "mail-search-parser.h"
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen#include "doveadm.h"
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen#include "doveadm-settings.h"
daf029d2a627daa39d05507140f385162828172eTimo Sirainen#include "doveadm-mail.h"
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen#include <stdio.h>
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen#include <stdlib.h>
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo SirainenARRAY_TYPE(doveadm_mail_cmd) doveadm_mail_cmds;
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainenstatic int killed_signo = 0;
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainenstruct doveadm_mail_cmd_context *
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainendoveadm_mail_cmd_alloc_size(size_t size)
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen{
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen struct doveadm_mail_cmd_context *ctx;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen pool_t pool;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen i_assert(size >= sizeof(struct doveadm_mail_cmd_context));
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen pool = pool_alloconly_create("doveadm mail cmd", 1024);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen ctx = p_malloc(pool, size);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen ctx->pool = pool;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen return ctx;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen}
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainenstatic void
daf029d2a627daa39d05507140f385162828172eTimo Sirainencmd_purge_run(struct doveadm_mail_cmd_context *ctx ATTR_UNUSED,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen struct mail_user *user)
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen{
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen struct mail_namespace *ns;
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen for (ns = user->namespaces; ns != NULL; ns = ns->next) {
daf029d2a627daa39d05507140f385162828172eTimo Sirainen if (ns->type != NAMESPACE_PRIVATE || ns->alias_for != NULL)
daf029d2a627daa39d05507140f385162828172eTimo Sirainen continue;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen if (mail_storage_purge(ns->storage) < 0) {
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen i_error("Purging namespace '%s' failed: %s", ns->prefix,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen mail_storage_get_last_error(ns->storage, NULL));
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen }
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen }
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen}
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainenstatic struct doveadm_mail_cmd_context *cmd_purge_alloc(void)
9e095dd6a77097356aca8216356d4d71ef1bea45Timo Sirainen{
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen struct doveadm_mail_cmd_context *ctx;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen ctx = doveadm_mail_cmd_alloc(struct doveadm_mail_cmd_context);
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen ctx->run = cmd_purge_run;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen return ctx;
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen}
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainenstatic struct mailbox *
20344c0e814139e3c365fbb9287478f91512089eTimo Sirainenmailbox_find_and_open(struct mail_user *user, const char *mailbox)
20344c0e814139e3c365fbb9287478f91512089eTimo Sirainen{
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen struct mail_namespace *ns;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen struct mailbox *box;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen const char *orig_mailbox = mailbox;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen ns = mail_namespace_find(user->namespaces, &mailbox);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen if (ns == NULL)
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen i_fatal("Can't find namespace for mailbox %s", mailbox);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
20344c0e814139e3c365fbb9287478f91512089eTimo Sirainen box = mailbox_alloc(ns->list, mailbox, MAILBOX_FLAG_KEEP_RECENT |
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen MAILBOX_FLAG_IGNORE_ACLS);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen if (mailbox_open(box) < 0) {
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen i_fatal("Opening mailbox %s failed: %s", orig_mailbox,
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen mail_storage_get_last_error(mailbox_get_storage(box),
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen NULL));
602a0434db30d8e3292d1c161a803d96a879a74fTimo Sirainen }
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen return box;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen}
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainenstruct mailbox *
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainendoveadm_mailbox_find_and_sync(struct mail_user *user, const char *mailbox)
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen{
35df1dd606c5ef21068ab4fe4be305859d4fad4bTimo Sirainen struct mailbox *box;
601f5f14c6cde28f0e0c6ca7c5d735315d3d48dfTimo Sirainen
601f5f14c6cde28f0e0c6ca7c5d735315d3d48dfTimo Sirainen box = mailbox_find_and_open(user, mailbox);
601f5f14c6cde28f0e0c6ca7c5d735315d3d48dfTimo Sirainen if (mailbox_sync(box, MAILBOX_SYNC_FLAG_FULL_READ) < 0) {
601f5f14c6cde28f0e0c6ca7c5d735315d3d48dfTimo Sirainen i_fatal("Syncing mailbox %s failed: %s", mailbox,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen mail_storage_get_last_error(mailbox_get_storage(box),
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen NULL));
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen }
9e095dd6a77097356aca8216356d4d71ef1bea45Timo Sirainen return box;
602a0434db30d8e3292d1c161a803d96a879a74fTimo Sirainen}
602a0434db30d8e3292d1c161a803d96a879a74fTimo Sirainen
602a0434db30d8e3292d1c161a803d96a879a74fTimo Sirainenstruct mail_search_args *
602a0434db30d8e3292d1c161a803d96a879a74fTimo Sirainendoveadm_mail_build_search_args(const char *const args[])
602a0434db30d8e3292d1c161a803d96a879a74fTimo Sirainen{
602a0434db30d8e3292d1c161a803d96a879a74fTimo Sirainen struct mail_search_parser *parser;
602a0434db30d8e3292d1c161a803d96a879a74fTimo Sirainen struct mail_search_args *sargs;
602a0434db30d8e3292d1c161a803d96a879a74fTimo Sirainen const char *error;
602a0434db30d8e3292d1c161a803d96a879a74fTimo Sirainen
602a0434db30d8e3292d1c161a803d96a879a74fTimo Sirainen parser = mail_search_parser_init_cmdline(args);
602a0434db30d8e3292d1c161a803d96a879a74fTimo Sirainen if (mail_search_build(mail_search_register_get_human(),
602a0434db30d8e3292d1c161a803d96a879a74fTimo Sirainen parser, "UTF-8", &sargs, &error) < 0)
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen i_fatal("%s", error);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen mail_search_parser_deinit(&parser);
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen return sargs;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen}
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainenstruct force_resync_cmd_context {
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen struct doveadm_mail_cmd_context ctx;
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen const char *mailbox;
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen};
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainenstatic void cmd_force_resync_run(struct doveadm_mail_cmd_context *_ctx,
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen struct mail_user *user)
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen{
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen struct force_resync_cmd_context *ctx =
548e394330621952db0f03dd667b70184c4a37b6Timo Sirainen (struct force_resync_cmd_context *)_ctx;
548e394330621952db0f03dd667b70184c4a37b6Timo Sirainen struct mail_storage *storage;
548e394330621952db0f03dd667b70184c4a37b6Timo Sirainen struct mailbox *box;
7d207b1e77a7b5e3fda640e353acfc86d261fedfTimo Sirainen
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen box = mailbox_find_and_open(user, ctx->mailbox);
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen storage = mailbox_get_storage(box);
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainen if (mailbox_sync(box, MAILBOX_SYNC_FLAG_FORCE_RESYNC |
7e1f68ad71d3485f1882142837b01f7a98ca8467Timo Sirainen MAILBOX_SYNC_FLAG_FIX_INCONSISTENT) < 0) {
7e1f68ad71d3485f1882142837b01f7a98ca8467Timo Sirainen i_fatal("Forcing a resync on mailbox %s failed: %s",
7e1f68ad71d3485f1882142837b01f7a98ca8467Timo Sirainen ctx->mailbox,
7e1f68ad71d3485f1882142837b01f7a98ca8467Timo Sirainen mail_storage_get_last_error(storage, NULL));
7e1f68ad71d3485f1882142837b01f7a98ca8467Timo Sirainen }
7e1f68ad71d3485f1882142837b01f7a98ca8467Timo Sirainen mailbox_free(&box);
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen}
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainenstatic void cmd_force_resync_init(struct doveadm_mail_cmd_context *_ctx,
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen const char *const args[])
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen{
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen struct force_resync_cmd_context *ctx =
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen (struct force_resync_cmd_context *)_ctx;
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen const char *mailbox = args[0];
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen if (mailbox == NULL || args[1] != NULL)
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen doveadm_mail_help_name("force-resync");
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen ctx->mailbox = p_strdup(ctx->ctx.pool, mailbox);
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen}
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainenstatic struct doveadm_mail_cmd_context *cmd_force_resync_alloc(void)
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen{
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen struct force_resync_cmd_context *ctx;
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen ctx = doveadm_mail_cmd_alloc(struct force_resync_cmd_context);
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen ctx->ctx.init = cmd_force_resync_init;
8d80659e504ffb34bb0c6a633184fece35751b18Timo Sirainen ctx->ctx.run = cmd_force_resync_run;
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen return &ctx->ctx;
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen}
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainenstatic int
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainendoveadm_mail_next_user(struct doveadm_mail_cmd_context *ctx,
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen struct mail_storage_service_ctx *storage_service,
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen const struct mail_storage_service_input *input,
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen const char **error_r)
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen{
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen struct mail_storage_service_user *service_user;
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen struct mail_user *mail_user;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen const char *error;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen int ret;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen i_set_failure_prefix(t_strdup_printf("doveadm(%s): ", input->username));
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen ret = mail_storage_service_lookup(storage_service, input,
0611067f385a37773800225256dcd5cf6aa34212Timo Sirainen &service_user, &error);
0611067f385a37773800225256dcd5cf6aa34212Timo Sirainen if (ret <= 0) {
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen if (ret < 0) {
0611067f385a37773800225256dcd5cf6aa34212Timo Sirainen *error_r = t_strdup_printf("User lookup failed: %s",
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen error);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen }
8d80659e504ffb34bb0c6a633184fece35751b18Timo Sirainen return ret;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen }
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen ret = mail_storage_service_next(storage_service, service_user,
5254d77805cd35b9356d072ba325c356c43b0d51Timo Sirainen &mail_user);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen if (ret < 0) {
3e25b17126e9536736d5da03697613e4c3af5f76Timo Sirainen *error_r = "User init failed";
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen mail_storage_service_user_free(&service_user);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen return ret;
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen }
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen ctx->run(ctx, mail_user);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen mail_storage_service_user_free(&service_user);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen mail_user_unref(&mail_user);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen return 1;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen}
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
89e195dfb5c4b0efd9b9f459771a4467674e5b1fTimo Sirainenstatic void
89e195dfb5c4b0efd9b9f459771a4467674e5b1fTimo Sirainendoveadm_mail_single_user(struct doveadm_mail_cmd_context *ctx,
89e195dfb5c4b0efd9b9f459771a4467674e5b1fTimo Sirainen const char *username,
89e195dfb5c4b0efd9b9f459771a4467674e5b1fTimo Sirainen enum mail_storage_service_flags service_flags)
89e195dfb5c4b0efd9b9f459771a4467674e5b1fTimo Sirainen{
89e195dfb5c4b0efd9b9f459771a4467674e5b1fTimo Sirainen struct mail_storage_service_ctx *storage_service;
89e195dfb5c4b0efd9b9f459771a4467674e5b1fTimo Sirainen struct mail_storage_service_input input;
89e195dfb5c4b0efd9b9f459771a4467674e5b1fTimo Sirainen const char *error;
89e195dfb5c4b0efd9b9f459771a4467674e5b1fTimo Sirainen int ret;
89e195dfb5c4b0efd9b9f459771a4467674e5b1fTimo Sirainen
89e195dfb5c4b0efd9b9f459771a4467674e5b1fTimo Sirainen if (username == NULL)
89e195dfb5c4b0efd9b9f459771a4467674e5b1fTimo Sirainen i_fatal("USER environment is missing and -u option not used");
89e195dfb5c4b0efd9b9f459771a4467674e5b1fTimo Sirainen
c06f4017027263cf3a08becc551f5126409e2a83Timo Sirainen memset(&input, 0, sizeof(input));
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen input.username = username;
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen storage_service = mail_storage_service_init(master_service, NULL,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen service_flags);
c06f4017027263cf3a08becc551f5126409e2a83Timo Sirainen ret = doveadm_mail_next_user(ctx, storage_service, &input, &error);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen if (ret < 0)
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen i_fatal("%s", error);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen else if (ret == 0)
c06f4017027263cf3a08becc551f5126409e2a83Timo Sirainen i_fatal("User no longer exists");
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen mail_storage_service_deinit(&storage_service);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen}
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
8d80659e504ffb34bb0c6a633184fece35751b18Timo Sirainenstatic void sig_die(const siginfo_t *si, void *context ATTR_UNUSED)
c06f4017027263cf3a08becc551f5126409e2a83Timo Sirainen{
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen killed_signo = si->si_signo;
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen}
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainenstatic void
c06f4017027263cf3a08becc551f5126409e2a83Timo Sirainendoveadm_mail_all_users(struct doveadm_mail_cmd_context *ctx,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen enum mail_storage_service_flags service_flags)
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen{
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen struct mail_storage_service_input input;
c06f4017027263cf3a08becc551f5126409e2a83Timo Sirainen struct mail_storage_service_ctx *storage_service;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen unsigned int user_idx, user_count, interval, n;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen const char *user, *error;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen int ret;
c06f4017027263cf3a08becc551f5126409e2a83Timo Sirainen
c06f4017027263cf3a08becc551f5126409e2a83Timo Sirainen service_flags |= MAIL_STORAGE_SERVICE_FLAG_USERDB_LOOKUP;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen memset(&input, 0, sizeof(input));
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainen input.service = "doveadm";
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
37ab3cde96bfa4bc5304c0c348fc420aec79572dTimo Sirainen storage_service = mail_storage_service_init(master_service, NULL,
c06f4017027263cf3a08becc551f5126409e2a83Timo Sirainen service_flags);
c06f4017027263cf3a08becc551f5126409e2a83Timo Sirainen
37ab3cde96bfa4bc5304c0c348fc420aec79572dTimo Sirainen lib_signals_set_handler(SIGINT, FALSE, sig_die, NULL);
37ab3cde96bfa4bc5304c0c348fc420aec79572dTimo Sirainen lib_signals_set_handler(SIGTERM, FALSE, sig_die, NULL);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
f4bbeadda12fbd7c219063db68f3e78646d83c2cTimo Sirainen user_count = mail_storage_service_all_init(storage_service);
0b47e9f5e0181053b4d9ca7b426b0e5c185e820eTimo Sirainen n = user_count / 10000;
0b47e9f5e0181053b4d9ca7b426b0e5c185e820eTimo Sirainen for (interval = 10; n > 0 && interval < 1000; interval *= 10)
abe8754852e70763e92f74caabbcc13d0917714cTimo Sirainen n /= 10;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
c06f4017027263cf3a08becc551f5126409e2a83Timo Sirainen user_idx = 0;
c06f4017027263cf3a08becc551f5126409e2a83Timo Sirainen while ((ret = mail_storage_service_all_next(storage_service,
c06f4017027263cf3a08becc551f5126409e2a83Timo Sirainen &user)) > 0) {
c06f4017027263cf3a08becc551f5126409e2a83Timo Sirainen input.username = user;
c06f4017027263cf3a08becc551f5126409e2a83Timo Sirainen T_BEGIN {
c06f4017027263cf3a08becc551f5126409e2a83Timo Sirainen ret = doveadm_mail_next_user(ctx, storage_service,
c06f4017027263cf3a08becc551f5126409e2a83Timo Sirainen &input, &error);
c06f4017027263cf3a08becc551f5126409e2a83Timo Sirainen if (ret < 0)
c06f4017027263cf3a08becc551f5126409e2a83Timo Sirainen i_error("%s", error);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen else if (ret == 0)
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen i_info("User no longer exists, skipping");
904f9d5654b9c39edcdf32883e5e88771faf4d69Timo Sirainen } T_END;
904f9d5654b9c39edcdf32883e5e88771faf4d69Timo Sirainen if (ret == -1)
904f9d5654b9c39edcdf32883e5e88771faf4d69Timo Sirainen break;
904f9d5654b9c39edcdf32883e5e88771faf4d69Timo Sirainen if (doveadm_verbose) {
904f9d5654b9c39edcdf32883e5e88771faf4d69Timo Sirainen if (++user_idx % interval == 0) {
904f9d5654b9c39edcdf32883e5e88771faf4d69Timo Sirainen printf("\r%d / %d", user_idx, user_count);
904f9d5654b9c39edcdf32883e5e88771faf4d69Timo Sirainen fflush(stdout);
904f9d5654b9c39edcdf32883e5e88771faf4d69Timo Sirainen }
904f9d5654b9c39edcdf32883e5e88771faf4d69Timo Sirainen }
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen if (killed_signo != 0) {
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen i_warning("Killed with signal %d", killed_signo);
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen ret = -1;
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen break;
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen }
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen }
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen if (doveadm_verbose)
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen printf("\n");
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen i_set_failure_prefix("doveadm: ");
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen if (ret < 0)
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen i_error("Failed to iterate through some users");
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen mail_storage_service_deinit(&storage_service);
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen}
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainenstatic void
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainendoveadm_mail_cmd(const struct doveadm_mail_cmd *cmd, int argc, char *argv[])
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen{
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen enum mail_storage_service_flags service_flags =
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen MAIL_STORAGE_SERVICE_FLAG_NO_LOG_INIT;
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen struct doveadm_mail_cmd_context *ctx;
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen const char *username;
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen bool all_users = FALSE;
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen int c;
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen if (doveadm_debug)
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen service_flags |= MAIL_STORAGE_SERVICE_FLAG_DEBUG;
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen ctx = cmd->alloc();
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen username = getenv("USER");
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen while ((c = getopt(argc, argv, "Au:")) > 0) {
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen switch (c) {
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen case 'A':
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen all_users = TRUE;
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen break;
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen case 'u':
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen service_flags |=
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen MAIL_STORAGE_SERVICE_FLAG_USERDB_LOOKUP;
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen username = optarg;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen break;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen default:
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen doveadm_mail_help(cmd);
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen }
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen }
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen argv += optind;
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen if (argv[0] != NULL && cmd->usage_args == NULL) {
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen i_fatal("doveadm %s: Unknown parameter: %s",
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen cmd->name, argv[0]);
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen }
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen if (ctx->init != NULL)
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen ctx->init(ctx, (const void *)argv);
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen if (!all_users) {
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen doveadm_mail_single_user(ctx, username, service_flags);
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen } else {
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen service_flags |= MAIL_STORAGE_SERVICE_FLAG_TEMP_PRIV_DROP;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen doveadm_mail_all_users(ctx, service_flags);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen }
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen if (ctx->deinit != NULL)
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen ctx->deinit(ctx);
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen}
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainenstatic bool
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainendoveadm_mail_try_run_multi_word(const struct doveadm_mail_cmd *cmd,
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen const char *cmdname, int argc, char *argv[])
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen{
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen unsigned int len;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen if (argc < 1)
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen return FALSE;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen len = strlen(argv[1]);
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen if (strncmp(cmdname, argv[1], len) != 0)
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen return FALSE;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen if (cmdname[len] == ' ') {
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen /* more args */
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen return doveadm_mail_try_run_multi_word(cmd, cmdname + len + 1,
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen argc - 1, argv + 1);
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen }
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen if (cmdname[len] != '\0')
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen return FALSE;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen /* match */
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen doveadm_mail_cmd(cmd, argc - 1, argv + 1);
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen return TRUE;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen}
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainenbool doveadm_mail_try_run(const char *cmd_name, int argc, char *argv[])
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen{
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen const struct doveadm_mail_cmd *cmd;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen unsigned int cmd_name_len;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen i_assert(argc > 0);
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen cmd_name_len = strlen(cmd_name);
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen array_foreach(&doveadm_mail_cmds, cmd) {
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen if (strcmp(cmd->name, cmd_name) == 0) {
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen doveadm_mail_cmd(cmd, argc, argv);
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen return TRUE;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen }
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen /* see if it matches a multi-word command */
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen if (strncmp(cmd->name, cmd_name, cmd_name_len) == 0 &&
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen cmd->name[cmd_name_len] == ' ') {
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen const char *subcmd = cmd->name + cmd_name_len + 1;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen if (doveadm_mail_try_run_multi_word(cmd, subcmd,
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen argc, argv))
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen return TRUE;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen }
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen }
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen return FALSE;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen}
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainenvoid doveadm_mail_register_cmd(const struct doveadm_mail_cmd *cmd)
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen{
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen /* for now we'll just assume that cmd will be permanently in memory */
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen array_append(&doveadm_mail_cmds, cmd, 1);
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen}
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainenvoid doveadm_mail_usage(void)
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen{
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen const struct doveadm_mail_cmd *cmd;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen array_foreach(&doveadm_mail_cmds, cmd) {
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen fprintf(stderr, USAGE_CMDNAME_FMT" [-u <user>|-A]", cmd->name);
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen if (cmd->usage_args != NULL)
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen fprintf(stderr, " %s", cmd->usage_args);
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen fputc('\n', stderr);
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen }
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen}
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainenvoid doveadm_mail_help(const struct doveadm_mail_cmd *cmd)
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen{
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen fprintf(stderr, "doveadm %s [-u <user>|-A] %s\n", cmd->name,
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen cmd->usage_args == NULL ? "" : cmd->usage_args);
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen exit(0);
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen}
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainenvoid doveadm_mail_try_help_name(const char *cmd_name)
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen{
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen const struct doveadm_mail_cmd *cmd;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen array_foreach(&doveadm_mail_cmds, cmd) {
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen if (strcmp(cmd->name, cmd_name) == 0)
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen doveadm_mail_help(cmd);
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen }
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen}
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainenvoid doveadm_mail_help_name(const char *cmd_name)
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen{
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen doveadm_mail_try_help_name(cmd_name);
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen i_fatal("Missing help for command %s", cmd_name);
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen}
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainenstatic struct doveadm_mail_cmd cmd_force_resync = {
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen cmd_force_resync_alloc, "force-resync", "<mailbox>"
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen};
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainenstatic struct doveadm_mail_cmd cmd_purge = {
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen cmd_purge_alloc, "purge", NULL
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen};
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainenstatic struct doveadm_mail_cmd *mail_commands[] = {
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen &cmd_force_resync,
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen &cmd_purge,
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen &cmd_expunge,
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen &cmd_search,
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen &cmd_fetch,
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen &cmd_altmove,
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen &cmd_mailbox_list,
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen &cmd_mailbox_create,
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen &cmd_mailbox_delete,
&cmd_mailbox_rename
};
void doveadm_mail_init(void)
{
struct module_dir_load_settings mod_set;
unsigned int i;
i_array_init(&doveadm_mail_cmds, 32);
for (i = 0; i < N_ELEMENTS(mail_commands); i++)
doveadm_mail_register_cmd(mail_commands[i]);
memset(&mod_set, 0, sizeof(mod_set));
mod_set.version = master_service_get_version_string(master_service);
mod_set.require_init_funcs = TRUE;
mod_set.debug = doveadm_debug;
/* load all configured mail plugins */
mail_storage_service_modules =
module_dir_load_missing(mail_storage_service_modules,
doveadm_settings->mail_plugin_dir,
doveadm_settings->mail_plugins,
&mod_set);
}
void doveadm_mail_deinit(void)
{
array_free(&doveadm_mail_cmds);
}