doveadm-mail-index.c revision 64b61cd24d630223478ccbe1934b9f60f0881f59
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen/* Copyright (c) 2010-2011 Dovecot authors, see the included COPYING file */
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen#include "lib.h"
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen#include "mail-namespace.h"
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen#include "mail-storage.h"
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen#include "mail-search-build.h"
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen#include "doveadm-mail.h"
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainenstatic int
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainencmd_index_box(const struct mailbox_info *info)
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen{
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen struct mailbox *box;
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen const char *storage_name;
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen int ret = 0;
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen storage_name = mail_namespace_get_storage_name(info->ns, info->name);
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen box = mailbox_alloc(info->ns->list, storage_name,
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen MAILBOX_FLAG_KEEP_RECENT |
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen MAILBOX_FLAG_IGNORE_ACLS);
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen
64b61cd24d630223478ccbe1934b9f60f0881f59Timo Sirainen if (mailbox_sync(box, MAILBOX_SYNC_FLAG_FULL_READ |
64b61cd24d630223478ccbe1934b9f60f0881f59Timo Sirainen MAILBOX_SYNC_FLAG_PRECACHE) < 0) {
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen i_error("Syncing mailbox %s failed: %s", info->name,
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen mail_storage_get_last_error(mailbox_get_storage(box), NULL));
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen mailbox_free(&box);
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen return -1;
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen }
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen mailbox_free(&box);
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen return ret;
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen}
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainenstatic void
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainencmd_index_run(struct doveadm_mail_cmd_context *ctx, struct mail_user *user)
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen{
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen const enum mailbox_list_iter_flags iter_flags =
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen MAILBOX_LIST_ITER_RAW_LIST |
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen MAILBOX_LIST_ITER_NO_AUTO_INBOX |
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen MAILBOX_LIST_ITER_RETURN_NO_FLAGS |
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen MAILBOX_LIST_ITER_STAR_WITHIN_NS;
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen const enum namespace_type ns_mask =
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen NAMESPACE_PRIVATE | NAMESPACE_SHARED | NAMESPACE_PUBLIC;
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen struct mailbox_list_iterate_context *iter;
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen const struct mailbox_info *info;
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen iter = mailbox_list_iter_init_namespaces(user->namespaces, ctx->args,
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen ns_mask, iter_flags);
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen while ((info = mailbox_list_iter_next(iter)) != NULL) {
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen if ((info->flags & (MAILBOX_NOSELECT |
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen MAILBOX_NONEXISTENT)) == 0) T_BEGIN {
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen (void)cmd_index_box(info);
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen } T_END;
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen }
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen if (mailbox_list_iter_deinit(&iter) < 0)
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen i_error("Listing mailboxes failed");
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen}
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainenstatic void cmd_index_init(struct doveadm_mail_cmd_context *ctx ATTR_UNUSED,
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen const char *const args[])
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen{
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen if (args[0] == NULL)
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen doveadm_mail_help_name("index");
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen}
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainenstatic struct doveadm_mail_cmd_context *cmd_index_alloc(void)
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen{
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen struct doveadm_mail_cmd_context *ctx;
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen ctx = doveadm_mail_cmd_alloc(struct doveadm_mail_cmd_context);
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen ctx->v.init = cmd_index_init;
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen ctx->v.run = cmd_index_run;
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen return ctx;
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen}
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainenstruct doveadm_mail_cmd cmd_index = {
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen cmd_index_alloc, "index", "<mailbox>"
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen};