Mercurial > dovecot > core-2.2
changeset 11294:0c9db163d538 HEAD
doveadm: Changed mail command API to be more easily extensible.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Thu, 13 May 2010 10:59:37 +0200 |
parents | 13af90173e4f |
children | c9463679f71e |
files | src/doveadm/doveadm-mail-altmove.c src/doveadm/doveadm-mail-expunge.c src/doveadm/doveadm-mail-fetch.c src/doveadm/doveadm-mail-mailbox.c src/doveadm/doveadm-mail-search.c src/doveadm/doveadm-mail.c src/doveadm/doveadm-mail.h |
diffstat | 7 files changed, 183 insertions(+), 75 deletions(-) [+] |
line wrap: on
line diff
--- a/src/doveadm/doveadm-mail-altmove.c Thu May 13 09:27:06 2010 +0200 +++ b/src/doveadm/doveadm-mail-altmove.c Thu May 13 10:59:37 2010 +0200 @@ -94,15 +94,26 @@ } } -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); +} - ctx = doveadm_mail_cmd_init(struct altmove_cmd_context); +static struct doveadm_mail_cmd_context *cmd_altmove_alloc(void) +{ + struct altmove_cmd_context *ctx; + + 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>" +};
--- a/src/doveadm/doveadm-mail-expunge.c Thu May 13 09:27:06 2010 +0200 +++ b/src/doveadm/doveadm-mail-expunge.c Thu May 13 10:59:37 2010 +0200 @@ -195,16 +195,28 @@ 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>" +};
--- a/src/doveadm/doveadm-mail-fetch.c Thu May 13 09:27:06 2010 +0200 +++ b/src/doveadm/doveadm-mail-fetch.c Thu May 13 10:59:37 2010 +0200 @@ -383,19 +383,16 @@ 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); @@ -411,5 +408,19 @@ 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>" +};
--- a/src/doveadm/doveadm-mail-mailbox.c Thu May 13 09:27:06 2010 +0200 +++ b/src/doveadm/doveadm-mail-mailbox.c Thu May 13 10:59:37 2010 +0200 @@ -45,15 +45,13 @@ 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, @@ -67,6 +65,15 @@ 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; } @@ -105,23 +112,30 @@ } } -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; } @@ -152,23 +166,30 @@ } } -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; } @@ -201,17 +222,41 @@ 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>" +};
--- a/src/doveadm/doveadm-mail-search.c Thu May 13 09:27:06 2010 +0200 +++ b/src/doveadm/doveadm-mail-search.c Thu May 13 10:59:37 2010 +0200 @@ -60,15 +60,27 @@ 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->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; - ctx->search_args = doveadm_mail_build_search_args(args); return &ctx->ctx; } + +struct doveadm_mail_cmd cmd_search = { + cmd_search_alloc, "search", "<search query>" +};
--- a/src/doveadm/doveadm-mail.c Thu May 13 09:27:06 2010 +0200 +++ b/src/doveadm/doveadm-mail.c Thu May 13 10:59:37 2010 +0200 @@ -25,7 +25,7 @@ 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; @@ -55,12 +55,11 @@ } } -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; } @@ -139,18 +138,26 @@ 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->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; - ctx->mailbox = p_strdup(ctx->ctx.pool, mailbox); return &ctx->ctx; } @@ -294,6 +301,7 @@ 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) { @@ -316,7 +324,8 @@ 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 { @@ -422,17 +431,24 @@ 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) @@ -442,7 +458,7 @@ 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);
--- a/src/doveadm/doveadm-mail.h Thu May 13 09:27:06 2010 +0200 +++ b/src/doveadm/doveadm-mail.h Thu May 13 10:59:37 2010 +0200 @@ -9,14 +9,15 @@ 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; }; @@ -41,17 +42,17 @@ 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)) +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_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[]); +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