doveadm-mail-mailbox-status.c revision 14e0f6334476ed4616e4737a277fc7d9b2aa1151
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen/* Copyright (c) 2010 Dovecot authors, see the included COPYING file */
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen#include "lib.h"
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen#include "str.h"
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen#include "mail-namespace.h"
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen#include "mail-storage.h"
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen#include "doveadm-print.h"
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen#include "doveadm-mail.h"
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen#include "doveadm-mail-list-iter.h"
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen
14e0f6334476ed4616e4737a277fc7d9b2aa1151Timo Sirainen#define ALL_STATUS_ITEMS \
14e0f6334476ed4616e4737a277fc7d9b2aa1151Timo Sirainen (STATUS_MESSAGES | STATUS_RECENT | \
14e0f6334476ed4616e4737a277fc7d9b2aa1151Timo Sirainen STATUS_UIDNEXT | STATUS_UIDVALIDITY | \
14e0f6334476ed4616e4737a277fc7d9b2aa1151Timo Sirainen STATUS_UNSEEN | STATUS_HIGHESTMODSEQ | STATUS_VIRTUAL_SIZE)
14e0f6334476ed4616e4737a277fc7d9b2aa1151Timo Sirainen
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen#define TOTAL_STATUS_ITEMS \
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen (STATUS_MESSAGES | STATUS_RECENT | STATUS_UNSEEN | STATUS_VIRTUAL_SIZE)
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainenstruct status_cmd_context {
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen struct doveadm_mail_cmd_context ctx;
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen struct mail_search_args *search_args;
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen enum mailbox_status_items items;
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen struct mailbox_status total_status;
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen unsigned int guid:1;
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen unsigned int total_sum:1;
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen};
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainenstatic void status_parse_fields(struct status_cmd_context *ctx,
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen const char *const *fields)
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen{
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen if (*fields == NULL)
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen i_fatal("No status fields");
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen for (; *fields != NULL; fields++) {
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen const char *field = *fields;
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen
14e0f6334476ed4616e4737a277fc7d9b2aa1151Timo Sirainen if (strcmp(field, "all") == 0) {
14e0f6334476ed4616e4737a277fc7d9b2aa1151Timo Sirainen if (ctx->total_sum)
14e0f6334476ed4616e4737a277fc7d9b2aa1151Timo Sirainen ctx->items |= TOTAL_STATUS_ITEMS;
14e0f6334476ed4616e4737a277fc7d9b2aa1151Timo Sirainen else {
14e0f6334476ed4616e4737a277fc7d9b2aa1151Timo Sirainen ctx->items |= ALL_STATUS_ITEMS;
14e0f6334476ed4616e4737a277fc7d9b2aa1151Timo Sirainen ctx->guid = TRUE;
14e0f6334476ed4616e4737a277fc7d9b2aa1151Timo Sirainen }
14e0f6334476ed4616e4737a277fc7d9b2aa1151Timo Sirainen } else if (strcmp(field, "messages") == 0)
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen ctx->items |= STATUS_MESSAGES;
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen else if (strcmp(field, "recent") == 0)
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen ctx->items |= STATUS_RECENT;
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen else if (strcmp(field, "uidnext") == 0)
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen ctx->items |= STATUS_UIDNEXT;
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen else if (strcmp(field, "uidvalidity") == 0)
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen ctx->items |= STATUS_UIDVALIDITY;
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen else if (strcmp(field, "unseen") == 0)
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen ctx->items |= STATUS_UNSEEN;
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen else if (strcmp(field, "highestmodseq") == 0)
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen ctx->items |= STATUS_HIGHESTMODSEQ;
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen else if (strcmp(field, "vsize") == 0)
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen ctx->items |= STATUS_VIRTUAL_SIZE;
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen else if (strcmp(field, "guid") == 0)
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen ctx->guid = TRUE;
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen else
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen i_fatal("Unknown status field: %s", field);
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen if (ctx->total_sum &&
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen ((ctx->items & ~TOTAL_STATUS_ITEMS) != 0 || ctx->guid))
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen i_fatal("Status field %s can't be used with -t", field);
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen }
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen}
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainenstatic void status_output(struct status_cmd_context *ctx, struct mailbox *box,
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen const struct mailbox_status *status,
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen uint8_t mailbox_guid[MAIL_GUID_128_SIZE])
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen{
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen if (box != NULL)
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen doveadm_print(mailbox_get_vname(box));
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen if ((ctx->items & STATUS_MESSAGES) != 0)
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen doveadm_print_num(status->messages);
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen if ((ctx->items & STATUS_RECENT) != 0)
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen doveadm_print_num(status->recent);
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen if ((ctx->items & STATUS_UIDNEXT) != 0)
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen doveadm_print_num(status->uidnext);
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen if ((ctx->items & STATUS_UIDVALIDITY) != 0)
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen doveadm_print_num(status->uidvalidity);
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen if ((ctx->items & STATUS_UNSEEN) != 0)
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen doveadm_print_num(status->unseen);
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen if ((ctx->items & STATUS_HIGHESTMODSEQ) != 0)
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen doveadm_print_num(status->highest_modseq);
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen if ((ctx->items & STATUS_VIRTUAL_SIZE) != 0)
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen doveadm_print_num(status->virtual_size);
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen if (ctx->guid)
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen doveadm_print(mail_guid_128_to_string(mailbox_guid));
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen}
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainenstatic void
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainenstatus_sum(struct status_cmd_context *ctx,
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen const struct mailbox_status *status)
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen{
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen struct mailbox_status *dest = &ctx->total_status;
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen dest->messages += status->messages;
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen dest->recent += status->recent;
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen dest->unseen += status->unseen;
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen dest->virtual_size += status->virtual_size;
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen}
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainenstatic void
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainenstatus_mailbox(struct status_cmd_context *ctx, const struct mailbox_info *info)
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen{
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen struct mailbox *box;
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen struct mailbox_status status;
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen uint8_t mailbox_guid[MAIL_GUID_128_SIZE];
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen
97437f768d1a3e6134fed1971202803fd250eef2Timo Sirainen if (doveadm_mailbox_find_and_sync(ctx->ctx.cur_mail_user,
97437f768d1a3e6134fed1971202803fd250eef2Timo Sirainen info->name, &box) < 0) {
97437f768d1a3e6134fed1971202803fd250eef2Timo Sirainen ctx->ctx.failed = TRUE;
97437f768d1a3e6134fed1971202803fd250eef2Timo Sirainen return;
97437f768d1a3e6134fed1971202803fd250eef2Timo Sirainen }
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen mailbox_get_status(box, ctx->items, &status);
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen if (ctx->guid) {
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen if (mailbox_get_guid(box, mailbox_guid) < 0)
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen memset(mailbox_guid, 0, sizeof(mailbox_guid));
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen }
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen if (!ctx->total_sum)
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen status_output(ctx, box, &status, mailbox_guid);
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen else
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen status_sum(ctx, &status);
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen mailbox_free(&box);
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen}
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainenstatic void
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainencmd_mailbox_status_run(struct doveadm_mail_cmd_context *_ctx,
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen struct mail_user *user)
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen{
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen struct status_cmd_context *ctx = (struct status_cmd_context *)_ctx;
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen enum mailbox_list_iter_flags iter_flags =
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen MAILBOX_LIST_ITER_VIRTUAL_NAMES |
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen MAILBOX_LIST_ITER_RAW_LIST |
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen MAILBOX_LIST_ITER_NO_AUTO_INBOX |
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen MAILBOX_LIST_ITER_RETURN_NO_FLAGS;
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen struct doveadm_mail_list_iter *iter;
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen const struct mailbox_info *info;
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen memset(&ctx->total_status, 0, sizeof(ctx->total_status));
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen iter = doveadm_mail_list_iter_init(user, ctx->search_args, iter_flags);
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen while ((info = doveadm_mail_list_iter_next(iter)) != NULL) {
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen T_BEGIN {
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen status_mailbox(ctx, info);
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen } T_END;
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen }
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen doveadm_mail_list_iter_deinit(&iter);
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen if (ctx->total_sum)
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen status_output(ctx, NULL, &ctx->total_status, NULL);
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen}
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainenstatic void cmd_mailbox_status_init(struct doveadm_mail_cmd_context *_ctx,
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen const char *const args[])
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen{
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen struct status_cmd_context *ctx = (struct status_cmd_context *)_ctx;
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen const char *fields = args[0];
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen if (fields == NULL || args[1] == NULL)
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen doveadm_mail_help_name("mailbox status");
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen status_parse_fields(ctx, t_strsplit_spaces(fields, " "));
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen ctx->search_args = doveadm_mail_mailbox_search_args_build(args);
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen if (!ctx->total_sum) {
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen doveadm_print_header("mailbox", "mailbox",
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen DOVEADM_PRINT_HEADER_FLAG_HIDE_TITLE);
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen }
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen if ((ctx->items & STATUS_MESSAGES) != 0)
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen doveadm_print_header_simple("messages");
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen if ((ctx->items & STATUS_RECENT) != 0)
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen doveadm_print_header_simple("recent");
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen if ((ctx->items & STATUS_UIDNEXT) != 0)
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen doveadm_print_header_simple("uidnext");
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen if ((ctx->items & STATUS_UIDVALIDITY) != 0)
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen doveadm_print_header_simple("uidvalidity");
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen if ((ctx->items & STATUS_UNSEEN) != 0)
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen doveadm_print_header_simple("unseen");
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen if ((ctx->items & STATUS_HIGHESTMODSEQ) != 0)
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen doveadm_print_header_simple("highestmodseq");
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen if ((ctx->items & STATUS_VIRTUAL_SIZE) != 0)
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen doveadm_print_header_simple("vsize");
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen if (ctx->guid)
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen doveadm_print_header_simple("guid");
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen}
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainenstatic bool
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainencmd_mailbox_status_parse_arg(struct doveadm_mail_cmd_context *_ctx, int c)
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen{
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen struct status_cmd_context *ctx = (struct status_cmd_context *)_ctx;
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen switch (c) {
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen case 't':
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen ctx->total_sum = TRUE;
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen break;
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen default:
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen return FALSE;
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen }
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen return TRUE;
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen}
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainenstatic struct doveadm_mail_cmd_context *cmd_mailbox_status_alloc(void)
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen{
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen struct status_cmd_context *ctx;
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen ctx = doveadm_mail_cmd_alloc(struct status_cmd_context);
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen ctx->ctx.getopt_args = "t";
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen ctx->ctx.v.parse_arg = cmd_mailbox_status_parse_arg;
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen ctx->ctx.v.init = cmd_mailbox_status_init;
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen ctx->ctx.v.run = cmd_mailbox_status_run;
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen doveadm_print_init(DOVEADM_PRINT_TYPE_FLOW);
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen return &ctx->ctx;
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen}
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainenstruct doveadm_mail_cmd cmd_mailbox_status = {
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen cmd_mailbox_status_alloc, "mailbox status",
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen "[-t] <fields> <mailbox mask> [...]"
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen};