From: Timo Sirainen Date: Tue, 16 Mar 2010 18:21:48 +0000 (+0200) Subject: mail_storage_service_lookup*() now separates userdb lookup and user setting errors. X-Git-Tag: 2.0.beta4~38 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=57ff998a443881c8959a8e65f6325cf19fefc1d0;p=thirdparty%2Fdovecot%2Fcore.git mail_storage_service_lookup*() now separates userdb lookup and user setting errors. --HG-- branch : HEAD --- diff --git a/src/doveadm/doveadm-mail.c b/src/doveadm/doveadm-mail.c index 654aa9db97..a263710733 100644 --- a/src/doveadm/doveadm-mail.c +++ b/src/doveadm/doveadm-mail.c @@ -183,7 +183,7 @@ doveadm_mail_all_users(doveadm_mail_command_t *cmd, else if (ret == 0) i_info("User no longer exists, skipping"); } T_END; - if (ret < 0) + if (ret == -1) break; if (doveadm_verbose) { if (++user_idx % interval == 0) { diff --git a/src/lib-storage/mail-storage-service.c b/src/lib-storage/mail-storage-service.c index 594830ffb2..2830daa1b3 100644 --- a/src/lib-storage/mail-storage-service.c +++ b/src/lib-storage/mail-storage-service.c @@ -812,12 +812,15 @@ int mail_storage_service_lookup(struct mail_storage_service_ctx *ctx, if (userdb_fields != NULL) { auth_user_fields_parse(userdb_fields, temp_pool, &reply); if (user_reply_handle(user, &reply, error_r) < 0) - ret = -1; + ret = -2; } pool_unref(&temp_pool); /* load per-user plugins */ - mail_storage_service_load_modules(ctx, user_info, user->user_set); + if (ret > 0) { + mail_storage_service_load_modules(ctx, user_info, + user->user_set); + } *user_r = user; return ret; diff --git a/src/lib-storage/mail-storage-service.h b/src/lib-storage/mail-storage-service.h index 56d3277e04..75148c67ad 100644 --- a/src/lib-storage/mail-storage-service.h +++ b/src/lib-storage/mail-storage-service.h @@ -60,7 +60,8 @@ int mail_storage_service_read_settings(struct mail_storage_service_ctx *ctx, or _all_init(). */ void mail_storage_service_init_settings(struct mail_storage_service_ctx *ctx, const struct mail_storage_service_input *input); -/* Returns 1 if ok, 0 if user wasn't found, -1 if error. */ +/* Returns 1 if ok, 0 if user wasn't found, -1 if fatal error, + -2 if user had invalid settings. */ int mail_storage_service_lookup(struct mail_storage_service_ctx *ctx, const struct mail_storage_service_input *input, struct mail_storage_service_user **user_r, diff --git a/src/plugins/expire/expire-tool.c b/src/plugins/expire/expire-tool.c index 59241f6a13..badadd26ee 100644 --- a/src/plugins/expire/expire-tool.c +++ b/src/plugins/expire/expire-tool.c @@ -23,6 +23,7 @@ struct expire_context { struct mail_user *mail_user; struct expire_env *env; bool testrun; + bool userdb_lookup_failed; }; static int expire_init_user(struct expire_context *ctx, const char *user) @@ -43,7 +44,12 @@ static int expire_init_user(struct expire_context *ctx, const char *user) if (ret <= 0) { if (ret < 0 || ctx->testrun) i_error("%s", errstr); - return ret; + if (ret == -1) { + /* the next userdb lookup is most likely + going to fail too */ + ctx->userdb_lookup_failed = TRUE; + } + return ret < 0 ? -1 : 0; } if (mail_user_set_plugin_getenv(ctx->mail_user->set, "expire") == NULL) @@ -263,6 +269,8 @@ static void expire_run(struct master_service *service, bool testrun) } T_END; if (ret < 0) { + if (ctx.userdb_lookup_failed) + break; /* failed to update */ } else if (next_expire == 0) { /* no more messages or mailbox deleted */ diff --git a/src/util/script.c b/src/util/script.c index 38912fb1d7..4169ce83a6 100644 --- a/src/util/script.c +++ b/src/util/script.c @@ -93,7 +93,7 @@ static void client_connected(const struct master_service_connection *conn) t_strdup_printf("script(%s): ", input.username)); service_ctx = mail_storage_service_init(master_service, NULL, flags); - if (mail_storage_service_lookup(service_ctx, &input, &user, &error) < 0) + if (mail_storage_service_lookup(service_ctx, &input, &user, &error) <= 0) i_fatal("%s", error); mail_storage_service_restrict_setenv(service_ctx, user);