doveadm-mail-mailbox-status.c revision c45a841bee3f42ec6524b8f62c3fd457115c3f97
5f5870385cff47efd2f58e7892f251cf13761528Timo Sirainen/* Copyright (c) 2010-2016 Dovecot authors, see the included COPYING file */
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen#include "lib.h"
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen#include "str.h"
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen#include "mail-namespace.h"
a0c453a8edaec90fb0d945c874de0b1845bc7d7eTimo Sirainen#include "mail-storage.h"
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen#include "mail-search.h"
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen#include "doveadm-print.h"
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen#include "doveadm-mail.h"
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen#include "doveadm-mailbox-list-iter.h"
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen#define ALL_STATUS_ITEMS \
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen (STATUS_MESSAGES | STATUS_RECENT | \
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen STATUS_UIDNEXT | STATUS_UIDVALIDITY | \
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen STATUS_UNSEEN | STATUS_HIGHESTMODSEQ)
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen#define ALL_METADATA_ITEMS \
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen (MAILBOX_METADATA_VIRTUAL_SIZE | MAILBOX_METADATA_GUID)
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen#define TOTAL_STATUS_ITEMS \
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen (STATUS_MESSAGES | STATUS_RECENT | STATUS_UNSEEN)
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen#define TOTAL_METADATA_ITEMS \
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen (MAILBOX_METADATA_VIRTUAL_SIZE)
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainenstruct status_cmd_context {
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen struct doveadm_mail_cmd_context ctx;
ecdce39e5ef4b62eefa9f5818f17d153fd5d710aTimo Sirainen struct mail_search_args *search_args;
ecdce39e5ef4b62eefa9f5818f17d153fd5d710aTimo Sirainen
b8835b8a21c617ceb82ddc5a176243faf36aa8f7Timo Sirainen enum mailbox_status_items status_items;
ecdce39e5ef4b62eefa9f5818f17d153fd5d710aTimo Sirainen enum mailbox_metadata_items metadata_items;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen struct mailbox_status total_status;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen struct mailbox_metadata total_metadata;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen unsigned int total_sum:1;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen};
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainenstatic void status_parse_fields(struct status_cmd_context *ctx,
ecdce39e5ef4b62eefa9f5818f17d153fd5d710aTimo Sirainen const char *const *fields)
a0c453a8edaec90fb0d945c874de0b1845bc7d7eTimo Sirainen{
b8835b8a21c617ceb82ddc5a176243faf36aa8f7Timo Sirainen if (*fields == NULL)
ecdce39e5ef4b62eefa9f5818f17d153fd5d710aTimo Sirainen i_fatal_status(EX_USAGE, "No status fields");
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen for (; *fields != NULL; fields++) {
678d0463849ba777106eb7875f27db07a5d8e3dfTimo Sirainen const char *field = *fields;
4ee00532a265bdfb38539d811fcd12d51210ac35Timo Sirainen
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen if (strcmp(field, "all") == 0) {
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen if (ctx->total_sum) {
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen ctx->status_items |= TOTAL_STATUS_ITEMS;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen ctx->metadata_items |= TOTAL_METADATA_ITEMS;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen } else {
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen ctx->status_items |= ALL_STATUS_ITEMS;
beae08c3abc23434d15572ab3b059fbdf8efc2dfTimo Sirainen ctx->metadata_items |= ALL_METADATA_ITEMS;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen }
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen } else if (strcmp(field, "messages") == 0)
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen ctx->status_items |= STATUS_MESSAGES;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen else if (strcmp(field, "recent") == 0)
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen ctx->status_items |= STATUS_RECENT;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen else if (strcmp(field, "uidnext") == 0)
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen ctx->status_items |= STATUS_UIDNEXT;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen else if (strcmp(field, "uidvalidity") == 0)
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen ctx->status_items |= STATUS_UIDVALIDITY;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen else if (strcmp(field, "unseen") == 0)
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen ctx->status_items |= STATUS_UNSEEN;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen else if (strcmp(field, "highestmodseq") == 0)
beae08c3abc23434d15572ab3b059fbdf8efc2dfTimo Sirainen ctx->status_items |= STATUS_HIGHESTMODSEQ;
c649139f889c02154fc9a153728b81619edb5663Timo Sirainen else if (strcmp(field, "vsize") == 0)
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen ctx->metadata_items |= MAILBOX_METADATA_VIRTUAL_SIZE;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen else if (strcmp(field, "guid") == 0)
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen ctx->metadata_items |= MAILBOX_METADATA_GUID;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen else {
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen i_fatal_status(EX_USAGE,
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen "Unknown status field: %s", field);
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen }
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen if (ctx->total_sum &&
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen ((ctx->status_items & ~TOTAL_STATUS_ITEMS) != 0 ||
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen (ctx->metadata_items & ~TOTAL_METADATA_ITEMS) != 0)) {
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen i_fatal_status(EX_USAGE,
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen "Status field %s can't be used with -t", field);
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen }
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen }
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen}
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainenstatic void ATTR_NULL(2)
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainenstatus_output(struct status_cmd_context *ctx, struct mailbox *box,
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen const struct mailbox_status *status,
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen const struct mailbox_metadata *metadata)
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen{
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen if (box != NULL)
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen doveadm_print(mailbox_get_vname(box));
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen
df1713bd29d29a3e3f3ebfdf05f929525825a7d3Timo Sirainen if ((ctx->status_items & STATUS_MESSAGES) != 0)
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen doveadm_print_num(status->messages);
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen if ((ctx->status_items & STATUS_RECENT) != 0)
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen doveadm_print_num(status->recent);
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen if ((ctx->status_items & STATUS_UIDNEXT) != 0)
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen doveadm_print_num(status->uidnext);
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen if ((ctx->status_items & STATUS_UIDVALIDITY) != 0)
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen doveadm_print_num(status->uidvalidity);
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen if ((ctx->status_items & STATUS_UNSEEN) != 0)
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen doveadm_print_num(status->unseen);
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen if ((ctx->status_items & STATUS_HIGHESTMODSEQ) != 0)
df1713bd29d29a3e3f3ebfdf05f929525825a7d3Timo Sirainen doveadm_print_num(status->highest_modseq);
df1713bd29d29a3e3f3ebfdf05f929525825a7d3Timo Sirainen if ((ctx->metadata_items & MAILBOX_METADATA_VIRTUAL_SIZE) != 0)
df1713bd29d29a3e3f3ebfdf05f929525825a7d3Timo Sirainen doveadm_print_num(metadata->virtual_size);
cd2fc7dd28c3a2e3f82e8480eaf3ba7c4abc3614Timo Sirainen if ((ctx->metadata_items & MAILBOX_METADATA_GUID) != 0)
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen doveadm_print(guid_128_to_string(metadata->guid));
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen}
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainenstatic void
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainenstatus_sum(struct status_cmd_context *ctx,
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen const struct mailbox_status *status,
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen const struct mailbox_metadata *metadata)
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen{
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen struct mailbox_status *dest = &ctx->total_status;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen dest->messages += status->messages;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen dest->recent += status->recent;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen dest->unseen += status->unseen;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen ctx->total_metadata.virtual_size += metadata->virtual_size;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen}
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen
c649139f889c02154fc9a153728b81619edb5663Timo Sirainenstatic int
c649139f889c02154fc9a153728b81619edb5663Timo Sirainenstatus_mailbox(struct status_cmd_context *ctx, const struct mailbox_info *info)
c649139f889c02154fc9a153728b81619edb5663Timo Sirainen{
c649139f889c02154fc9a153728b81619edb5663Timo Sirainen struct mailbox *box;
c649139f889c02154fc9a153728b81619edb5663Timo Sirainen struct mailbox_status status;
c649139f889c02154fc9a153728b81619edb5663Timo Sirainen struct mailbox_metadata metadata;
c649139f889c02154fc9a153728b81619edb5663Timo Sirainen
c649139f889c02154fc9a153728b81619edb5663Timo Sirainen box = doveadm_mailbox_find(ctx->ctx.cur_mail_user, info->vname);
c649139f889c02154fc9a153728b81619edb5663Timo Sirainen if (mailbox_get_status(box, ctx->status_items, &status) < 0 ||
c649139f889c02154fc9a153728b81619edb5663Timo Sirainen mailbox_get_metadata(box, ctx->metadata_items, &metadata) < 0) {
c649139f889c02154fc9a153728b81619edb5663Timo Sirainen i_error("Mailbox %s: Failed to lookup mailbox status: %s",
c649139f889c02154fc9a153728b81619edb5663Timo Sirainen mailbox_get_vname(box), mailbox_get_last_error(box, NULL));
c649139f889c02154fc9a153728b81619edb5663Timo Sirainen doveadm_mail_failed_mailbox(&ctx->ctx, box);
c649139f889c02154fc9a153728b81619edb5663Timo Sirainen mailbox_free(&box);
c649139f889c02154fc9a153728b81619edb5663Timo Sirainen return -1;
c649139f889c02154fc9a153728b81619edb5663Timo Sirainen }
c649139f889c02154fc9a153728b81619edb5663Timo Sirainen if (!ctx->total_sum)
c649139f889c02154fc9a153728b81619edb5663Timo Sirainen status_output(ctx, box, &status, &metadata);
c649139f889c02154fc9a153728b81619edb5663Timo Sirainen else
c649139f889c02154fc9a153728b81619edb5663Timo Sirainen status_sum(ctx, &status, &metadata);
c649139f889c02154fc9a153728b81619edb5663Timo Sirainen mailbox_free(&box);
c649139f889c02154fc9a153728b81619edb5663Timo Sirainen return 0;
c649139f889c02154fc9a153728b81619edb5663Timo Sirainen}
53ec1ff2231d477db3103c51987fa9cb6033bc16Timo Sirainen
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainenstatic int
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainencmd_mailbox_status_run(struct doveadm_mail_cmd_context *_ctx,
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen struct mail_user *user)
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen{
53ec1ff2231d477db3103c51987fa9cb6033bc16Timo Sirainen struct status_cmd_context *ctx = (struct status_cmd_context *)_ctx;
53ec1ff2231d477db3103c51987fa9cb6033bc16Timo Sirainen enum mailbox_list_iter_flags iter_flags =
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen MAILBOX_LIST_ITER_NO_AUTO_BOXES |
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen MAILBOX_LIST_ITER_RETURN_NO_FLAGS;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen struct doveadm_mailbox_list_iter *iter;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen const struct mailbox_info *info;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen int ret = 0;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen memset(&ctx->total_status, 0, sizeof(ctx->total_status));
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen memset(&ctx->total_metadata, 0, sizeof(ctx->total_metadata));
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen iter = doveadm_mailbox_list_iter_init(_ctx, user, ctx->search_args,
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen iter_flags);
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen while ((info = doveadm_mailbox_list_iter_next(iter)) != NULL) {
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen T_BEGIN {
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen if (status_mailbox(ctx, info) < 0)
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen ret = -1;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen } T_END;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen }
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen if (doveadm_mailbox_list_iter_deinit(&iter) < 0)
c649139f889c02154fc9a153728b81619edb5663Timo Sirainen ret = -1;
c649139f889c02154fc9a153728b81619edb5663Timo Sirainen
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen if (ctx->total_sum) {
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen status_output(ctx, NULL, &ctx->total_status,
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen &ctx->total_metadata);
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen }
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen return ret;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen}
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainenstatic void cmd_mailbox_status_init(struct doveadm_mail_cmd_context *_ctx,
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen const char *const args[])
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen{
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen struct status_cmd_context *ctx = (struct status_cmd_context *)_ctx;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen const char *fields = args[0];
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen if (fields == NULL || args[1] == NULL)
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen doveadm_mail_help_name("mailbox status");
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen status_parse_fields(ctx, t_strsplit_spaces(fields, " "));
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen ctx->search_args = doveadm_mail_mailbox_search_args_build(args+1);
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen if (!ctx->total_sum) {
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen doveadm_print_header("mailbox", "mailbox",
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen DOVEADM_PRINT_HEADER_FLAG_HIDE_TITLE);
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen }
beae08c3abc23434d15572ab3b059fbdf8efc2dfTimo Sirainen if ((ctx->status_items & STATUS_MESSAGES) != 0)
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen doveadm_print_header_simple("messages");
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen if ((ctx->status_items & STATUS_RECENT) != 0)
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen doveadm_print_header_simple("recent");
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen if ((ctx->status_items & STATUS_UIDNEXT) != 0)
3852872e6954b7132e637294132005e86b8ebd4aTimo Sirainen doveadm_print_header_simple("uidnext");
3852872e6954b7132e637294132005e86b8ebd4aTimo Sirainen if ((ctx->status_items & STATUS_UIDVALIDITY) != 0)
3852872e6954b7132e637294132005e86b8ebd4aTimo Sirainen doveadm_print_header_simple("uidvalidity");
3852872e6954b7132e637294132005e86b8ebd4aTimo Sirainen if ((ctx->status_items & STATUS_UNSEEN) != 0)
3852872e6954b7132e637294132005e86b8ebd4aTimo Sirainen doveadm_print_header_simple("unseen");
3852872e6954b7132e637294132005e86b8ebd4aTimo Sirainen if ((ctx->status_items & STATUS_HIGHESTMODSEQ) != 0)
3852872e6954b7132e637294132005e86b8ebd4aTimo Sirainen doveadm_print_header_simple("highestmodseq");
3852872e6954b7132e637294132005e86b8ebd4aTimo Sirainen if ((ctx->metadata_items & MAILBOX_METADATA_VIRTUAL_SIZE) != 0)
3852872e6954b7132e637294132005e86b8ebd4aTimo Sirainen doveadm_print_header_simple("vsize");
3852872e6954b7132e637294132005e86b8ebd4aTimo Sirainen if ((ctx->metadata_items & MAILBOX_METADATA_GUID) != 0)
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen doveadm_print_header_simple("guid");
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen}
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainenstatic void cmd_mailbox_status_deinit(struct doveadm_mail_cmd_context *_ctx)
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen{
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen struct status_cmd_context *ctx = (struct status_cmd_context *)_ctx;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen if (ctx->search_args != NULL)
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen mail_search_args_unref(&ctx->search_args);
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen}
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainenstatic bool
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainencmd_mailbox_status_parse_arg(struct doveadm_mail_cmd_context *_ctx, int c)
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen{
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen struct status_cmd_context *ctx = (struct status_cmd_context *)_ctx;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen switch (c) {
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen case 't':
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen ctx->total_sum = TRUE;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen break;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen default:
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen return FALSE;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen }
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen return TRUE;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen}
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainenstatic struct doveadm_mail_cmd_context *cmd_mailbox_status_alloc(void)
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen{
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen struct status_cmd_context *ctx;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen ctx = doveadm_mail_cmd_alloc(struct status_cmd_context);
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen ctx->ctx.getopt_args = "t";
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen ctx->ctx.v.parse_arg = cmd_mailbox_status_parse_arg;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen ctx->ctx.v.init = cmd_mailbox_status_init;
a0c453a8edaec90fb0d945c874de0b1845bc7d7eTimo Sirainen ctx->ctx.v.deinit = cmd_mailbox_status_deinit;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen ctx->ctx.v.run = cmd_mailbox_status_run;
a0c453a8edaec90fb0d945c874de0b1845bc7d7eTimo Sirainen doveadm_print_init(DOVEADM_PRINT_TYPE_FLOW);
a0c453a8edaec90fb0d945c874de0b1845bc7d7eTimo Sirainen return &ctx->ctx;
ecdce39e5ef4b62eefa9f5818f17d153fd5d710aTimo Sirainen}
b8835b8a21c617ceb82ddc5a176243faf36aa8f7Timo Sirainen
ecdce39e5ef4b62eefa9f5818f17d153fd5d710aTimo Sirainenstruct doveadm_cmd_ver2 doveadm_cmd_mailbox_status_ver2 = {
a0c453a8edaec90fb0d945c874de0b1845bc7d7eTimo Sirainen .name = "mailbox status",
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen .mail_cmd = cmd_mailbox_status_alloc,
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen .usage = DOVEADM_CMD_MAIL_USAGE_PREFIX"<mailbox> [...]",
48566ca412a7cf3b42512fd0ec112744778e5da0Timo SirainenDOVEADM_CMD_PARAMS_START
48566ca412a7cf3b42512fd0ec112744778e5da0Timo SirainenDOVEADM_CMD_MAIL_COMMON
48566ca412a7cf3b42512fd0ec112744778e5da0Timo SirainenDOVEADM_CMD_PARAM('t', "total-sum", CMD_PARAM_BOOL, 0)
48566ca412a7cf3b42512fd0ec112744778e5da0Timo SirainenDOVEADM_CMD_PARAM('f', "field", CMD_PARAM_ARRAY, CMD_PARAM_FLAG_POSITIONAL)
48566ca412a7cf3b42512fd0ec112744778e5da0Timo SirainenDOVEADM_CMD_PARAM('\0', "fieldstr", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL | CMD_PARAM_FLAG_DO_NOT_EXPOSE) /* FIXME: horrible hack, remove me when possible */
ecdce39e5ef4b62eefa9f5818f17d153fd5d710aTimo SirainenDOVEADM_CMD_PARAM('\0', "mask", CMD_PARAM_ARRAY, CMD_PARAM_FLAG_POSITIONAL)
ecdce39e5ef4b62eefa9f5818f17d153fd5d710aTimo SirainenDOVEADM_CMD_PARAMS_END
b8835b8a21c617ceb82ddc5a176243faf36aa8f7Timo Sirainen};
b8835b8a21c617ceb82ddc5a176243faf36aa8f7Timo Sirainen