]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lda: If doveconf fails, make it exit with EX_TEMPFAIL.
authorTimo Sirainen <tss@iki.fi>
Tue, 28 Sep 2010 18:07:33 +0000 (19:07 +0100)
committerTimo Sirainen <tss@iki.fi>
Tue, 28 Sep 2010 18:07:33 +0000 (19:07 +0100)
src/config/doveconf.c
src/lda/main.c
src/lib-master/master-service-settings.c
src/lib-master/master-service-settings.h
src/lib-storage/mail-storage-service.c
src/lib-storage/mail-storage-service.h

index 5ece82fac5dd2594ef5e1a67df373a6593d361a7..b8f2b9f18ddd70ae6cff17dbc3a38c2f274c5608 100644 (file)
@@ -18,7 +18,9 @@
 #include "dovecot-version.h"
 
 #include <stdio.h>
+#include <stdlib.h>
 #include <unistd.h>
+#include <sysexits.h>
 
 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,
index 82f4e197258b59689e95cf1a2303c12cede04426..e0fb8c5cec36cfeedcfee76d5b9eed715e700a24 100644 (file)
@@ -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,
index 08ab1aa2695760c76d7f8f43ab8cd20a1e7aa06c..4b6856c794065ab5a30203171b1280c594326edb 100644 (file)
@@ -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);
index 44a2cbb70d35ed96a141e1e165d69d75b3cf3cf5..2960af0ae8bc715d43735ab9ca99098405789a04 100644 (file)
@@ -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;
index bfa784d75e8bd35f02a13f7bd7863a34b5cd8887..9e5a1757ecb39c90eac06a58fa28bc8ac9febc89 100644 (file)
@@ -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;
index 632efd993ea88410c053f4022bf9790b974f4d2a..bd877c0fbcb964f028bf1d95736a2bd48eff6975 100644 (file)
@@ -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 {