]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
doveadm: Avoid calling init() in doveadm binary if the command is sent to doveadm...
authorTimo Sirainen <tss@iki.fi>
Fri, 5 Dec 2014 02:39:11 +0000 (04:39 +0200)
committerTimo Sirainen <tss@iki.fi>
Fri, 5 Dec 2014 02:39:11 +0000 (04:39 +0200)
The init() is still always called when -A or -u *wildcards* are used though.
I'm not sure if that can be delayed. At least all commands should be
verified that they don't rely on the current init() location.

src/doveadm/doveadm-mail.c

index 9a0627e751c388df9de03ab570c6926e8324b911..6f99a194168724bcec7db7d31176f129036d45de 100644 (file)
@@ -266,7 +266,7 @@ static struct doveadm_mail_cmd_context *cmd_force_resync_alloc(void)
 }
 
 static int
-doveadm_mail_next_user(struct doveadm_mail_cmd_context *ctx,
+doveadm_mail_next_user(struct doveadm_mail_cmd_context *ctx, bool init_user,
                       const struct mail_storage_service_input *input,
                       const char **error_r)
 {
@@ -285,6 +285,14 @@ doveadm_mail_next_user(struct doveadm_mail_cmd_context *ctx,
        if (ret != 0)
                return ret;
 
+       if (init_user) {
+               /* call init() after we've checked whether we want to do this
+                  via doveadm-server or not */
+               ctx->v.init(ctx, ctx->args);
+               if (hook_doveadm_mail_init != NULL)
+                       hook_doveadm_mail_init(ctx);
+       }
+
        ret = mail_storage_service_lookup(ctx->storage_service, input,
                                          &ctx->cur_service_user, &error);
        if (ret <= 0) {
@@ -330,11 +338,7 @@ int doveadm_mail_single_user(struct doveadm_mail_cmd_context *ctx,
        ctx->storage_service_input = *input;
        ctx->storage_service = mail_storage_service_init(master_service, NULL,
                                                         ctx->service_flags);
-       ctx->v.init(ctx, ctx->args);
-       if (hook_doveadm_mail_init != NULL)
-               hook_doveadm_mail_init(ctx);
-
-       return doveadm_mail_next_user(ctx, input, error_r);
+       return doveadm_mail_next_user(ctx, TRUE, input, error_r);
 }
 
 static void sig_die(const siginfo_t *si, void *context ATTR_UNUSED)
@@ -379,7 +383,7 @@ doveadm_mail_all_users(struct doveadm_mail_cmd_context *ctx, char *argv[],
                ctx->cur_username = user;
                doveadm_print_sticky("username", user);
                T_BEGIN {
-                       ret = doveadm_mail_next_user(ctx, &input, &error);
+                       ret = doveadm_mail_next_user(ctx, FALSE, &input, &error);
                        if (ret < 0)
                                i_error("%s", error);
                        else if (ret == 0)