From 2cc88ff507e244faa63683f804833b321a62c665 Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Tue, 23 Nov 2010 15:30:32 +0000 Subject: [PATCH] doveadm server: Fixes to command/parameter handling. --- src/doveadm/doveadm-mail-server.c | 11 +++++++---- src/doveadm/doveadm-mail.c | 10 ++++------ src/doveadm/doveadm-mail.h | 3 ++- src/doveadm/main.c | 3 ++- 4 files changed, 15 insertions(+), 12 deletions(-) diff --git a/src/doveadm/doveadm-mail-server.c b/src/doveadm/doveadm-mail-server.c index 2f4b449f60..e1f3e2ee68 100644 --- a/src/doveadm/doveadm-mail-server.c +++ b/src/doveadm/doveadm-mail-server.c @@ -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; } diff --git a/src/doveadm/doveadm-mail.c b/src/doveadm/doveadm-mail.c index d37e813a37..be3e557c54 100644 --- a/src/doveadm/doveadm-mail.c +++ b/src/doveadm/doveadm-mail.c @@ -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(); diff --git a/src/doveadm/doveadm-mail.h b/src/doveadm/doveadm-mail.h index 93f9ddb4c0..df113f41af 100644 --- a/src/doveadm/doveadm-mail.h +++ b/src/doveadm/doveadm-mail.h @@ -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, diff --git a/src/doveadm/main.c b/src/doveadm/main.c index 72b5145504..21975a2cf2 100644 --- a/src/doveadm/main.c +++ b/src/doveadm/main.c @@ -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(); -- 2.47.3