changeset 22490:48772f0423cd

lib-master, config: Move the responsibility of cleaning environment to doveconf
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Thu, 08 Jun 2017 00:40:12 +0300
parents bca86353ccd5
children 5854337cc4ad
files src/config/doveconf.c src/lib-master/master-service-settings.c
diffstat 2 files changed, 20 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/config/doveconf.c	Thu Jun 08 00:35:08 2017 +0300
+++ b/src/config/doveconf.c	Thu Jun 08 00:40:12 2017 +0300
@@ -12,6 +12,7 @@
 #include "str.h"
 #include "strescape.h"
 #include "settings-parser.h"
+#include "master-interface.h"
 #include "master-service.h"
 #include "all-settings.h"
 #include "sysinfo-get.h"
@@ -865,11 +866,21 @@
 	} else {
 		struct config_export_context *ctx;
 
-		env_put("DOVECONF_ENV=1");
 		ctx = config_export_init(wanted_modules, CONFIG_DUMP_SCOPE_SET,
 					 CONFIG_DUMP_FLAG_CHECK_SETTINGS,
 					 config_request_putenv, NULL);
 		config_export_by_filter(ctx, &filter);
+
+		if (getenv(DOVECOT_PRESERVE_ENVS_ENV) != NULL) {
+			/* Standalone binary is getting its configuration via
+			   doveconf. Clean the environment before calling it.
+			   Do this only if the environment exists, because
+			   lib-master doesn't set it if it doesn't want the
+			   environment to be cleaned (e.g. -k parameter). */
+			master_service_env_clean();
+		}
+
+		env_put("DOVECONF_ENV=1");
 		if (config_export_finish(&ctx) < 0)
 			i_fatal("Invalid configuration");
 		execvp(exec_args[0], exec_args);
--- a/src/lib-master/master-service-settings.c	Thu Jun 08 00:35:08 2017 +0300
+++ b/src/lib-master/master-service-settings.c	Thu Jun 08 00:40:12 2017 +0300
@@ -134,7 +134,14 @@
 			master_service_import_environment("USER");
 		if ((service->flags & MASTER_SERVICE_FLAG_STANDALONE) != 0)
 			master_service_import_environment("LOG_STDERR_TIMESTAMP");
-		master_service_env_clean();
+
+		/* doveconf empties the environment before exec()ing us back
+		   if DOVECOT_PRESERVE_ENVS is set, so make sure it is. */
+		if (getenv(DOVECOT_PRESERVE_ENVS_ENV) == NULL)
+			env_put(DOVECOT_PRESERVE_ENVS_ENV"=");
+	} else {
+		/* make sure doveconf doesn't remove any environment */
+		env_remove(DOVECOT_PRESERVE_ENVS_ENV);
 	}
 	if (input->use_sysexits)
 		env_put("USE_SYSEXITS=1");