bool doveadm_verbose_proctitle;
static pool_t doveadm_settings_pool = NULL;
+static int global_config_fd = -1;
static bool doveadm_settings_check(void *_set, pool_t pool, const char **error_r);
input.service = "doveadm";
input.preserve_user = TRUE;
input.preserve_home = TRUE;
+ input.return_config_fd = TRUE; /* for doveadm exec */
if (master_service_settings_read(master_service, &input,
&output, &error) < 0)
i_fatal("Error reading configuration: %s", error);
+ i_assert(global_config_fd == -1);
+ global_config_fd = output.config_fd;
+ fd_close_on_exec(output.config_fd, TRUE);
doveadm_settings_pool = pool_alloconly_create("doveadm settings", 1024);
service_set = master_service_settings_get_root_set_dup(master_service,
}
}
+int doveadm_settings_get_config_fd(void)
+{
+ i_assert(global_config_fd != -1);
+ return global_config_fd;
+}
+
void doveadm_setting_roots_add(const struct setting_parser_info *info)
{
struct doveadm_setting_root *root;
void *doveadm_setting_roots_get_settings(const struct setting_parser_info *info);
void doveadm_read_settings(void);
+int doveadm_settings_get_config_fd(void);
void doveadm_settings_init(void);
void doveadm_settings_deinit(void);
if (!doveadm_cmd_param_array(cctx, "args", &args))
args = NULL;
+ /* Avoid re-executing doveconf after the binary is executed */
+ int config_fd = doveadm_settings_get_config_fd();
+ fd_close_on_exec(config_fd, FALSE);
+ env_put(DOVECOT_CONFIG_FD_ENV, dec2str(config_fd));
+
path = t_strdup_printf("%s/%s", doveadm_settings->libexec_dir, binary);
unsigned int len = str_array_length(args);