From: Timo Sirainen Date: Tue, 4 May 2010 19:00:41 +0000 (+0300) Subject: doveadm: Renamed "list" to "mailbox list" and added mailbox create/rename/delete. X-Git-Tag: 2.0.beta5~10 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=9cf4bb70f014849735aab4226691edcdf56b3271;p=thirdparty%2Fdovecot%2Fcore.git doveadm: Renamed "list" to "mailbox list" and added mailbox create/rename/delete. --HG-- branch : HEAD --- diff --git a/src/doveadm/Makefile.am b/src/doveadm/Makefile.am index 43a127b201..2387a293a1 100644 --- a/src/doveadm/Makefile.am +++ b/src/doveadm/Makefile.am @@ -56,7 +56,7 @@ doveadm_SOURCES = \ doveadm-mail-expunge.c \ doveadm-mail-fetch.c \ doveadm-mail-iter.c \ - doveadm-mail-list.c \ + doveadm-mail-mailbox.c \ doveadm-mail-list-iter.c \ doveadm-mail-search.c \ doveadm-penalty.c \ diff --git a/src/doveadm/doveadm-mail-list.c b/src/doveadm/doveadm-mail-list.c deleted file mode 100644 index 8865ee829b..0000000000 --- a/src/doveadm/doveadm-mail-list.c +++ /dev/null @@ -1,58 +0,0 @@ -/* Copyright (c) 2010 Dovecot authors, see the included COPYING file */ - -#include "lib.h" -#include "mail-storage.h" -#include "mail-search-build.h" -#include "doveadm-mail-list-iter.h" -#include "doveadm-mail.h" - -#include - -struct list_cmd_context { - struct doveadm_mail_cmd_context ctx; - struct mail_search_args *search_args; -}; - -static void -cmd_list_run(struct doveadm_mail_cmd_context *_ctx, struct mail_user *user) -{ - struct list_cmd_context *ctx = (struct list_cmd_context *)_ctx; - const enum mailbox_list_iter_flags iter_flags = - MAILBOX_LIST_ITER_RAW_LIST | - MAILBOX_LIST_ITER_VIRTUAL_NAMES | - MAILBOX_LIST_ITER_NO_AUTO_INBOX | - MAILBOX_LIST_ITER_RETURN_NO_FLAGS; - struct doveadm_mail_list_iter *iter; - const struct mailbox_info *info; - - iter = doveadm_mail_list_iter_init(user, ctx->search_args, iter_flags); - while ((info = doveadm_mail_list_iter_next(iter)) != NULL) { - printf("%s\n", info->name); - } - doveadm_mail_list_iter_deinit(&iter); -} - -struct doveadm_mail_cmd_context *cmd_list(const char *const args[]) -{ - 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_list_run; - - ctx->search_args = mail_search_build_init(); - for (i = 0; args[i] != NULL; i++) { - arg = mail_search_build_add(ctx->search_args, - SEARCH_MAILBOX_GLOB); - arg->value.str = p_strdup(ctx->search_args->pool, args[i]); - } - if (i > 1) { - struct mail_search_arg *subargs = ctx->search_args->args; - - ctx->search_args->args = NULL; - arg = mail_search_build_add(ctx->search_args, SEARCH_OR); - arg->value.subargs = subargs; - } - return &ctx->ctx; -} diff --git a/src/doveadm/doveadm-mail-mailbox.c b/src/doveadm/doveadm-mail-mailbox.c new file mode 100644 index 0000000000..5631a29c3a --- /dev/null +++ b/src/doveadm/doveadm-mail-mailbox.c @@ -0,0 +1,217 @@ +/* Copyright (c) 2010 Dovecot authors, see the included COPYING file */ + +#include "lib.h" +#include "array.h" +#include "mail-namespace.h" +#include "mail-storage.h" +#include "mail-search-build.h" +#include "doveadm-mail-list-iter.h" +#include "doveadm-mail.h" + +#include + +struct mailbox_cmd_context { + struct doveadm_mail_cmd_context ctx; + ARRAY_TYPE(const_string) mailboxes; +}; + +struct rename_cmd_context { + struct doveadm_mail_cmd_context ctx; + const char *oldname, *newname; +}; + +struct list_cmd_context { + struct doveadm_mail_cmd_context ctx; + struct mail_search_args *search_args; +}; + +static void +cmd_mailbox_list_run(struct doveadm_mail_cmd_context *_ctx, + struct mail_user *user) +{ + struct list_cmd_context *ctx = (struct list_cmd_context *)_ctx; + const enum mailbox_list_iter_flags iter_flags = + MAILBOX_LIST_ITER_RAW_LIST | + MAILBOX_LIST_ITER_VIRTUAL_NAMES | + MAILBOX_LIST_ITER_NO_AUTO_INBOX | + MAILBOX_LIST_ITER_RETURN_NO_FLAGS; + struct doveadm_mail_list_iter *iter; + const struct mailbox_info *info; + + iter = doveadm_mail_list_iter_init(user, ctx->search_args, iter_flags); + while ((info = doveadm_mail_list_iter_next(iter)) != NULL) { + printf("%s\n", info->name); + } + doveadm_mail_list_iter_deinit(&iter); +} + +struct doveadm_mail_cmd_context *cmd_mailbox_list(const char *const args[]) +{ + 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, + SEARCH_MAILBOX_GLOB); + arg->value.str = p_strdup(ctx->search_args->pool, args[i]); + } + if (i > 1) { + struct mail_search_arg *subargs = ctx->search_args->args; + + ctx->search_args->args = NULL; + arg = mail_search_build_add(ctx->search_args, SEARCH_OR); + arg->value.subargs = subargs; + } + return &ctx->ctx; +} + +static void +cmd_mailbox_create_run(struct doveadm_mail_cmd_context *_ctx, + struct mail_user *user) +{ + struct mailbox_cmd_context *ctx = (struct mailbox_cmd_context *)_ctx; + struct mail_namespace *ns; + struct mailbox *box; + const char *const *namep; + + array_foreach(&ctx->mailboxes, namep) { + const char *storage_name = *namep; + unsigned int len; + bool directory = FALSE; + + ns = mail_namespace_find(user->namespaces, &storage_name); + if (ns == NULL) + i_fatal("Can't find namespace for: %s", *namep); + + len = strlen(storage_name); + if (len > 0 && storage_name[len-1] == ns->real_sep) { + storage_name = t_strndup(storage_name, len-1); + directory = TRUE; + } + + box = mailbox_alloc(ns->list, storage_name, 0); + if (mailbox_create(box, NULL, directory) < 0) { + struct mail_storage *storage = mailbox_get_storage(box); + + i_error("Can't create mailbox %s: %s", *namep, + mail_storage_get_last_error(storage, NULL)); + } + mailbox_free(&box); + } +} + +struct doveadm_mail_cmd_context *cmd_mailbox_create(const char *const args[]) +{ + 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); + } + return &ctx->ctx; +} + +static void +cmd_mailbox_delete_run(struct doveadm_mail_cmd_context *_ctx, + struct mail_user *user) +{ + struct mailbox_cmd_context *ctx = (struct mailbox_cmd_context *)_ctx; + struct mail_namespace *ns; + struct mailbox *box; + const char *const *namep; + + array_foreach(&ctx->mailboxes, namep) { + const char *storage_name = *namep; + + ns = mail_namespace_find(user->namespaces, &storage_name); + if (ns == NULL) + i_fatal("Can't find namespace for: %s", *namep); + + box = mailbox_alloc(ns->list, storage_name, 0); + if (mailbox_delete(box) < 0) { + struct mail_storage *storage = mailbox_get_storage(box); + + i_error("Can't delete mailbox %s: %s", *namep, + mail_storage_get_last_error(storage, NULL)); + } + mailbox_free(&box); + } +} + +struct doveadm_mail_cmd_context *cmd_mailbox_delete(const char *const args[]) +{ + 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); + } + return &ctx->ctx; +} + +static void +cmd_mailbox_rename_run(struct doveadm_mail_cmd_context *_ctx, + struct mail_user *user) +{ + struct rename_cmd_context *ctx = (struct rename_cmd_context *)_ctx; + struct mail_namespace *oldns, *newns; + struct mailbox *oldbox, *newbox; + const char *oldname = ctx->oldname; + const char *newname = ctx->newname; + + oldns = mail_namespace_find(user->namespaces, &oldname); + if (oldns == NULL) + i_fatal("Can't find namespace for: %s", oldname); + newns = mail_namespace_find(user->namespaces, &newname); + if (newns == NULL) + i_fatal("Can't find namespace for: %s", newname); + + oldbox = mailbox_alloc(oldns->list, oldname, 0); + newbox = mailbox_alloc(newns->list, newname, 0); + if (mailbox_rename(oldbox, newbox, TRUE) < 0) { + struct mail_storage *storage = mailbox_get_storage(oldbox); + + i_error("Can't rename mailbox %s to %s: %s", oldname, newname, + mail_storage_get_last_error(storage, NULL)); + } + mailbox_free(&oldbox); + mailbox_free(&newbox); +} + +struct doveadm_mail_cmd_context *cmd_mailbox_rename(const char *const args[]) +{ + 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]); + return &ctx->ctx; +} diff --git a/src/doveadm/doveadm-mail.c b/src/doveadm/doveadm-mail.c index b5123299b2..5426ea668b 100644 --- a/src/doveadm/doveadm-mail.c +++ b/src/doveadm/doveadm-mail.c @@ -424,7 +424,10 @@ static struct doveadm_mail_cmd mail_commands[] = { { cmd_search, "search", "" }, { cmd_fetch, "fetch", " " }, { cmd_altmove, "altmove", "" }, - { cmd_list, "list", "[ [...]]" } + { cmd_mailbox_list, "mailbox list", "[ [...]]" }, + { cmd_mailbox_create, "mailbox create", " [...]" }, + { cmd_mailbox_delete, "mailbox delete", " [...]" }, + { cmd_mailbox_rename, "mailbox rename", " " } }; void doveadm_mail_init(void) diff --git a/src/doveadm/doveadm-mail.h b/src/doveadm/doveadm-mail.h index d48e139791..677c90cb6c 100644 --- a/src/doveadm/doveadm-mail.h +++ b/src/doveadm/doveadm-mail.h @@ -48,6 +48,9 @@ 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_list(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[]); #endif