}
}
-struct doveadm_mail_cmd_context *cmd_altmove(const char *const args[])
+static void cmd_altmove_init(struct doveadm_mail_cmd_context *_ctx,
+ const char *const args[])
{
- struct altmove_cmd_context *ctx;
+ struct altmove_cmd_context *ctx = (struct altmove_cmd_context *)_ctx;
if (args[0] == NULL)
doveadm_mail_help_name("altmove");
+ ctx->search_args = doveadm_mail_build_search_args(args);
+}
+
+static struct doveadm_mail_cmd_context *cmd_altmove_alloc(void)
+{
+ struct altmove_cmd_context *ctx;
- ctx = doveadm_mail_cmd_init(struct altmove_cmd_context);
+ ctx = doveadm_mail_cmd_alloc(struct altmove_cmd_context);
+ ctx->ctx.init = cmd_altmove_init;
ctx->ctx.run = cmd_altmove_run;
- ctx->search_args = doveadm_mail_build_search_args(args);
return &ctx->ctx;
}
+
+struct doveadm_mail_cmd cmd_altmove = {
+ cmd_altmove_alloc, "altmove", "<search query>"
+};
doveadm_mail_list_iter_deinit(&iter);
}
-struct doveadm_mail_cmd_context *cmd_expunge(const char *const args[])
+static void cmd_expunge_init(struct doveadm_mail_cmd_context *_ctx,
+ const char *const args[])
{
- struct expunge_cmd_context *ctx;
+ struct expunge_cmd_context *ctx = (struct expunge_cmd_context *)_ctx;
if (args[0] == NULL)
doveadm_mail_help_name("expunge");
- ctx = doveadm_mail_cmd_init(struct expunge_cmd_context);
- ctx->ctx.run = cmd_expunge_run;
ctx->search_args = doveadm_mail_build_search_args(args);
mail_search_args_simplify(ctx->search_args);
+}
+
+static struct doveadm_mail_cmd_context *cmd_expunge_alloc(void)
+{
+ struct expunge_cmd_context *ctx;
+
+ ctx = doveadm_mail_cmd_alloc(struct expunge_cmd_context);
+ ctx->ctx.init = cmd_expunge_init;
+ ctx->ctx.run = cmd_expunge_run;
return &ctx->ctx;
}
+
+struct doveadm_mail_cmd cmd_expunge = {
+ cmd_expunge_alloc, "expunge", "<search query>"
+};
str_free(&ctx->hdr);
}
-struct doveadm_mail_cmd_context *cmd_fetch(const char *const args[])
+static void cmd_fetch_init(struct doveadm_mail_cmd_context *_ctx,
+ const char *const args[])
{
+ struct fetch_cmd_context *ctx = (struct fetch_cmd_context *)_ctx;
const char *fetch_fields = args[0];
- struct fetch_cmd_context *ctx;
unsigned char prefix_buf[9];
if (fetch_fields == NULL || args[1] == NULL)
doveadm_mail_help_name("fetch");
- ctx = doveadm_mail_cmd_init(struct fetch_cmd_context);
- ctx->ctx.run = cmd_fetch_run;
- ctx->ctx.deinit = cmd_fetch_deinit;
-
parse_fetch_fields(ctx, fetch_fields);
ctx->search_args = doveadm_mail_build_search_args(args + 1);
ctx->prefix = t_strdup(str_c(ctx->hdr));
str_truncate(ctx->hdr, 0);
}
+}
+
+static struct doveadm_mail_cmd_context *cmd_fetch_alloc(void)
+{
+ struct fetch_cmd_context *ctx;
+
+ ctx = doveadm_mail_cmd_alloc(struct fetch_cmd_context);
+ ctx->ctx.init = cmd_fetch_init;
+ ctx->ctx.run = cmd_fetch_run;
+ ctx->ctx.deinit = cmd_fetch_deinit;
return &ctx->ctx;
}
+
+struct doveadm_mail_cmd cmd_fetch = {
+ cmd_fetch_alloc, "fetch", "<fields> <search query>"
+};
doveadm_mail_list_iter_deinit(&iter);
}
-struct doveadm_mail_cmd_context *cmd_mailbox_list(const char *const args[])
+static void cmd_mailbox_list_init(struct doveadm_mail_cmd_context *_ctx,
+ const char *const args[])
{
- struct list_cmd_context *ctx;
+ struct list_cmd_context *ctx = (struct list_cmd_context *)_ctx;
struct mail_search_arg *arg;
unsigned int i;
- ctx = doveadm_mail_cmd_init(struct list_cmd_context);
- ctx->ctx.run = cmd_mailbox_list_run;
-
ctx->search_args = mail_search_build_init();
for (i = 0; args[i] != NULL; i++) {
arg = mail_search_build_add(ctx->search_args,
arg = mail_search_build_add(ctx->search_args, SEARCH_OR);
arg->value.subargs = subargs;
}
+}
+
+static struct doveadm_mail_cmd_context *cmd_mailbox_list_alloc(void)
+{
+ struct list_cmd_context *ctx;
+
+ ctx = doveadm_mail_cmd_alloc(struct list_cmd_context);
+ ctx->ctx.init = cmd_mailbox_list_init;
+ ctx->ctx.run = cmd_mailbox_list_run;
return &ctx->ctx;
}
}
}
-struct doveadm_mail_cmd_context *cmd_mailbox_create(const char *const args[])
+static void cmd_mailbox_create_init(struct doveadm_mail_cmd_context *_ctx,
+ const char *const args[])
{
- struct mailbox_cmd_context *ctx;
+ struct mailbox_cmd_context *ctx = (struct mailbox_cmd_context *)_ctx;
const char *name;
unsigned int i;
if (args[0] == NULL)
doveadm_mail_help_name("mailbox create");
- ctx = doveadm_mail_cmd_init(struct mailbox_cmd_context);
- ctx->ctx.run = cmd_mailbox_create_run;
- p_array_init(&ctx->mailboxes, ctx->ctx.pool, 16);
-
for (i = 0; args[i] != NULL; i++) {
name = p_strdup(ctx->ctx.pool, args[i]);
array_append(&ctx->mailboxes, &name, 1);
}
+}
+
+static struct doveadm_mail_cmd_context *cmd_mailbox_create_alloc(void)
+{
+ struct mailbox_cmd_context *ctx;
+
+ ctx = doveadm_mail_cmd_alloc(struct mailbox_cmd_context);
+ ctx->ctx.init = cmd_mailbox_create_init;
+ ctx->ctx.run = cmd_mailbox_create_run;
+ p_array_init(&ctx->mailboxes, ctx->ctx.pool, 16);
return &ctx->ctx;
}
}
}
-struct doveadm_mail_cmd_context *cmd_mailbox_delete(const char *const args[])
+static void cmd_mailbox_delete_init(struct doveadm_mail_cmd_context *_ctx,
+ const char *const args[])
{
- struct mailbox_cmd_context *ctx;
+ struct mailbox_cmd_context *ctx = (struct mailbox_cmd_context *)_ctx;
const char *name;
unsigned int i;
if (args[0] == NULL)
doveadm_mail_help_name("mailbox delete");
- ctx = doveadm_mail_cmd_init(struct mailbox_cmd_context);
- ctx->ctx.run = cmd_mailbox_delete_run;
- p_array_init(&ctx->mailboxes, ctx->ctx.pool, 16);
-
for (i = 0; args[i] != NULL; i++) {
name = p_strdup(ctx->ctx.pool, args[i]);
array_append(&ctx->mailboxes, &name, 1);
}
+}
+
+static struct doveadm_mail_cmd_context *cmd_mailbox_delete_alloc(void)
+{
+ struct mailbox_cmd_context *ctx;
+
+ ctx = doveadm_mail_cmd_alloc(struct mailbox_cmd_context);
+ ctx->ctx.init = cmd_mailbox_delete_init;
+ ctx->ctx.run = cmd_mailbox_delete_run;
+ p_array_init(&ctx->mailboxes, ctx->ctx.pool, 16);
return &ctx->ctx;
}
mailbox_free(&newbox);
}
-struct doveadm_mail_cmd_context *cmd_mailbox_rename(const char *const args[])
+static void cmd_mailbox_rename_init(struct doveadm_mail_cmd_context *_ctx,
+ const char *const args[])
{
- struct rename_cmd_context *ctx;
+ struct rename_cmd_context *ctx = (struct rename_cmd_context *)_ctx;
if (str_array_length(args) != 2)
doveadm_mail_help_name("mailbox rename");
- ctx = doveadm_mail_cmd_init(struct rename_cmd_context);
- ctx->ctx.run = cmd_mailbox_rename_run;
-
ctx->oldname = p_strdup(ctx->ctx.pool, args[0]);
ctx->newname = p_strdup(ctx->ctx.pool, args[1]);
+}
+
+static struct doveadm_mail_cmd_context *cmd_mailbox_rename_alloc(void)
+{
+ struct rename_cmd_context *ctx;
+
+ ctx = doveadm_mail_cmd_alloc(struct rename_cmd_context);
+ ctx->ctx.init = cmd_mailbox_rename_init;
+ ctx->ctx.run = cmd_mailbox_rename_run;
return &ctx->ctx;
}
+
+struct doveadm_mail_cmd cmd_mailbox_list = {
+ cmd_mailbox_list_alloc, "mailbox list",
+ "[-7|-8] [<mailbox> [...]]"
+};
+struct doveadm_mail_cmd cmd_mailbox_create = {
+ cmd_mailbox_create_alloc, "mailbox create",
+ "[-7|-8] <mailbox> [...]"
+};
+struct doveadm_mail_cmd cmd_mailbox_delete = {
+ cmd_mailbox_delete_alloc, "mailbox delete",
+ "[-7|-8] <mailbox> [...]"
+};
+struct doveadm_mail_cmd cmd_mailbox_rename = {
+ cmd_mailbox_rename_alloc, "mailbox rename",
+ "[-7|-8] <old name> <new name>"
+};
doveadm_mail_list_iter_deinit(&iter);
}
-struct doveadm_mail_cmd_context *cmd_search(const char *const args[])
+static void cmd_search_init(struct doveadm_mail_cmd_context *_ctx,
+ const char *const args[])
{
- struct search_cmd_context *ctx;
+ struct search_cmd_context *ctx = (struct search_cmd_context *)_ctx;
if (args[0] == NULL)
doveadm_mail_help_name("search");
- ctx = doveadm_mail_cmd_init(struct search_cmd_context);
- ctx->ctx.run = cmd_search_run;
ctx->search_args = doveadm_mail_build_search_args(args);
+}
+
+static struct doveadm_mail_cmd_context *cmd_search_alloc(void)
+{
+ struct search_cmd_context *ctx;
+
+ ctx = doveadm_mail_cmd_alloc(struct search_cmd_context);
+ ctx->ctx.init = cmd_search_init;
+ ctx->ctx.run = cmd_search_run;
return &ctx->ctx;
}
+
+struct doveadm_mail_cmd cmd_search = {
+ cmd_search_alloc, "search", "<search query>"
+};
static int killed_signo = 0;
struct doveadm_mail_cmd_context *
-doveadm_mail_cmd_init_size(size_t size)
+doveadm_mail_cmd_alloc_size(size_t size)
{
struct doveadm_mail_cmd_context *ctx;
pool_t pool;
}
}
-static struct doveadm_mail_cmd_context *
-cmd_purge(const char *const args[] ATTR_UNUSED)
+static struct doveadm_mail_cmd_context *cmd_purge_alloc(void)
{
struct doveadm_mail_cmd_context *ctx;
- ctx = doveadm_mail_cmd_init(struct doveadm_mail_cmd_context);
+ ctx = doveadm_mail_cmd_alloc(struct doveadm_mail_cmd_context);
ctx->run = cmd_purge_run;
return ctx;
}
mailbox_free(&box);
}
-static struct doveadm_mail_cmd_context *
-cmd_force_resync(const char *const args[])
+static void cmd_force_resync_init(struct doveadm_mail_cmd_context *_ctx,
+ const char *const args[])
{
- struct force_resync_cmd_context *ctx;
+ struct force_resync_cmd_context *ctx =
+ (struct force_resync_cmd_context *)_ctx;
const char *mailbox = args[0];
if (mailbox == NULL || args[1] != NULL)
doveadm_mail_help_name("force-resync");
- ctx = doveadm_mail_cmd_init(struct force_resync_cmd_context);
- ctx->ctx.run = cmd_force_resync_run;
ctx->mailbox = p_strdup(ctx->ctx.pool, mailbox);
+}
+
+static struct doveadm_mail_cmd_context *cmd_force_resync_alloc(void)
+{
+ struct force_resync_cmd_context *ctx;
+
+ ctx = doveadm_mail_cmd_alloc(struct force_resync_cmd_context);
+ ctx->ctx.init = cmd_force_resync_init;
+ ctx->ctx.run = cmd_force_resync_run;
return &ctx->ctx;
}
if (doveadm_debug)
service_flags |= MAIL_STORAGE_SERVICE_FLAG_DEBUG;
+ ctx = cmd->alloc();
username = getenv("USER");
while ((c = getopt(argc, argv, "Au:")) > 0) {
switch (c) {
cmd->name, argv[0]);
}
- ctx = cmd->init((const void *)argv);
+ if (ctx->init != NULL)
+ ctx->init(ctx, (const void *)argv);
if (!all_users) {
doveadm_mail_single_user(ctx, username, service_flags);
} else {
i_fatal("Missing help for command %s", cmd_name);
}
-static struct doveadm_mail_cmd mail_commands[] = {
- { cmd_purge, "purge", NULL },
- { cmd_force_resync, "force-resync", "<mailbox>" },
- { cmd_expunge, "expunge", "<search query>" },
- { cmd_search, "search", "<search query>" },
- { cmd_fetch, "fetch", "<fields> <search query>" },
- { cmd_altmove, "altmove", "<search query>" },
- { cmd_mailbox_list, "mailbox list", "[<mailbox> [...]]" },
- { cmd_mailbox_create, "mailbox create", "<mailbox> [...]" },
- { cmd_mailbox_delete, "mailbox delete", "<mailbox> [...]" },
- { cmd_mailbox_rename, "mailbox rename", "<old name> <new name>" }
+static struct doveadm_mail_cmd cmd_force_resync = {
+ cmd_force_resync_alloc, "force-resync", "<mailbox>"
+};
+static struct doveadm_mail_cmd cmd_purge = {
+ cmd_purge_alloc, "purge", NULL
+};
+
+static struct doveadm_mail_cmd *mail_commands[] = {
+ &cmd_force_resync,
+ &cmd_purge,
+ &cmd_expunge,
+ &cmd_search,
+ &cmd_fetch,
+ &cmd_altmove,
+ &cmd_mailbox_list,
+ &cmd_mailbox_create,
+ &cmd_mailbox_delete,
+ &cmd_mailbox_rename
};
void doveadm_mail_init(void)
i_array_init(&doveadm_mail_cmds, 32);
for (i = 0; i < N_ELEMENTS(mail_commands); i++)
- doveadm_mail_register_cmd(&mail_commands[i]);
+ doveadm_mail_register_cmd(mail_commands[i]);
memset(&mod_set, 0, sizeof(mod_set));
mod_set.version = master_service_get_version_string(master_service);
struct doveadm_mail_cmd_context {
pool_t pool;
+ void (*init)(struct doveadm_mail_cmd_context *ctx,
+ const char *const args[]);
void (*run)(struct doveadm_mail_cmd_context *ctx,
struct mail_user *mail_user);
void (*deinit)(struct doveadm_mail_cmd_context *ctx);
};
struct doveadm_mail_cmd {
- struct doveadm_mail_cmd_context *
- (*init)(const char *const args[]);
+ struct doveadm_mail_cmd_context *(*alloc)(void);
const char *name;
const char *usage_args;
};
doveadm_mail_build_search_args(const char *const args[]);
struct doveadm_mail_cmd_context *
-doveadm_mail_cmd_init_size(size_t size);
-#define doveadm_mail_cmd_init(type) \
- (type *)doveadm_mail_cmd_init_size(sizeof(type))
-
-struct doveadm_mail_cmd_context *cmd_expunge(const char *const args[]);
-struct doveadm_mail_cmd_context *cmd_search(const char *const args[]);
-struct doveadm_mail_cmd_context *cmd_fetch(const char *const args[]);
-struct doveadm_mail_cmd_context *cmd_altmove(const char *const args[]);
-struct doveadm_mail_cmd_context *cmd_mailbox_list(const char *const args[]);
-struct doveadm_mail_cmd_context *cmd_mailbox_create(const char *const args[]);
-struct doveadm_mail_cmd_context *cmd_mailbox_delete(const char *const args[]);
-struct doveadm_mail_cmd_context *cmd_mailbox_rename(const char *const args[]);
+doveadm_mail_cmd_alloc_size(size_t size);
+#define doveadm_mail_cmd_alloc(type) \
+ (type *)doveadm_mail_cmd_alloc_size(sizeof(type))
+
+struct doveadm_mail_cmd cmd_expunge;
+struct doveadm_mail_cmd cmd_search;
+struct doveadm_mail_cmd cmd_fetch;
+struct doveadm_mail_cmd cmd_altmove;
+struct doveadm_mail_cmd cmd_mailbox_list;
+struct doveadm_mail_cmd cmd_mailbox_create;
+struct doveadm_mail_cmd cmd_mailbox_delete;
+struct doveadm_mail_cmd cmd_mailbox_rename;
#endif