dovecot-2.0: lda: If doveconf fails, make it exit with EX_TEMPFAIL.

dovecot at dovecot.org dovecot at dovecot.org
Tue Sep 28 21:07:36 EEST 2010


details:   http://hg.dovecot.org/dovecot-2.0/rev/002a702cf06a
changeset: 12197:002a702cf06a
user:      Timo Sirainen <tss at iki.fi>
date:      Tue Sep 28 19:07:33 2010 +0100
description:
lda: If doveconf fails, make it exit with EX_TEMPFAIL.

diffstat:

 src/config/doveconf.c                    |  14 ++++++++++++++
 src/lda/main.c                           |   3 ++-
 src/lib-master/master-service-settings.c |   3 +++
 src/lib-master/master-service-settings.h |   1 +
 src/lib-storage/mail-storage-service.c   |   2 ++
 src/lib-storage/mail-storage-service.h   |   4 +++-
 6 files changed, 25 insertions(+), 2 deletions(-)

diffs (109 lines):

diff -r 9939f0565916 -r 002a702cf06a src/config/doveconf.c
--- a/src/config/doveconf.c	Tue Sep 28 17:41:43 2010 +0100
+++ b/src/config/doveconf.c	Tue Sep 28 19:07:33 2010 +0100
@@ -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 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 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 -r 9939f0565916 -r 002a702cf06a src/lda/main.c
--- a/src/lda/main.c	Tue Sep 28 17:41:43 2010 +0100
+++ b/src/lda/main.c	Tue Sep 28 19:07:33 2010 +0100
@@ -342,7 +342,8 @@
 	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 -r 9939f0565916 -r 002a702cf06a src/lib-master/master-service-settings.c
--- a/src/lib-master/master-service-settings.c	Tue Sep 28 17:41:43 2010 +0100
+++ b/src/lib-master/master-service-settings.c	Tue Sep 28 19:07:33 2010 +0100
@@ -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 @@
 
 	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 -r 9939f0565916 -r 002a702cf06a src/lib-master/master-service-settings.h
--- a/src/lib-master/master-service-settings.h	Tue Sep 28 17:41:43 2010 +0100
+++ b/src/lib-master/master-service-settings.h	Tue Sep 28 19:07:33 2010 +0100
@@ -22,6 +22,7 @@
 	const char *config_path;
 	bool preserve_home;
 	bool never_exec;
+	bool use_sysexits;
 
 	const char *module;
 	const char *service;
diff -r 9939f0565916 -r 002a702cf06a src/lib-storage/mail-storage-service.c
--- a/src/lib-storage/mail-storage-service.c	Tue Sep 28 17:41:43 2010 +0100
+++ b/src/lib-storage/mail-storage-service.c	Tue Sep 28 19:07:33 2010 +0100
@@ -635,6 +635,8 @@
 	   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 -r 9939f0565916 -r 002a702cf06a src/lib-storage/mail-storage-service.h
--- a/src/lib-storage/mail-storage-service.h	Tue Sep 28 17:41:43 2010 +0100
+++ b/src/lib-storage/mail-storage-service.h	Tue Sep 28 19:07:33 2010 +0100
@@ -29,7 +29,9 @@
 	/* 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 {


More information about the dovecot-cvs mailing list