doveadm-mail.c revision 844929a7bd6e9d21f0a8cdb3a19f4620a17cdeca
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch/* Copyright (c) 2009-2016 Dovecot authors, see the included COPYING file */
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch#define DOVEADM_MAIL_CMD_INPUT_TIMEOUT_MSECS (5*60*1000)
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan BoschARRAY_TYPE(doveadm_mail_cmd) doveadm_mail_cmds;
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Boschvoid (*hook_doveadm_mail_init)(struct doveadm_mail_cmd_context *ctx);
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Boschvoid doveadm_mail_failed_error(struct doveadm_mail_cmd_context *ctx,
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch /* tempfail overrides all other exit codes, otherwise use whatever
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch error happened first */
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch if (ctx->exit_code == 0 || exit_code == EX_TEMPFAIL)
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Boschvoid doveadm_mail_failed_storage(struct doveadm_mail_cmd_context *ctx,
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Boschvoid doveadm_mail_failed_mailbox(struct doveadm_mail_cmd_context *ctx,
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch doveadm_mail_failed_storage(ctx, mailbox_get_storage(box));
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Boschvoid doveadm_mail_failed_list(struct doveadm_mail_cmd_context *ctx,
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch i_assert(size >= sizeof(struct doveadm_mail_cmd_context));
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch pool = pool_alloconly_create("doveadm mail cmd", 1024);
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Boschcmd_purge_run(struct doveadm_mail_cmd_context *ctx, struct mail_user *user)
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch for (ns = user->namespaces; ns != NULL; ns = ns->next) {
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch if (ns->type != MAIL_NAMESPACE_TYPE_PRIVATE ||
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch storage = mail_namespace_get_default_storage(ns);
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch i_error("Purging namespace '%s' failed: %s", ns->prefix,
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Boschstatic struct doveadm_mail_cmd_context *cmd_purge_alloc(void)
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch ctx = doveadm_mail_cmd_alloc(struct doveadm_mail_cmd_context);
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Boschstatic void doveadm_mail_cmd_input_input(struct doveadm_mail_cmd_context *ctx)
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch i_stream_skip(ctx->cmd_input, i_stream_get_data_size(ctx->cmd_input));
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Boschstatic void doveadm_mail_cmd_input_timeout(struct doveadm_mail_cmd_context *ctx)
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch input = i_stream_create_error_str(ETIMEDOUT, "Timed out in %u secs",
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch i_stream_set_name(input, i_stream_get_name(ctx->cmd_input));
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Boschstatic void doveadm_mail_cmd_input_read(struct doveadm_mail_cmd_context *ctx)
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch to = timeout_add(DOVEADM_MAIL_CMD_INPUT_TIMEOUT_MSECS,
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch /* read the pending input from stream. */
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Boschvoid doveadm_mail_get_input(struct doveadm_mail_cmd_context *ctx)
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch inputs[0] = i_stream_create_dot(ctx->conn->input, FALSE);
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch inputs[0] = i_stream_create_fd(STDIN_FILENO, 1024*1024, FALSE);
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch ctx->cmd_input_fd = i_stream_get_fd(inputs[0]);
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch ctx->cmd_input = i_stream_create_seekable_path(inputs, 1024*256,
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch i_stream_set_name(ctx->cmd_input, i_stream_get_name(inputs[0]));
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Boschdoveadm_mailbox_find(struct mail_user *user, const char *mailbox)
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch ns = mail_namespace_find(user->namespaces, mailbox);
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch return mailbox_alloc(ns->list, mailbox, MAILBOX_FLAG_IGNORE_ACLS);
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Boschdoveadm_mail_build_search_args(const char *const args[])
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch parser = mail_search_parser_init_cmdline(args);
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch if (mail_search_build(mail_search_register_get_human(),
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Boschstatic int cmd_force_resync_box(struct doveadm_mail_cmd_context *ctx,
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch box = mailbox_alloc(info->ns->list, info->vname,
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch i_error("Opening mailbox %s failed: %s", info->vname,
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch } else if (mailbox_sync(box, MAILBOX_SYNC_FLAG_FORCE_RESYNC |
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch i_error("Forcing a resync on mailbox %s failed: %s",
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch info->vname, mailbox_get_last_error(box, NULL));
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Boschstatic int cmd_force_resync_run(struct doveadm_mail_cmd_context *ctx,
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch const enum mailbox_list_iter_flags iter_flags =
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch const enum mail_namespace_type ns_mask = MAIL_NAMESPACE_TYPE_MASK_ALL;
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch iter = mailbox_list_iter_init_namespaces(user->namespaces, ctx->args,
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch while ((info = mailbox_list_iter_next(iter)) != NULL) {
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch mailbox_list_get_last_error(user->namespaces->list, NULL));
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch doveadm_mail_failed_list(ctx, user->namespaces->list);
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Boschcmd_force_resync_init(struct doveadm_mail_cmd_context *_ctx ATTR_UNUSED,
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch const char *const args[])
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Boschstatic struct doveadm_mail_cmd_context *cmd_force_resync_alloc(void)
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch ctx = doveadm_mail_cmd_alloc(struct doveadm_mail_cmd_context);
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Boschdoveadm_mail_next_user(struct doveadm_mail_cmd_context *ctx,
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch const struct mail_storage_service_input *input,
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch const char **error_r)
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch i_set_failure_prefix("doveadm(%s): ", input->username);
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch i_set_failure_prefix("doveadm(%s,%s): ", ip, input->username);
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch /* see if we want to execute this command via (another)
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch doveadm server */
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch ret = doveadm_mail_server_user(ctx, input, error_r);
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch ret = mail_storage_service_lookup(ctx->storage_service, input,
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch *error_r = t_strdup_printf("User lookup failed: %s",
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch if (ctx->v.prerun(ctx, ctx->cur_service_user, error_r) < 0) {
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch mail_storage_service_user_free(&ctx->cur_service_user);
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch ret = mail_storage_service_next(ctx->storage_service,
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch mail_storage_service_user_free(&ctx->cur_service_user);
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch if (ctx->v.run(ctx, ctx->cur_mail_user) < 0) {
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch mail_storage_service_user_free(&ctx->cur_service_user);
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Boschstatic void sig_die(const siginfo_t *si, void *context ATTR_UNUSED)
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Boschint doveadm_mail_single_user(struct doveadm_mail_cmd_context *ctx,
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch const struct mail_storage_service_input *input,
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch const char **error_r)
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch ctx->storage_service = mail_storage_service_init(master_service, NULL,
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch lib_signals_set_handler(SIGINT, 0, sig_die, NULL);
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch lib_signals_set_handler(SIGTERM, 0, sig_die, NULL);
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch return doveadm_mail_next_user(ctx, input, error_r);
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Boschdoveadm_mail_all_users(struct doveadm_mail_cmd_context *ctx,
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch ctx->service_flags |= MAIL_STORAGE_SERVICE_FLAG_USERDB_LOOKUP;
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch ctx->storage_service = mail_storage_service_init(master_service, NULL,
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch lib_signals_set_handler(SIGINT, 0, sig_die, NULL);
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch lib_signals_set_handler(SIGTERM, 0, sig_die, NULL);
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch mail_storage_service_all_init(ctx->storage_service);
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch while ((ret = ctx->v.get_next_user(ctx, &user)) > 0) {
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch if (!wildcard_match_icase(user, wildcard_user))
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch ret = doveadm_mail_next_user(ctx, &input, &error);
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch else if (ret == 0)
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch i_warning("Killed with signal %d", killed_signo);
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch i_error("Failed to iterate through some users");
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Boschdoveadm_mail_cmd_init_noop(struct doveadm_mail_cmd_context *ctx ATTR_UNUSED,
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Boschdoveadm_mail_cmd_get_next_user(struct doveadm_mail_cmd_context *ctx,
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch return mail_storage_service_all_next(ctx->storage_service, username_r);
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch *username_r = i_stream_read_next_line(ctx->users_list_input);
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch if (ctx->users_list_input->stream_errno != 0) {
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Boschdoveadm_mail_cmd_deinit_noop(struct doveadm_mail_cmd_context *ctx ATTR_UNUSED)
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Boschdoveadm_mail_cmd_init(const struct doveadm_mail_cmd *cmd,
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch ctx->v.get_next_user = doveadm_mail_cmd_get_next_user;
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch p_array_init(&ctx->module_contexts, ctx->pool, 5);
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Boschdoveadm_mail_cmdline_init(const struct doveadm_mail_cmd *cmd)
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch ctx = doveadm_mail_cmd_init(cmd, doveadm_settings);
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch ctx->service_flags |= MAIL_STORAGE_SERVICE_FLAG_NO_LOG_INIT;
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch ctx->service_flags |= MAIL_STORAGE_SERVICE_FLAG_DEBUG;
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Boschdoveadm_mail_cmd_exec(struct doveadm_mail_cmd_context *ctx,
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch !ctx->iterate_all_users && wildcard_user == NULL;
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch if (doveadm_print_is_initialized() && !ctx->iterate_single_user) {
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch i_fatal_status(EX_USAGE, "USER environment is missing and -u option not used");
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch ret = doveadm_mail_single_user(ctx, &input, &error);
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch /* user lookup/init failed somehow */
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch } else if (ret == 0) {
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch ctx->service_flags |= MAIL_STORAGE_SERVICE_FLAG_TEMP_PRIV_DROP;
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch /* service deinit unloads mail plugins, so do it late */
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch mail_storage_service_deinit(&ctx->storage_service);
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Boschstatic void doveadm_mail_cmd_free(struct doveadm_mail_cmd_context *ctx)
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Boschdoveadm_mail_cmd(const struct doveadm_mail_cmd *cmd, int argc, char *argv[])
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch /* keep context's getopt_args first in case it contains '+' */
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch getopt_args = t_strconcat(ctx->getopt_args, getopt_args, NULL);
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch i_assert(master_getopt_str_is_valid(getopt_args));
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch while ((c = getopt(argc, argv, getopt_args)) > 0) {
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch doveadm_settings->doveadm_socket_path = optarg;
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch if (doveadm_settings->doveadm_worker_count == 0)
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch if (argv[0] != NULL && cmd->usage_args == NULL) {
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch i_fatal_status(EX_USAGE, "doveadm %s: Unknown parameter: %s",
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Boschdoveadm_mail_cmd_try_find_multi_word(const struct doveadm_mail_cmd *cmd,
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch const char *const **argv)
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch unsigned int len;
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch /* more args */
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch return doveadm_mail_cmd_try_find_multi_word(cmd, cmdname + len + 1,
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Boschdoveadm_mail_cmd_find_from_argv(const char *cmd_name, int *argc,
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch const char *const **argv)
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch const char *const *orig_argv;
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch /* see if it matches a multi-word command */
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch if (strncmp(cmd->name, cmd_name, cmd_name_len) == 0 &&
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch const char *subcmd = cmd->name + cmd_name_len + 1;
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch if (doveadm_mail_cmd_try_find_multi_word(cmd, subcmd,
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Boschbool doveadm_mail_try_run(const char *cmd_name, int argc, char *argv[])
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch cmd = doveadm_mail_cmd_find_from_argv(cmd_name, &argc, (void *)&argv);
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Boschvoid doveadm_mail_register_cmd(const struct doveadm_mail_cmd *cmd)
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch /* for now we'll just assume that cmd will be permanently in memory */
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Boschconst struct doveadm_mail_cmd *doveadm_mail_cmd_find(const char *cmd_name)
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch if (cmd->usage_args == &doveadm_mail_cmd_hide)
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch str_printfa(out, "%s\t"DOVEADM_CMD_MAIL_USAGE_PREFIX, cmd->name);
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Boschvoid doveadm_mail_help(const struct doveadm_mail_cmd *cmd)
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch fprintf(stderr, "doveadm %s "DOVEADM_CMD_MAIL_USAGE_PREFIX" %s\n",
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch cmd->name, cmd->usage_args == NULL ? "" : cmd->usage_args);
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Boschvoid doveadm_mail_try_help_name(const char *cmd_name)
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Boschbool doveadm_mail_has_subcommands(const char *cmd_name)
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Boschvoid doveadm_mail_help_name(const char *cmd_name)
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch i_fatal("Missing help for command %s", cmd_name);
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Boschstatic struct doveadm_mail_cmd cmd_force_resync = {
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch cmd_force_resync_alloc, "force-resync", "<mailbox mask>"
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Boschstatic struct doveadm_mail_cmd *mail_commands[] = {
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Boschstatic struct doveadm_cmd_ver2 *mail_commands_ver2[] = {
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch unsigned int i;
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch for (i = 0; i < N_ELEMENTS(mail_commands); i++)
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch for (i = 0; i < N_ELEMENTS(mail_commands_ver2); i++)
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch doveadm_cmd_register_ver2(mail_commands_ver2[i]);
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch /* load all configured mail plugins */
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch module_dir_load_missing(mail_storage_service_modules,
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Boschdoveadm_cmd_ver2_to_mail_cmd_wrapper(const struct doveadm_cmd_ver2* cmd,
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch int argc, const struct doveadm_cmd_param argv[])
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch for(i=0;i<argc;i++) {
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch ctx->iterate_all_users = argv[i].value.v_bool;
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch } else if (strcmp(argv[i].name, "socket-path") == 0) {
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch doveadm_settings->doveadm_socket_path = argv[i].value.v_string;
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch if (doveadm_settings->doveadm_worker_count == 0)
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch } else if (strcmp(argv[i].name, "user") == 0) {
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch ctx->service_flags |= MAIL_STORAGE_SERVICE_FLAG_USERDB_LOOKUP;
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch } else if (strcmp(argv[i].name, "user-file") == 0) {
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch ctx->service_flags |= MAIL_STORAGE_SERVICE_FLAG_USERDB_LOOKUP;
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch ctx->users_list_input = argv[i].value.v_istream;
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch } else if (ctx->v.parse_arg != NULL && argv[i].short_opt != '\0') {
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch } else if (strcmp(argv[i].name, "field") == 0) {
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch /* mailbox status, fetch: convert an array into a
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch single space-separated parameter (alternative to
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch fieldstr = p_array_const_string_join(ctx->pool,
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch } else if (strcmp(argv[i].name, "file") == 0) {
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch /* input for doveadm_mail_get_input(),
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch used by e.g. save */
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch i_error("Only one file input allowed: %s", argv[i].name);
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch } else if ((argv[i].flags & CMD_PARAM_FLAG_POSITIONAL) != 0) {
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch /* feed this into pargv */
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch array_append_array(&pargv, &argv[i].value.v_array);
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch array_append(&pargv, &argv[i].value.v_string, 1);
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch i_error("invalid parameter: %s", argv[i].name);