From: Timo Sirainen Date: Tue, 28 Sep 2010 18:07:33 +0000 (+0100) Subject: lda: If doveconf fails, make it exit with EX_TEMPFAIL. X-Git-Tag: 2.0.5~34 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=50349cd047ca9e7c100cbeb70acfe26672649959;p=thirdparty%2Fdovecot%2Fcore.git lda: If doveconf fails, make it exit with EX_TEMPFAIL. --- diff --git a/src/config/doveconf.c b/src/config/doveconf.c index 5ece82fac5..b8f2b9f18d 100644 --- a/src/config/doveconf.c +++ b/src/config/doveconf.c @@ -18,7 +18,9 @@ #include "dovecot-version.h" #include +#include #include +#include struct prefix_stack { unsigned int prefix_idx; @@ -545,6 +547,13 @@ static void check_wrong_config(const char *config_path) } } +static void failure_exit_callback(int *status) +{ + /* don't use EX_CONFIG, because it often causes MTAs to bounce + the mails back. */ + *status = EX_TEMPFAIL; +} + int main(int argc, char *argv[]) { enum config_dump_scope scope = CONFIG_DUMP_SCOPE_ALL; @@ -556,6 +565,11 @@ int main(int argc, char *argv[]) int c, ret, ret2; bool config_path_specified, expand_vars = FALSE, hide_key = FALSE; + if (getenv("USE_SYSEXITS") != NULL) { + /* we're coming from (e.g.) LDA */ + i_set_failure_exit_callback(failure_exit_callback); + } + memset(&filter, 0, sizeof(filter)); master_service = master_service_init("config", MASTER_SERVICE_FLAG_STANDALONE, diff --git a/src/lda/main.c b/src/lda/main.c index 82f4e19725..e0fb8c5cec 100644 --- a/src/lda/main.c +++ b/src/lda/main.c @@ -342,7 +342,8 @@ int main(int argc, char *argv[]) service_input.service = "lda"; service_input.username = user; - service_flags |= MAIL_STORAGE_SERVICE_FLAG_DISALLOW_ROOT; + service_flags |= MAIL_STORAGE_SERVICE_FLAG_DISALLOW_ROOT | + MAIL_STORAGE_SERVICE_FLAG_USE_SYSEXITS; storage_service = mail_storage_service_init(master_service, set_roots, service_flags); ret = mail_storage_service_lookup_next(storage_service, &service_input, diff --git a/src/lib-master/master-service-settings.c b/src/lib-master/master-service-settings.c index 08ab1aa269..4b6856c794 100644 --- a/src/lib-master/master-service-settings.c +++ b/src/lib-master/master-service-settings.c @@ -7,6 +7,7 @@ #include "write-full.h" #include "str.h" #include "eacces-error.h" +#include "env-util.h" #include "execv-const.h" #include "settings-parser.h" #include "master-service-private.h" @@ -92,6 +93,8 @@ master_service_exec_config(struct master_service *service, if (!service->keep_environment) master_service_env_clean(input->preserve_home); + if (input->use_sysexits) + env_put("USE_SYSEXITS=1"); /* @UNSAFE */ conf_argv = t_new(const char *, 8 + (service->argc + 1) + 1); diff --git a/src/lib-master/master-service-settings.h b/src/lib-master/master-service-settings.h index 44a2cbb70d..2960af0ae8 100644 --- a/src/lib-master/master-service-settings.h +++ b/src/lib-master/master-service-settings.h @@ -22,6 +22,7 @@ struct master_service_settings_input { const char *config_path; bool preserve_home; bool never_exec; + bool use_sysexits; const char *module; const char *service; diff --git a/src/lib-storage/mail-storage-service.c b/src/lib-storage/mail-storage-service.c index bfa784d75e..9e5a1757ec 100644 --- a/src/lib-storage/mail-storage-service.c +++ b/src/lib-storage/mail-storage-service.c @@ -635,6 +635,8 @@ int mail_storage_service_read_settings(struct mail_storage_service_ctx *ctx, use $HOME */ set_input.preserve_home = (ctx->flags & MAIL_STORAGE_SERVICE_FLAG_USERDB_LOOKUP) == 0; + set_input.use_sysexits = + (ctx->flags & MAIL_STORAGE_SERVICE_FLAG_USE_SYSEXITS) != 0; if (input != NULL) { set_input.module = input->module; diff --git a/src/lib-storage/mail-storage-service.h b/src/lib-storage/mail-storage-service.h index 632efd993e..bd877c0fbc 100644 --- a/src/lib-storage/mail-storage-service.h +++ b/src/lib-storage/mail-storage-service.h @@ -29,7 +29,9 @@ enum mail_storage_service_flags { /* Don't load plugins in _service_lookup() */ MAIL_STORAGE_SERVICE_FLAG_NO_PLUGINS = 0x100, /* Don't close auth connections because of idling. */ - MAIL_STORAGE_SERVICE_FLAG_NO_IDLE_TIMEOUT = 0x200 + MAIL_STORAGE_SERVICE_FLAG_NO_IDLE_TIMEOUT = 0x200, + /* When executing doveconf, tell it to use sysexits codes */ + MAIL_STORAGE_SERVICE_FLAG_USE_SYSEXITS = 0x400 }; struct mail_storage_service_input {