#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"
} 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);
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");