]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
doveadm server: Fixes to command/parameter handling.
authorTimo Sirainen <tss@iki.fi>
Tue, 23 Nov 2010 15:30:32 +0000 (15:30 +0000)
committerTimo Sirainen <tss@iki.fi>
Tue, 23 Nov 2010 15:30:32 +0000 (15:30 +0000)
src/doveadm/doveadm-mail-server.c
src/doveadm/doveadm-mail.c
src/doveadm/doveadm-mail.h
src/doveadm/main.c

index 2f4b449f60c7df1fc7ad865da73335817149aeb5..e1f3e2ee68055f70b957cb22d12a7eb693339fdb 100644 (file)
@@ -121,6 +121,8 @@ static void doveadm_mail_server_handle(struct server_connection *conn,
        str_append_c(cmd, '\t');
 
        str_tabescape_write(cmd, username);
+       str_append_c(cmd, '\t');
+       str_tabescape_write(cmd, cmd_ctx->cmd->name);
        for (i = 0; cmd_ctx->args[i] != NULL; i++) {
                str_append_c(cmd, '\t');
                str_tabescape_write(cmd, cmd_ctx->args[i]);
@@ -159,7 +161,8 @@ static const char *userdb_field_find(const char *const *fields, const char *key)
 }
 
 int doveadm_mail_server_user(struct doveadm_mail_cmd_context *ctx,
-                            struct mail_storage_service_user *user)
+                            struct mail_storage_service_user *user,
+                            const char **error_r)
 {
        const struct mail_storage_service_input *input;
        struct doveadm_server *server;
@@ -178,9 +181,8 @@ int doveadm_mail_server_user(struct doveadm_mail_cmd_context *ctx,
        if (userdb_field_find(input->userdb_fields, "proxy") != NULL) {
                host = userdb_field_find(input->userdb_fields, "host");
                if (host == NULL) {
-                       i_error("user %s: Proxy is missing destination host",
-                               input->username);
-                       return 0;
+                       *error_r = "Proxy is missing destination host";
+                       return -1;
                }
        } else {
                host = doveadm_settings->doveadm_socket_path;
@@ -201,6 +203,7 @@ int doveadm_mail_server_user(struct doveadm_mail_cmd_context *ctx,
                username_dup = i_strdup(input->username);
                array_append(&server->queue, &username_dup, 1);
        }
+       *error_r = "doveadm server failure";
        return DOVEADM_MAIL_SERVER_FAILED() ? -1 : 0;
 }
 
index d37e813a37babf1794eab1d12a98335ec2306b4e..be3e557c5479949964b3aa4344a3549d56c9ea4b 100644 (file)
@@ -204,10 +204,8 @@ doveadm_mail_next_user(struct doveadm_mail_cmd_context *ctx,
 
        if (doveadm_settings->doveadm_worker_count > 0 && !doveadm_server) {
                /* execute this command via doveadm server */
-               T_BEGIN {
-                       ret = doveadm_mail_server_user(ctx, service_user);
-                       mail_storage_service_user_free(&service_user);
-               } T_END;
+               ret = doveadm_mail_server_user(ctx, service_user, error_r);
+               mail_storage_service_user_free(&service_user);
                return ret < 0 ? -1 : 1;
        }
 
@@ -322,7 +320,6 @@ doveadm_mail_all_users(struct doveadm_mail_cmd_context *ctx, char *argv[],
        if (ret < 0)
                i_error("Failed to iterate through some users");
        mail_storage_service_deinit(&ctx->storage_service);
-       doveadm_mail_server_flush();
 }
 
 static void
@@ -374,7 +371,6 @@ doveadm_mail_cmd(const struct doveadm_mail_cmd *cmd, int argc, char *argv[])
                service_flags |= MAIL_STORAGE_SERVICE_FLAG_DEBUG;
 
        ctx = doveadm_mail_cmd_init(cmd);
-       ctx->args = (const void *)argv;
 
        getopt_args = t_strconcat("Au:", ctx->getopt_args, NULL);
        username = getenv("USER");
@@ -403,6 +399,7 @@ doveadm_mail_cmd(const struct doveadm_mail_cmd *cmd, int argc, char *argv[])
                i_fatal("doveadm %s: Unknown parameter: %s",
                        cmd->name, argv[0]);
        }
+       ctx->args = (const void *)argv;
 
        ctx->iterate_single_user =
                !ctx->iterate_all_users && wildcard_user == NULL;
@@ -418,6 +415,7 @@ doveadm_mail_cmd(const struct doveadm_mail_cmd *cmd, int argc, char *argv[])
                service_flags |= MAIL_STORAGE_SERVICE_FLAG_TEMP_PRIV_DROP;
                doveadm_mail_all_users(ctx, argv, wildcard_user, service_flags);
        }
+       doveadm_mail_server_flush();
        ctx->v.deinit(ctx);
        doveadm_print_flush();
 
index 93f9ddb4c0c7687c19b8acbd6fb79c30082e661d..df113f41af1bbab2d966594489dc6046a2738735 100644 (file)
@@ -85,7 +85,8 @@ void doveadm_mail_single_user(struct doveadm_mail_cmd_context *ctx,
                              char *argv[], const char *username,
                              enum mail_storage_service_flags service_flags);
 int doveadm_mail_server_user(struct doveadm_mail_cmd_context *ctx,
-                            struct mail_storage_service_user *user);
+                            struct mail_storage_service_user *user,
+                            const char **error_r);
 void doveadm_mail_server_flush(void);
 
 int doveadm_mailbox_find_and_sync(struct mail_user *user, const char *mailbox,
index 72b51455046c721d1763e3706972d449a8a63645..21975a2cf2a9714c1cd6f644ab4564a35e9c9c2a 100644 (file)
@@ -19,7 +19,8 @@ const struct doveadm_print_vfuncs *doveadm_print_vfuncs_all[] = {
 struct client_connection *doveadm_client;
 
 int doveadm_mail_server_user(struct doveadm_mail_cmd_context *ctx ATTR_UNUSED,
-                            struct mail_storage_service_user *user ATTR_UNUSED)
+                            struct mail_storage_service_user *user ATTR_UNUSED,
+                            const char **error_r ATTR_UNUSED)
 {
        /* this function should be called only by doveadm client code */
        i_unreached();