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