input.remote_ip = conn->remote_ip;
if (master_service_settings_read(master_service, &input,
- &output, &error) < 0) {
+ &output, &error) < 0 ||
+ master_service_settings_get(conn->event,
+ &doveadm_setting_parser_info, 0,
+ &conn->set, &error) < 0) {
e_error(conn->event, "%s", error);
return -1;
}
- conn->set = master_service_settings_get_root_set_dup(master_service,
- &doveadm_setting_parser_info, conn->pool);
return 0;
}
if (doveadm_verbose_proctitle)
process_title_set("[idling]");
+ master_service_settings_free(conn->set);
event_unref(&conn->event);
pool_unref(&conn->pool);
}
{
struct doveadm_cmd_context *cctx = mctx->cctx;
bool tcp_server = cctx->conn_type == DOVEADM_CONNECTION_TYPE_TCP;
- const char *value_str;
+ const char *socket_path, *value_str;
mctx->service_flags |= MAIL_STORAGE_SERVICE_FLAG_USERDB_LOOKUP;
*wildcard_user_r = NULL;
i_fatal("One of -u, -F, or -A must be provided");
}
- if (doveadm_cmd_param_str(cctx, "socket-path",
- &doveadm_settings->doveadm_socket_path) &&
- doveadm_settings->doveadm_worker_count == 0)
- doveadm_settings->doveadm_worker_count = 1;
+ if (doveadm_cmd_param_str(cctx, "socket-path", &socket_path)) {
+ struct doveadm_settings *set =
+ p_memdup(doveadm_settings->pool, doveadm_settings,
+ sizeof(*doveadm_settings));
+ set->doveadm_socket_path = p_strdup(set->pool, socket_path);
+ if (set->doveadm_worker_count == 0)
+ set->doveadm_worker_count = 1;
+ doveadm_settings = mctx->set = set;
+ }
if (doveadm_cmd_param_istream(cctx, "file", &mctx->cmd_input))
i_stream_ref(mctx->cmd_input);
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);
.defaults = &doveadm_default_settings,
.struct_size = sizeof(struct doveadm_settings),
+ .pool_offset1 = 1 + offsetof(struct doveadm_settings, pool),
.check_func = doveadm_settings_check,
.dependencies = doveadm_setting_dependencies
};
-struct doveadm_settings *doveadm_settings;
+const struct doveadm_settings *doveadm_settings;
static void
fix_base_path(struct doveadm_settings *set, pool_t pool, const char **str)
pool, set_r);
}
-void doveadm_settings_expand(struct doveadm_settings *set, pool_t pool)
-{
- struct var_expand_table tab[] = { { '\0', NULL, NULL } };
- const char *error;
-
- if (settings_var_expand(&doveadm_setting_parser_info, set,
- pool, tab, &error) <= 0)
- i_fatal("Failed to expand settings: %s", error);
-}
-
void doveadm_read_settings(void)
{
static const struct setting_parser_info *set_roots[] = {
};
struct master_service_settings_input input;
struct master_service_settings_output output;
- const struct doveadm_settings *set;
const char *error;
i_zero(&input);
global_config_fd = output.config_fd;
fd_close_on_exec(output.config_fd, TRUE);
- doveadm_settings_pool = pool_alloconly_create("doveadm settings", 1024);
doveadm_verbose_proctitle = master_service_get_service_settings(master_service)->verbose_proctitle;
- set = master_service_settings_get_root_set(
- master_service, &doveadm_setting_parser_info);
- doveadm_settings = settings_dup(&doveadm_setting_parser_info, set,
- doveadm_settings_pool);
- doveadm_ssl_set = master_service_settings_get_root_set_dup(
- master_service, &master_service_ssl_setting_parser_info,
- doveadm_settings_pool);
- doveadm_settings_expand(doveadm_settings, doveadm_settings_pool);
- doveadm_settings->parsed_features = set->parsed_features; /* copy this value by hand */
+ doveadm_settings = master_service_settings_get_or_fatal(
+ NULL, &doveadm_setting_parser_info);
+ doveadm_ssl_set = master_service_settings_get_or_fatal(
+ NULL, &master_service_ssl_setting_parser_info);
}
int doveadm_settings_get_config_fd(void)
return global_config_fd;
}
-void doveadm_settings_init(void)
-{
-}
-
void doveadm_settings_deinit(void)
{
- pool_unref(&doveadm_settings_pool);
+ master_service_settings_free(doveadm_settings);
+ master_service_settings_free(doveadm_ssl_set);
}
/* </settings checks> */
struct doveadm_settings {
+ pool_t pool;
const char *base_dir;
const char *libexec_dir;
const char *mail_plugins;
ARRAY(const char *) plugin_envs;
};
+
extern const struct setting_parser_info doveadm_setting_parser_info;
-extern struct doveadm_settings *doveadm_settings;
+extern const struct doveadm_settings *doveadm_settings;
extern const struct master_service_ssl_settings *doveadm_ssl_set;
extern bool doveadm_verbose_proctitle;
void doveadm_get_ssl_settings(struct ssl_iostream_settings *set_r, pool_t pool);
-void doveadm_settings_expand(struct doveadm_settings *set, pool_t pool);
void doveadm_read_settings(void);
int doveadm_settings_get_config_fd(void);
-void doveadm_settings_init(void);
void doveadm_settings_deinit(void);
#endif
}
master_service_init_log(master_service);
- doveadm_settings_init();
doveadm_cmds_init();
for (i = 0; i < N_ELEMENTS(doveadm_cmdline_commands_ver2); i++)
doveadm_cmd_register_ver2(doveadm_cmdline_commands_ver2[i]);
{
doveadm_server = TRUE;
- doveadm_settings_init();
doveadm_cmds_init();
doveadm_register_auth_server_commands();
doveadm_dump_init();
#include "doveadm-settings.h"
#include "doveadm-util.h"
-struct doveadm_settings *doveadm_settings; /* just to avoid linker error */
+const struct doveadm_settings *doveadm_settings; /* just to avoid linker error */
bool version_string_verify(const char *line ATTR_UNUSED,
const char *service_name ATTR_UNUSED,