]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
doveadm: Changed mail command API to be more easily extensible.
authorTimo Sirainen <tss@iki.fi>
Thu, 13 May 2010 08:59:37 +0000 (10:59 +0200)
committerTimo Sirainen <tss@iki.fi>
Thu, 13 May 2010 08:59:37 +0000 (10:59 +0200)
--HG--
branch : HEAD

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

index 162981577992da99c3107a8392796dfe16b5d74a..4505eadb092f42e8b6c279ab8df8b3b0ac174b41 100644 (file)
@@ -94,15 +94,26 @@ cmd_altmove_run(struct doveadm_mail_cmd_context *_ctx, struct mail_user *user)
        }
 }
 
-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>"
+};
index 97ca11d9bbea789568bd6a1831a85e7af3823e6e..bc063c5443f2e7b7c12252a89f4bc4172e683604 100644 (file)
@@ -195,16 +195,28 @@ cmd_expunge_run(struct doveadm_mail_cmd_context *_ctx, struct mail_user *user)
        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>"
+};
index b7242418a924f3cd3f87785e5a87b37aee1ba096..aa0e1562db32b8442868ef91258f43f922dc6006 100644 (file)
@@ -383,19 +383,16 @@ static void cmd_fetch_deinit(struct doveadm_mail_cmd_context *_ctx)
        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 @@ struct doveadm_mail_cmd_context *cmd_fetch(const char *const args[])
                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>"
+};
index 5631a29c3a9c0a0bcc0494ecce1f3fad8b6a87c2..c7772dd66b762b198840079af1e80a38ee07e114 100644 (file)
@@ -45,15 +45,13 @@ cmd_mailbox_list_run(struct doveadm_mail_cmd_context *_ctx,
        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 @@ struct doveadm_mail_cmd_context *cmd_mailbox_list(const char *const 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;
 }
 
@@ -105,23 +112,30 @@ cmd_mailbox_create_run(struct doveadm_mail_cmd_context *_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;
 }
 
@@ -152,23 +166,30 @@ cmd_mailbox_delete_run(struct doveadm_mail_cmd_context *_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;
 }
 
@@ -201,17 +222,41 @@ cmd_mailbox_rename_run(struct doveadm_mail_cmd_context *_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>"
+};
index 72f6ee4d2c56fddfe3dec0a9cd76f66f9ac1fafd..eac69d516757cd38389851c378c548a098777c24 100644 (file)
@@ -60,15 +60,27 @@ cmd_search_run(struct doveadm_mail_cmd_context *_ctx, struct mail_user *user)
        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>"
+};
index eee3cd439b816a159d41ded8d5d9bccafb0e0f9f..6e5e8b9ef6dd8b97116daaeeb0a24df174cf92f6 100644 (file)
@@ -25,7 +25,7 @@ ARRAY_TYPE(doveadm_mail_cmd) doveadm_mail_cmds;
 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 @@ cmd_purge_run(struct doveadm_mail_cmd_context *ctx ATTR_UNUSED,
        }
 }
 
-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 @@ static void cmd_force_resync_run(struct doveadm_mail_cmd_context *_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;
 }
 
@@ -294,6 +301,7 @@ doveadm_mail_cmd(const struct doveadm_mail_cmd *cmd, int argc, char *argv[])
        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 @@ doveadm_mail_cmd(const struct doveadm_mail_cmd *cmd, int argc, char *argv[])
                        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 @@ void doveadm_mail_help_name(const char *cmd_name)
        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 @@ 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);
index 3c25447800bf46098b376f598d85cc6d3a470833..9421d6a02261546c34be8ecaa9e8a73399414ac9 100644 (file)
@@ -9,14 +9,15 @@ struct doveadm_mail_cmd_context;
 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 @@ struct mail_search_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