doveadm-mail-mailbox-status.c revision 1a40f0bdea5ec994d110d9780afbb6635651d85c
e59faf65ce864fe95dc00f5d52b8323cdbd0608aTimo Sirainen/* Copyright (c) 2010-2016 Dovecot authors, see the included COPYING file */
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen
08d6658a4e2ec8104cd1307f6baa75fdb07a24f8Mark Washenberger#include "lib.h"
d5abbb932a0a598f002da39a8b3326643b1b5efcTimo Sirainen#include "str.h"
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen#include "mail-namespace.h"
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen#include "mail-storage.h"
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen#include "mail-search.h"
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen#include "doveadm-print.h"
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen#include "doveadm-mail.h"
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen#include "doveadm-mailbox-list-iter.h"
c5383a0ed56a188a7d5efaaa4c6f8243af432d65Timo Sirainen
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen#define ALL_STATUS_ITEMS \
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen (STATUS_MESSAGES | STATUS_RECENT | \
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen STATUS_UIDNEXT | STATUS_UIDVALIDITY | \
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen STATUS_UNSEEN | STATUS_HIGHESTMODSEQ)
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen#define ALL_METADATA_ITEMS \
b42f37ae6f65ed986315b6885568d32115e589b1Timo Sirainen (MAILBOX_METADATA_VIRTUAL_SIZE | MAILBOX_METADATA_GUID)
b42f37ae6f65ed986315b6885568d32115e589b1Timo Sirainen
b42f37ae6f65ed986315b6885568d32115e589b1Timo Sirainen#define TOTAL_STATUS_ITEMS \
b42f37ae6f65ed986315b6885568d32115e589b1Timo Sirainen (STATUS_MESSAGES | STATUS_RECENT | STATUS_UNSEEN)
b42f37ae6f65ed986315b6885568d32115e589b1Timo Sirainen#define TOTAL_METADATA_ITEMS \
b42f37ae6f65ed986315b6885568d32115e589b1Timo Sirainen (MAILBOX_METADATA_VIRTUAL_SIZE)
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainenstruct status_cmd_context {
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen struct doveadm_mail_cmd_context ctx;
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen struct mail_search_args *search_args;
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen enum mailbox_status_items status_items;
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen enum mailbox_metadata_items metadata_items;
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen struct mailbox_status total_status;
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen struct mailbox_metadata total_metadata;
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen unsigned int total_sum:1;
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen};
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainenstatic void status_parse_fields(struct status_cmd_context *ctx,
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen const char *const *fields)
6fabfb7bbfd88d0c1de66981e52850f26067623bTimo Sirainen{
137ea7ca34005345aa2304a940149b7f3774d727Timo Sirainen if (*fields == NULL)
137ea7ca34005345aa2304a940149b7f3774d727Timo Sirainen i_fatal_status(EX_USAGE, "No status fields");
9f431ccfb6932746db56245c8a3d3415717ef545Timo Sirainen
9f431ccfb6932746db56245c8a3d3415717ef545Timo Sirainen for (; *fields != NULL; fields++) {
9f431ccfb6932746db56245c8a3d3415717ef545Timo Sirainen const char *field = *fields;
9f431ccfb6932746db56245c8a3d3415717ef545Timo Sirainen
6fabfb7bbfd88d0c1de66981e52850f26067623bTimo Sirainen if (strcmp(field, "all") == 0) {
9f431ccfb6932746db56245c8a3d3415717ef545Timo Sirainen if (ctx->total_sum) {
9f431ccfb6932746db56245c8a3d3415717ef545Timo Sirainen ctx->status_items |= TOTAL_STATUS_ITEMS;
9f431ccfb6932746db56245c8a3d3415717ef545Timo Sirainen ctx->metadata_items |= TOTAL_METADATA_ITEMS;
9f431ccfb6932746db56245c8a3d3415717ef545Timo Sirainen } else {
9f431ccfb6932746db56245c8a3d3415717ef545Timo Sirainen ctx->status_items |= ALL_STATUS_ITEMS;
9f431ccfb6932746db56245c8a3d3415717ef545Timo Sirainen ctx->metadata_items |= ALL_METADATA_ITEMS;
6fabfb7bbfd88d0c1de66981e52850f26067623bTimo Sirainen }
6fabfb7bbfd88d0c1de66981e52850f26067623bTimo Sirainen } else if (strcmp(field, "messages") == 0)
6fabfb7bbfd88d0c1de66981e52850f26067623bTimo Sirainen ctx->status_items |= STATUS_MESSAGES;
9f431ccfb6932746db56245c8a3d3415717ef545Timo Sirainen else if (strcmp(field, "recent") == 0)
9f431ccfb6932746db56245c8a3d3415717ef545Timo Sirainen ctx->status_items |= STATUS_RECENT;
9f431ccfb6932746db56245c8a3d3415717ef545Timo Sirainen else if (strcmp(field, "uidnext") == 0)
9f431ccfb6932746db56245c8a3d3415717ef545Timo Sirainen ctx->status_items |= STATUS_UIDNEXT;
2cfe9983ce7a6280636ee12beccc2e865111967bTimo Sirainen else if (strcmp(field, "uidvalidity") == 0)
2cfe9983ce7a6280636ee12beccc2e865111967bTimo Sirainen ctx->status_items |= STATUS_UIDVALIDITY;
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen else if (strcmp(field, "unseen") == 0)
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen ctx->status_items |= STATUS_UNSEEN;
0f39a57760d93cddbce3ca43096d78e0fe2f42fdTimo Sirainen else if (strcmp(field, "highestmodseq") == 0)
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen ctx->status_items |= STATUS_HIGHESTMODSEQ;
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen else if (strcmp(field, "vsize") == 0)
0f39a57760d93cddbce3ca43096d78e0fe2f42fdTimo Sirainen ctx->metadata_items |= MAILBOX_METADATA_VIRTUAL_SIZE;
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen else if (strcmp(field, "guid") == 0)
49e513d090753ccbf95560b2f3a21f081a5b6c51Timo Sirainen ctx->metadata_items |= MAILBOX_METADATA_GUID;
0f39a57760d93cddbce3ca43096d78e0fe2f42fdTimo Sirainen else {
0f39a57760d93cddbce3ca43096d78e0fe2f42fdTimo Sirainen i_fatal_status(EX_USAGE,
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen "Unknown status field: %s", field);
0f39a57760d93cddbce3ca43096d78e0fe2f42fdTimo Sirainen }
b323e76cf555fa6031f3dbbdedeac0df2fff3778Timo Sirainen
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen if (ctx->total_sum &&
6fabfb7bbfd88d0c1de66981e52850f26067623bTimo Sirainen ((ctx->status_items & ~TOTAL_STATUS_ITEMS) != 0 ||
6fabfb7bbfd88d0c1de66981e52850f26067623bTimo Sirainen (ctx->metadata_items & ~TOTAL_METADATA_ITEMS) != 0)) {
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen i_fatal_status(EX_USAGE,
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen "Status field %s can't be used with -t", field);
6fabfb7bbfd88d0c1de66981e52850f26067623bTimo Sirainen }
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen }
a30b52af112bc98b74b8624e9a5d20cb754b2ab7Timo Sirainen}
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainenstatic void ATTR_NULL(2)
3c9783956dea385b322cd7fa6bf8c98c17a907a0Timo Sirainenstatus_output(struct status_cmd_context *ctx, struct mailbox *box,
3c9783956dea385b322cd7fa6bf8c98c17a907a0Timo Sirainen const struct mailbox_status *status,
3c9783956dea385b322cd7fa6bf8c98c17a907a0Timo Sirainen const struct mailbox_metadata *metadata)
3c9783956dea385b322cd7fa6bf8c98c17a907a0Timo Sirainen{
3c9783956dea385b322cd7fa6bf8c98c17a907a0Timo Sirainen if (box != NULL)
3c9783956dea385b322cd7fa6bf8c98c17a907a0Timo Sirainen doveadm_print(mailbox_get_vname(box));
3c9783956dea385b322cd7fa6bf8c98c17a907a0Timo Sirainen
3c9783956dea385b322cd7fa6bf8c98c17a907a0Timo Sirainen if ((ctx->status_items & STATUS_MESSAGES) != 0)
3c9783956dea385b322cd7fa6bf8c98c17a907a0Timo Sirainen doveadm_print_num(status->messages);
3c9783956dea385b322cd7fa6bf8c98c17a907a0Timo Sirainen if ((ctx->status_items & STATUS_RECENT) != 0)
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen doveadm_print_num(status->recent);
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen if ((ctx->status_items & STATUS_UIDNEXT) != 0)
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen doveadm_print_num(status->uidnext);
b42f37ae6f65ed986315b6885568d32115e589b1Timo Sirainen if ((ctx->status_items & STATUS_UIDVALIDITY) != 0)
b42f37ae6f65ed986315b6885568d32115e589b1Timo Sirainen doveadm_print_num(status->uidvalidity);
b42f37ae6f65ed986315b6885568d32115e589b1Timo Sirainen if ((ctx->status_items & STATUS_UNSEEN) != 0)
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen doveadm_print_num(status->unseen);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen if ((ctx->status_items & STATUS_HIGHESTMODSEQ) != 0)
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen doveadm_print_num(status->highest_modseq);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen if ((ctx->metadata_items & MAILBOX_METADATA_VIRTUAL_SIZE) != 0)
b42f37ae6f65ed986315b6885568d32115e589b1Timo Sirainen doveadm_print_num(metadata->virtual_size);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen if ((ctx->metadata_items & MAILBOX_METADATA_GUID) != 0)
3c9783956dea385b322cd7fa6bf8c98c17a907a0Timo Sirainen doveadm_print(guid_128_to_string(metadata->guid));
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen}
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainenstatic void
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainenstatus_sum(struct status_cmd_context *ctx,
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen const struct mailbox_status *status,
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen const struct mailbox_metadata *metadata)
49e513d090753ccbf95560b2f3a21f081a5b6c51Timo Sirainen{
a7bee3930831a9261fa6180d02af29c484d862e9Timo Sirainen struct mailbox_status *dest = &ctx->total_status;
b42f37ae6f65ed986315b6885568d32115e589b1Timo Sirainen
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen dest->messages += status->messages;
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen dest->recent += status->recent;
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen dest->unseen += status->unseen;
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen ctx->total_metadata.virtual_size += metadata->virtual_size;
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen}
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainenstatic int
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainenstatus_mailbox(struct status_cmd_context *ctx, const struct mailbox_info *info)
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen{
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen struct mailbox *box;
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen struct mailbox_status status;
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen struct mailbox_metadata metadata;
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen box = doveadm_mailbox_find(ctx->ctx.cur_mail_user, info->vname);
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen if (mailbox_get_status(box, ctx->status_items, &status) < 0 ||
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen mailbox_get_metadata(box, ctx->metadata_items, &metadata) < 0) {
849969f639a00eab26791db3cb1b66430420c0cdTimo Sirainen i_error("Mailbox %s: Failed to lookup mailbox status: %s",
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen mailbox_get_vname(box), mailbox_get_last_error(box, NULL));
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen doveadm_mail_failed_mailbox(&ctx->ctx, box);
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen mailbox_free(&box);
849969f639a00eab26791db3cb1b66430420c0cdTimo Sirainen return -1;
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen }
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen if (!ctx->total_sum)
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen status_output(ctx, box, &status, &metadata);
849969f639a00eab26791db3cb1b66430420c0cdTimo Sirainen else
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen status_sum(ctx, &status, &metadata);
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen mailbox_free(&box);
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen return 0;
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen}
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainenstatic int
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainencmd_mailbox_status_run(struct doveadm_mail_cmd_context *_ctx,
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen struct mail_user *user)
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen{
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen struct status_cmd_context *ctx = (struct status_cmd_context *)_ctx;
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen enum mailbox_list_iter_flags iter_flags =
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen MAILBOX_LIST_ITER_NO_AUTO_BOXES |
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen MAILBOX_LIST_ITER_RETURN_NO_FLAGS;
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen struct doveadm_mailbox_list_iter *iter;
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen const struct mailbox_info *info;
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen int ret = 0;
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen memset(&ctx->total_status, 0, sizeof(ctx->total_status));
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen memset(&ctx->total_metadata, 0, sizeof(ctx->total_metadata));
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen iter = doveadm_mailbox_list_iter_init(_ctx, user, ctx->search_args,
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen iter_flags);
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen while ((info = doveadm_mailbox_list_iter_next(iter)) != NULL) {
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen T_BEGIN {
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen if (status_mailbox(ctx, info) < 0)
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen ret = -1;
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen } T_END;
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen }
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen if (doveadm_mailbox_list_iter_deinit(&iter) < 0)
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen ret = -1;
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen if (ctx->total_sum) {
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen status_output(ctx, NULL, &ctx->total_status,
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen &ctx->total_metadata);
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen }
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen return ret;
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen}
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainenstatic void cmd_mailbox_status_init(struct doveadm_mail_cmd_context *_ctx,
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen const char *const args[])
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen{
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen struct status_cmd_context *ctx = (struct status_cmd_context *)_ctx;
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen const char *fields = args[0];
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen if (fields == NULL || args[1] == NULL)
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen doveadm_mail_help_name("mailbox status");
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen status_parse_fields(ctx, t_strsplit_spaces(fields, " "));
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen ctx->search_args = doveadm_mail_mailbox_search_args_build(args+1);
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen if (!ctx->total_sum) {
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen doveadm_print_header("mailbox", "mailbox",
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen DOVEADM_PRINT_HEADER_FLAG_HIDE_TITLE);
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen }
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen if ((ctx->status_items & STATUS_MESSAGES) != 0)
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen doveadm_print_header_simple("messages");
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen if ((ctx->status_items & STATUS_RECENT) != 0)
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen doveadm_print_header_simple("recent");
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen if ((ctx->status_items & STATUS_UIDNEXT) != 0)
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen doveadm_print_header_simple("uidnext");
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen if ((ctx->status_items & STATUS_UIDVALIDITY) != 0)
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen doveadm_print_header_simple("uidvalidity");
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen if ((ctx->status_items & STATUS_UNSEEN) != 0)
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen doveadm_print_header_simple("unseen");
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen if ((ctx->status_items & STATUS_HIGHESTMODSEQ) != 0)
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen doveadm_print_header_simple("highestmodseq");
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen if ((ctx->metadata_items & MAILBOX_METADATA_VIRTUAL_SIZE) != 0)
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen doveadm_print_header_simple("vsize");
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen if ((ctx->metadata_items & MAILBOX_METADATA_GUID) != 0)
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen doveadm_print_header_simple("guid");
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen}
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainenstatic void cmd_mailbox_status_deinit(struct doveadm_mail_cmd_context *_ctx)
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen{
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen struct status_cmd_context *ctx = (struct status_cmd_context *)_ctx;
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen if (ctx->search_args != NULL)
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen mail_search_args_unref(&ctx->search_args);
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen}
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainenstatic bool
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainencmd_mailbox_status_parse_arg(struct doveadm_mail_cmd_context *_ctx, int c)
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen{
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen struct status_cmd_context *ctx = (struct status_cmd_context *)_ctx;
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen switch (c) {
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen case 't':
b42f37ae6f65ed986315b6885568d32115e589b1Timo Sirainen ctx->total_sum = TRUE;
849969f639a00eab26791db3cb1b66430420c0cdTimo Sirainen break;
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen case 'f':
b42f37ae6f65ed986315b6885568d32115e589b1Timo Sirainen break;
b42f37ae6f65ed986315b6885568d32115e589b1Timo Sirainen default:
849969f639a00eab26791db3cb1b66430420c0cdTimo Sirainen return FALSE;
b42f37ae6f65ed986315b6885568d32115e589b1Timo Sirainen }
c5383a0ed56a188a7d5efaaa4c6f8243af432d65Timo Sirainen return TRUE;
c5383a0ed56a188a7d5efaaa4c6f8243af432d65Timo Sirainen}
849969f639a00eab26791db3cb1b66430420c0cdTimo Sirainen
b42f37ae6f65ed986315b6885568d32115e589b1Timo Sirainenstatic struct doveadm_mail_cmd_context *cmd_mailbox_status_alloc(void)
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen{
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen struct status_cmd_context *ctx;
f3d506e525a720f214020ca0f989a1966b30edaeTimo Sirainen
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen ctx = doveadm_mail_cmd_alloc(struct status_cmd_context);
b42f37ae6f65ed986315b6885568d32115e589b1Timo Sirainen ctx->ctx.getopt_args = "t";
b42f37ae6f65ed986315b6885568d32115e589b1Timo Sirainen ctx->ctx.v.parse_arg = cmd_mailbox_status_parse_arg;
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen ctx->ctx.v.init = cmd_mailbox_status_init;
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen ctx->ctx.v.deinit = cmd_mailbox_status_deinit;
b42f37ae6f65ed986315b6885568d32115e589b1Timo Sirainen ctx->ctx.v.run = cmd_mailbox_status_run;
b42f37ae6f65ed986315b6885568d32115e589b1Timo Sirainen doveadm_print_init(DOVEADM_PRINT_TYPE_FLOW);
f8a86fdfb0048f9c87bf223373b35416ceb5856bTimo Sirainen return &ctx->ctx;
b42f37ae6f65ed986315b6885568d32115e589b1Timo Sirainen}
b42f37ae6f65ed986315b6885568d32115e589b1Timo Sirainen
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainenstruct doveadm_cmd_ver2 doveadm_cmd_mailbox_status_ver2 = {
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen .name = "mailbox status",
b42f37ae6f65ed986315b6885568d32115e589b1Timo Sirainen .mail_cmd = cmd_mailbox_status_alloc,
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen .usage = DOVEADM_CMD_MAIL_USAGE_PREFIX"<fields> <mailbox> [...]",
b42f37ae6f65ed986315b6885568d32115e589b1Timo SirainenDOVEADM_CMD_PARAMS_START
b42f37ae6f65ed986315b6885568d32115e589b1Timo SirainenDOVEADM_CMD_MAIL_COMMON
b42f37ae6f65ed986315b6885568d32115e589b1Timo SirainenDOVEADM_CMD_PARAM('t', "total-sum", CMD_PARAM_BOOL, 0)
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo SirainenDOVEADM_CMD_PARAM('f', "field", CMD_PARAM_ARRAY, 0)
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo 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 */
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo SirainenDOVEADM_CMD_PARAM('\0', "mask", CMD_PARAM_ARRAY, CMD_PARAM_FLAG_POSITIONAL)
b42f37ae6f65ed986315b6885568d32115e589b1Timo SirainenDOVEADM_CMD_PARAMS_END
1f1e81aab38d833d1c9cdc244c91fd762e0080d4Timo Sirainen};
1f1e81aab38d833d1c9cdc244c91fd762e0080d4Timo Sirainen