bcb4e51a409d94ae670de96afb8483a4f7855294Stephan Bosch/* Copyright (c) 2010-2018 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"
57434d8add2f13b6d6dbd39b941e9e80c64be74eTimo Sirainen#include "mail-search.h"
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen#include "doveadm-print.h"
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen#include "doveadm-mail.h"
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen#include "doveadm-mailbox-list-iter.h"
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen
14e0f6334476ed4616e4737a277fc7d9b2aa1151Timo Sirainen#define ALL_STATUS_ITEMS \
14e0f6334476ed4616e4737a277fc7d9b2aa1151Timo Sirainen (STATUS_MESSAGES | STATUS_RECENT | \
14e0f6334476ed4616e4737a277fc7d9b2aa1151Timo Sirainen STATUS_UIDNEXT | STATUS_UIDVALIDITY | \
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen STATUS_UNSEEN | STATUS_HIGHESTMODSEQ)
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen#define ALL_METADATA_ITEMS \
399f1dcb709d6c3a29656a116fe808e9cbe955d3Timo Sirainen (MAILBOX_METADATA_VIRTUAL_SIZE | MAILBOX_METADATA_GUID | \
399f1dcb709d6c3a29656a116fe808e9cbe955d3Timo Sirainen MAILBOX_METADATA_FIRST_SAVE_DATE)
14e0f6334476ed4616e4737a277fc7d9b2aa1151Timo Sirainen
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen#define TOTAL_STATUS_ITEMS \
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen (STATUS_MESSAGES | STATUS_RECENT | STATUS_UNSEEN)
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen#define TOTAL_METADATA_ITEMS \
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen (MAILBOX_METADATA_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;
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen enum mailbox_status_items status_items;
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen enum mailbox_metadata_items metadata_items;
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen struct mailbox_status total_status;
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen struct mailbox_metadata total_metadata;
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen bool 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)
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen i_fatal_status(EX_USAGE, "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) {
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen if (ctx->total_sum) {
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen ctx->status_items |= TOTAL_STATUS_ITEMS;
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen ctx->metadata_items |= TOTAL_METADATA_ITEMS;
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen } else {
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen ctx->status_items |= ALL_STATUS_ITEMS;
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen ctx->metadata_items |= ALL_METADATA_ITEMS;
14e0f6334476ed4616e4737a277fc7d9b2aa1151Timo Sirainen }
14e0f6334476ed4616e4737a277fc7d9b2aa1151Timo Sirainen } else if (strcmp(field, "messages") == 0)
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen ctx->status_items |= STATUS_MESSAGES;
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen else if (strcmp(field, "recent") == 0)
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen ctx->status_items |= STATUS_RECENT;
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen else if (strcmp(field, "uidnext") == 0)
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen ctx->status_items |= STATUS_UIDNEXT;
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen else if (strcmp(field, "uidvalidity") == 0)
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen ctx->status_items |= STATUS_UIDVALIDITY;
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen else if (strcmp(field, "unseen") == 0)
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen ctx->status_items |= STATUS_UNSEEN;
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen else if (strcmp(field, "highestmodseq") == 0)
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen ctx->status_items |= STATUS_HIGHESTMODSEQ;
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen else if (strcmp(field, "vsize") == 0)
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen ctx->metadata_items |= MAILBOX_METADATA_VIRTUAL_SIZE;
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen else if (strcmp(field, "guid") == 0)
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen ctx->metadata_items |= MAILBOX_METADATA_GUID;
399f1dcb709d6c3a29656a116fe808e9cbe955d3Timo Sirainen else if (strcmp(field, "firstsaved") == 0)
399f1dcb709d6c3a29656a116fe808e9cbe955d3Timo Sirainen ctx->metadata_items |= MAILBOX_METADATA_FIRST_SAVE_DATE;
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen else {
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen i_fatal_status(EX_USAGE,
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen "Unknown status field: %s", field);
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen }
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen if (ctx->total_sum &&
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen ((ctx->status_items & ~TOTAL_STATUS_ITEMS) != 0 ||
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen (ctx->metadata_items & ~TOTAL_METADATA_ITEMS) != 0)) {
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen i_fatal_status(EX_USAGE,
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen "Status field %s can't be used with -t", field);
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen }
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen }
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen}
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainenstatic void ATTR_NULL(2)
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainenstatus_output(struct status_cmd_context *ctx, struct mailbox *box,
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen const struct mailbox_status *status,
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen const struct mailbox_metadata *metadata)
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen{
636f017be100bce67d66fd3ae1544a47681efd33Timo Sirainen if (box != NULL)
636f017be100bce67d66fd3ae1544a47681efd33Timo Sirainen doveadm_print(mailbox_get_vname(box));
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen if ((ctx->status_items & STATUS_MESSAGES) != 0)
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen doveadm_print_num(status->messages);
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen if ((ctx->status_items & STATUS_RECENT) != 0)
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen doveadm_print_num(status->recent);
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen if ((ctx->status_items & STATUS_UIDNEXT) != 0)
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen doveadm_print_num(status->uidnext);
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen if ((ctx->status_items & STATUS_UIDVALIDITY) != 0)
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen doveadm_print_num(status->uidvalidity);
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen if ((ctx->status_items & STATUS_UNSEEN) != 0)
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen doveadm_print_num(status->unseen);
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen if ((ctx->status_items & STATUS_HIGHESTMODSEQ) != 0)
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen doveadm_print_num(status->highest_modseq);
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen if ((ctx->metadata_items & MAILBOX_METADATA_VIRTUAL_SIZE) != 0)
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen doveadm_print_num(metadata->virtual_size);
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen if ((ctx->metadata_items & MAILBOX_METADATA_GUID) != 0)
de62ce819d59a529530da4b57be1b8d6dad13d6bTimo Sirainen doveadm_print(guid_128_to_string(metadata->guid));
399f1dcb709d6c3a29656a116fe808e9cbe955d3Timo Sirainen if ((ctx->metadata_items & MAILBOX_METADATA_FIRST_SAVE_DATE) != 0)
399f1dcb709d6c3a29656a116fe808e9cbe955d3Timo Sirainen doveadm_print_num(metadata->first_save_date);
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen}
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainenstatic void
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainenstatus_sum(struct status_cmd_context *ctx,
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen const struct mailbox_status *status,
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen const struct mailbox_metadata *metadata)
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;
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen ctx->total_metadata.virtual_size += metadata->virtual_size;
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen}
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainenstatic int
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;
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen struct mailbox_metadata metadata;
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen
402e999a878e0cc41a0afb830fea0a93afc75f0dTimo Sirainen box = doveadm_mailbox_find(ctx->ctx.cur_mail_user, info->vname);
61cf001f1944d92eb25f113ba4c08985d6e30d53Timo Sirainen mailbox_set_reason(box, ctx->ctx.cmd->name);
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen if (mailbox_get_status(box, ctx->status_items, &status) < 0 ||
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen mailbox_get_metadata(box, ctx->metadata_items, &metadata) < 0) {
6a262c9bd8f57cf1e57112e0522dbdab28ae8c29Timo Sirainen i_error("Mailbox %s: Failed to lookup mailbox status: %s",
bf7dc750b95039981c0e9d728f313d50cf38a156Martti Rannanjärvi mailbox_get_vname(box),
bf7dc750b95039981c0e9d728f313d50cf38a156Martti Rannanjärvi mailbox_get_last_internal_error(box, NULL));
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen doveadm_mail_failed_mailbox(&ctx->ctx, box);
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen mailbox_free(&box);
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen return -1;
97437f768d1a3e6134fed1971202803fd250eef2Timo Sirainen }
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen if (!ctx->total_sum)
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen status_output(ctx, box, &status, &metadata);
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen else
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen status_sum(ctx, &status, &metadata);
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen mailbox_free(&box);
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen return 0;
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen}
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainenstatic int
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 =
b3126bef7460052415eea07b300d02c8eb07c1d7Timo Sirainen MAILBOX_LIST_ITER_NO_AUTO_BOXES |
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen MAILBOX_LIST_ITER_RETURN_NO_FLAGS;
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen struct doveadm_mailbox_list_iter *iter;
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen const struct mailbox_info *info;
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen int ret = 0;
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen
efe78d3ba24fc866af1c79b9223dc0809ba26cadStephan Bosch i_zero(&ctx->total_status);
efe78d3ba24fc866af1c79b9223dc0809ba26cadStephan Bosch i_zero(&ctx->total_metadata);
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen iter = doveadm_mailbox_list_iter_init(_ctx, user, ctx->search_args,
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen iter_flags);
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen while ((info = doveadm_mailbox_list_iter_next(iter)) != NULL) {
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen T_BEGIN {
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen if (status_mailbox(ctx, info) < 0)
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen ret = -1;
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen } T_END;
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen }
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen if (doveadm_mailbox_list_iter_deinit(&iter) < 0)
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen ret = -1;
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen if (ctx->total_sum) {
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen status_output(ctx, NULL, &ctx->total_status,
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen &ctx->total_metadata);
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen }
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen return ret;
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, " "));
d6e8c83d08991f05f9cd4064bca5c76854d68657Timo Sirainen ctx->search_args = doveadm_mail_mailbox_search_args_build(args+1);
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 }
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen if ((ctx->status_items & STATUS_MESSAGES) != 0)
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen doveadm_print_header_simple("messages");
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen if ((ctx->status_items & STATUS_RECENT) != 0)
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen doveadm_print_header_simple("recent");
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen if ((ctx->status_items & STATUS_UIDNEXT) != 0)
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen doveadm_print_header_simple("uidnext");
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen if ((ctx->status_items & STATUS_UIDVALIDITY) != 0)
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen doveadm_print_header_simple("uidvalidity");
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen if ((ctx->status_items & STATUS_UNSEEN) != 0)
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen doveadm_print_header_simple("unseen");
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen if ((ctx->status_items & STATUS_HIGHESTMODSEQ) != 0)
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen doveadm_print_header_simple("highestmodseq");
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen if ((ctx->metadata_items & MAILBOX_METADATA_VIRTUAL_SIZE) != 0)
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen doveadm_print_header_simple("vsize");
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen if ((ctx->metadata_items & MAILBOX_METADATA_GUID) != 0)
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen doveadm_print_header_simple("guid");
399f1dcb709d6c3a29656a116fe808e9cbe955d3Timo Sirainen if ((ctx->metadata_items & MAILBOX_METADATA_FIRST_SAVE_DATE) != 0)
399f1dcb709d6c3a29656a116fe808e9cbe955d3Timo Sirainen doveadm_print_header_simple("firstsaved");
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen}
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen
57434d8add2f13b6d6dbd39b941e9e80c64be74eTimo Sirainenstatic void cmd_mailbox_status_deinit(struct doveadm_mail_cmd_context *_ctx)
57434d8add2f13b6d6dbd39b941e9e80c64be74eTimo Sirainen{
57434d8add2f13b6d6dbd39b941e9e80c64be74eTimo Sirainen struct status_cmd_context *ctx = (struct status_cmd_context *)_ctx;
57434d8add2f13b6d6dbd39b941e9e80c64be74eTimo Sirainen
98e8f95ffee4eacca72b1bcf082f2c735592301bTimo Sirainen if (ctx->search_args != NULL)
98e8f95ffee4eacca72b1bcf082f2c735592301bTimo Sirainen mail_search_args_unref(&ctx->search_args);
57434d8add2f13b6d6dbd39b941e9e80c64be74eTimo Sirainen}
57434d8add2f13b6d6dbd39b941e9e80c64be74eTimo 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;
1a40f0bdea5ec994d110d9780afbb6635651d85cAki Tuomi case 'f':
1a40f0bdea5ec994d110d9780afbb6635651d85cAki Tuomi 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;
57434d8add2f13b6d6dbd39b941e9e80c64be74eTimo Sirainen ctx->ctx.v.deinit = cmd_mailbox_status_deinit;
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
0368f3b0ae3fc1ea892da5c5ec02c05c0c3989afAki Tuomistruct doveadm_cmd_ver2 doveadm_cmd_mailbox_status_ver2 = {
0368f3b0ae3fc1ea892da5c5ec02c05c0c3989afAki Tuomi .name = "mailbox status",
0368f3b0ae3fc1ea892da5c5ec02c05c0c3989afAki Tuomi .mail_cmd = cmd_mailbox_status_alloc,
1a40f0bdea5ec994d110d9780afbb6635651d85cAki Tuomi .usage = DOVEADM_CMD_MAIL_USAGE_PREFIX"<fields> <mailbox> [...]",
0368f3b0ae3fc1ea892da5c5ec02c05c0c3989afAki TuomiDOVEADM_CMD_PARAMS_START
0368f3b0ae3fc1ea892da5c5ec02c05c0c3989afAki TuomiDOVEADM_CMD_MAIL_COMMON
14102a0c5db8828ca8c7751ec96587fadc97a0bcTimo SirainenDOVEADM_CMD_PARAM('t', "total-sum", CMD_PARAM_BOOL, 0)
1a40f0bdea5ec994d110d9780afbb6635651d85cAki TuomiDOVEADM_CMD_PARAM('f', "field", CMD_PARAM_ARRAY, 0)
14102a0c5db8828ca8c7751ec96587fadc97a0bcTimo 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 */
a18da4410dcd47ab8d9b40c09a76a54fa55b9c86Timo SirainenDOVEADM_CMD_PARAM('\0', "mailbox-mask", CMD_PARAM_ARRAY, CMD_PARAM_FLAG_POSITIONAL)
0368f3b0ae3fc1ea892da5c5ec02c05c0c3989afAki TuomiDOVEADM_CMD_PARAMS_END
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen};