[Dovecot] [PATCH] Replace hard-coded PKG_STATEDIR with state_dir setting

Chris Webb chris at arachsys.com
Mon Aug 13 19:12:51 EEST 2012


Sharing an installed copy of dovecot between several users each running
a daemon within their own account (or using the same binaries for a
system daemon and a user daemon) is difficult because the compile-time
directory PKG_STATEDIR (typically /var/lib/dovecot) is hard-coded as the
location of things like the ssl-parameters.dat file and the replicator
database.

Replace all these uses of PKG_STATEDIR with a state_dir setting which
defaults to PKG_STATEDIR but can be overridden in dovecot.conf, in the
same way base_dir can be used to override PKG_RUNDIR.

Signed-off-by: <chris at arachsys.com>
---
 src/config/Makefile.am                           |   1 -
 src/doveadm/doveadm-instance.c                   |  10 ++++------
 src/doveadm/doveadm-mount.c                      |   3 +--
 src/doveadm/doveadm-settings.c                   |   2 --
 src/doveadm/doveadm-settings.h                   |   1 -
 src/lib-master/master-instance.h                 |   2 ++
 src/lib-master/master-service-settings.c         |   2 --
 src/lib-master/master-service-settings.h         |   1 -
 src/lib-master/master-service.c                  |   6 ++----
 src/login-common/ssl-proxy-openssl.c             |   3 ++-
 src/master/main.c                                |  11 ++++-------
 src/master/master-settings.c                     |   6 ++----
 src/master/master-settings.h                     |   1 -
 src/replication/replicator/replicator-settings.c |   2 --
 src/replication/replicator/replicator-settings.h |   1 -
 src/replication/replicator/replicator.c          |  16 +++++-----------
 src/ssl-params/main.c                            |   5 ++---
 src/ssl-params/ssl-params-settings.c             |   2 --
 src/ssl-params/ssl-params-settings.h             |   1 -
 19 files changed, 24 insertions(+), 52 deletions(-)

diff --git a/src/config/Makefile.am b/src/config/Makefile.am
--- a/src/config/Makefile.am
+++ b/src/config/Makefile.am
@@ -9,6 +9,7 @@
 	-I$(top_srcdir)/src/lib-settings \
 	-I$(top_srcdir)/src/lib-master \
 	-DPKG_RUNDIR=\""$(rundir)"\" \
+	-DPKG_STATEDIR=\""$(statedir)"\" \
 	-DPKG_LIBEXECDIR=\""$(pkglibexecdir)"\" \
 	-DEXAMPLE_CONFIG_DIR=\""$(exampledir)"\" \
 	-DMODULEDIR=\""$(moduledir)"\" \
diff --git a/src/doveadm/doveadm-instance.c b/src/doveadm/doveadm-instance.c
--- a/src/doveadm/doveadm-instance.c
+++ b/src/doveadm/doveadm-instance.c
@@ -48,7 +48,7 @@
 	struct master_instance_list *list;
 	struct master_instance_list_iter *iter;
 	const struct master_instance *inst;
-	const char *pidfile_path;
+	const char *instance_path, *pidfile_path;
 	bool show_config = FALSE;
 	int c;
 
@@ -71,7 +71,8 @@
 		doveadm_print_header_simple("running");
 	}
 
-	list = master_instance_list_init(MASTER_INSTANCE_PATH);
+	instance_path = t_strconcat(doveadm_settings->state_dir, "/instances", NULL);
+	list = master_instance_list_init(instance_path);
 	iter = master_instance_list_iterate_init(list);
 	while ((inst = master_instance_iterate_list_next(iter)) != NULL) {
 		if (argv[0] != NULL && strcmp(argv[0], inst->name) != 0)
@@ -99,13 +100,14 @@
 {
 	struct master_instance_list *list;
 	const struct master_instance *inst;
-	const char *base_dir;
+	const char *base_dir, *instance_path;
 	int ret;
 
 	if (argc != 2)
 		instance_cmd_help(cmd_instance_remove);
 
-	list = master_instance_list_init(MASTER_INSTANCE_PATH);
+	instance_path = t_strconcat(doveadm_settings->state_dir, "/instances", NULL);
+	list = master_instance_list_init(instance_path);
 	inst = master_instance_list_find_by_name(list, argv[1]);
 	base_dir = inst != NULL ? inst->base_dir : argv[1];
 	if ((ret = master_instance_list_remove(list, base_dir)) < 0) {
diff --git a/src/doveadm/doveadm-mount.c b/src/doveadm/doveadm-mount.c
--- a/src/doveadm/doveadm-mount.c
+++ b/src/doveadm/doveadm-mount.c
@@ -13,7 +13,8 @@
 {
 	const char *perm_path, *state_path;
 
-	perm_path = t_strconcat(PKG_STATEDIR"/"MOUNTPOINT_LIST_FNAME, NULL);
+	perm_path = t_strconcat(doveadm_settings->state_dir,
+				 "/"MOUNTPOINT_LIST_FNAME, NULL);
 	state_path = t_strconcat(doveadm_settings->base_dir,
 				 "/"MOUNTPOINT_LIST_FNAME, NULL);
 	return mountpoint_list_init(perm_path, state_path);
diff --git a/src/doveadm/doveadm-settings.c b/src/doveadm/doveadm-settings.c
--- a/src/doveadm/doveadm-settings.c
+++ b/src/doveadm/doveadm-settings.c
@@ -53,6 +53,7 @@
 
 static const struct setting_define doveadm_setting_defines[] = {
 	DEF(SET_STR, base_dir),
+	DEF(SET_STR, state_dir),
 	DEF(SET_STR, mail_plugins),
 	DEF(SET_STR, mail_plugin_dir),
 	DEF(SET_STR, doveadm_socket_path),
@@ -70,6 +71,7 @@
 
 const struct doveadm_settings doveadm_default_settings = {
 	.base_dir = PKG_RUNDIR,
+	.state_dir = PKG_STATEDIR,
 	.mail_plugins = "",
 	.mail_plugin_dir = MODULEDIR,
 	.doveadm_socket_path = "doveadm-server",
diff --git a/src/doveadm/doveadm-settings.h b/src/doveadm/doveadm-settings.h
--- a/src/doveadm/doveadm-settings.h
+++ b/src/doveadm/doveadm-settings.h
@@ -3,6 +3,7 @@
 
 struct doveadm_settings {
 	const char *base_dir;
+	const char *state_dir;
 	const char *mail_plugins;
 	const char *mail_plugin_dir;
 	const char *doveadm_socket_path;
diff --git a/src/lib-master/master-instance.h b/src/lib-master/master-instance.h
--- a/src/lib-master/master-instance.h
+++ b/src/lib-master/master-instance.h
@@ -1,8 +1,6 @@
 #ifndef MASTER_INSTANCE_H
 #define MASTER_INSTANCE_H
 
-#define MASTER_INSTANCE_PATH PKG_STATEDIR"/instances"
-
 struct master_instance_list;
 
 struct master_instance {
diff --git a/src/lib-master/master-service-settings.c b/src/lib-master/master-service-settings.c
--- a/src/lib-master/master-service-settings.c
+++ b/src/lib-master/master-service-settings.c
@@ -33,6 +33,7 @@
 master_service_settings_check(void *_set, pool_t pool, const char **error_r);
 
 static const struct setting_define master_service_setting_defines[] = {
+	DEF(SET_STR, state_dir),
 	DEF(SET_STR, log_path),
 	DEF(SET_STR, info_log_path),
 	DEF(SET_STR, debug_log_path),
@@ -47,6 +48,7 @@
 };
 
 static const struct master_service_settings master_service_default_settings = {
+	.state_dir = PKG_STATEDIR,
 	.log_path = "syslog",
 	.info_log_path = "",
 	.debug_log_path = "",
diff --git a/src/lib-master/master-service-settings.h b/src/lib-master/master-service-settings.h
--- a/src/lib-master/master-service-settings.h
+++ b/src/lib-master/master-service-settings.h
@@ -7,6 +7,7 @@
 struct master_service;
 
 struct master_service_settings {
+	const char *state_dir;
 	const char *log_path;
 	const char *info_log_path;
 	const char *debug_log_path;
diff --git a/src/lib-master/master-service.c b/src/lib-master/master-service.c
--- a/src/lib-master/master-service.c
+++ b/src/lib-master/master-service.c
@@ -332,9 +332,11 @@
 {
 	struct master_instance_list *list;
 	const struct master_instance *inst;
-	const char *path;
+	const char *instance_path, *path;
 
-	list = master_instance_list_init(MASTER_INSTANCE_PATH);
+	instance_path = t_strconcat(master_service->set->state_dir,
+				    "/instances", NULL);
+	list = master_instance_list_init(instance_path);
 	inst = master_instance_list_find_by_name(list, name);
 	if (inst != NULL) {
 		path = t_strdup_printf("%s/dovecot.conf", inst->base_dir);
diff --git a/src/login-common/ssl-proxy-openssl.c b/src/login-common/ssl-proxy-openssl.c
--- a/src/login-common/ssl-proxy-openssl.c
+++ b/src/login-common/ssl-proxy-openssl.c
@@ -152,8 +152,7 @@
 
 static void ssl_params_corrupted(void)
 {
-	i_fatal("Corrupted SSL parameters file: "
-		PKG_STATEDIR"/ssl-parameters.dat");
+	i_fatal("Corrupted SSL parameters file: ssl-parameters.dat");
 }
 
 static void read_next(struct ssl_parameters *params, void *data, size_t size)
diff --git a/src/master/main.c b/src/master/main.c
--- a/src/master/main.c
+++ b/src/master/main.c
@@ -311,7 +311,7 @@
 	struct mountpoint_list *mountpoints;
 	const char *perm_path, *state_path;
 
-	perm_path = t_strconcat(PKG_STATEDIR"/"MOUNTPOINT_LIST_FNAME, NULL);
+	perm_path = t_strconcat(set->state_dir, "/"MOUNTPOINT_LIST_FNAME, NULL);
 	state_path = t_strconcat(set->base_dir, "/"MOUNTPOINT_LIST_FNAME, NULL);
 	mountpoints = mountpoint_list_init(perm_path, state_path);
 
@@ -340,9 +340,12 @@
 				  instance_update_now, list);
 }
 
-static void instance_update(void)
+static void instance_update(const struct master_settings *set)
 {
-	instances = master_instance_list_init(MASTER_INSTANCE_PATH);
+	const char *path;
+
+	path = t_strconcat(set->state_dir, "/instances", NULL);
+	instances = master_instance_list_init(path);
 	instance_update_now(instances);
 }
 
@@ -538,7 +541,7 @@
 	create_pid_file(pidfile_path);
 	create_config_symlink(set);
 	mountpoints_update(set);
-	instance_update();
+	instance_update(set);
 
 	services_monitor_start(services);
 }
diff --git a/src/master/master-settings.c b/src/master/master-settings.c
--- a/src/master/master-settings.c
+++ b/src/master/master-settings.c
@@ -171,6 +171,7 @@
 
 static const struct setting_define master_setting_defines[] = {
 	DEF(SET_STR, base_dir),
+	DEF(SET_STR, state_dir),
 	DEF(SET_STR, libexec_dir),
 	DEF(SET_STR, instance_name),
 	DEF(SET_STR, import_environment),
@@ -211,6 +212,7 @@
 
 static const struct master_settings master_default_settings = {
 	.base_dir = PKG_RUNDIR,
+	.state_dir = PKG_STATEDIR,
 	.libexec_dir = PKG_LIBEXECDIR,
 	.instance_name = PACKAGE,
 	.import_environment = "TZ" ENV_SYSTEMD ENV_GDB,
@@ -737,8 +739,8 @@
 	}
 
 	/* Make sure our permanent state directory exists */
-	if (mkdir_parents(PKG_STATEDIR, 0750) < 0 && errno != EEXIST) {
-		i_error("mkdir(%s) failed: %m", PKG_STATEDIR);
+	if (mkdir_parents(set->state_dir, 0750) < 0 && errno != EEXIST) {
+		i_error("mkdir(%s) failed: %m", set->state_dir);
 		return FALSE;
 	}
 
diff --git a/src/master/master-settings.h b/src/master/master-settings.h
--- a/src/master/master-settings.h
+++ b/src/master/master-settings.h
@@ -5,6 +5,7 @@
 
 struct master_settings {
 	const char *base_dir;
+	const char *state_dir;
 	const char *libexec_dir;
 	const char *instance_name;
 	const char *import_environment;
diff --git a/src/replication/replicator/replicator-settings.c b/src/replication/replicator/replicator-settings.c
--- a/src/replication/replicator/replicator-settings.c
+++ b/src/replication/replicator/replicator-settings.c
@@ -49,6 +49,7 @@
 	{ type, #name, offsetof(struct replicator_settings, name), NULL }
 
 static const struct setting_define replicator_setting_defines[] = {
+	DEF(SET_STR, state_dir),
 	DEF(SET_STR, auth_socket_path),
 	DEF(SET_STR, doveadm_socket_path),
 
@@ -59,6 +60,7 @@
 };
 
 const struct replicator_settings replicator_default_settings = {
+	.state_dir = PKG_STATEDIR,
 	.auth_socket_path = "auth-userdb",
 	.doveadm_socket_path = "doveadm-server",
 
diff --git a/src/replication/replicator/replicator-settings.h b/src/replication/replicator/replicator-settings.h
--- a/src/replication/replicator/replicator-settings.h
+++ b/src/replication/replicator/replicator-settings.h
@@ -2,6 +2,7 @@
 #define REPLICATOR_SETTINGS_H
 
 struct replicator_settings {
+	const char *state_dir;
 	const char *auth_socket_path;
 	const char *doveadm_socket_path;
 
diff --git a/src/replication/replicator/replicator.c b/src/replication/replicator/replicator.c
--- a/src/replication/replicator/replicator.c
+++ b/src/replication/replicator/replicator.c
@@ -13,7 +13,6 @@
 
 #define REPLICATOR_AUTH_SERVICE_NAME "replicator"
 #define REPLICATOR_DB_DUMP_INTERVAL_MSECS (1000*60*15)
-#define REPLICATOR_DB_PATH PKG_STATEDIR"/replicator.db"
 
 static struct replicator_queue *queue;
 static struct replicator_brain *brain;
@@ -32,7 +31,7 @@
 	struct auth_master_user_list_ctx *ctx;
 	struct auth_user_info user_info;
 	struct replicator_user *user;
-	const char *username;
+	const char *db_path, *username;
 
 	auth_conn = auth_master_init(set->auth_socket_path,
 				     AUTH_MASTER_FLAG_NO_IDLE_TIMEOUT);
@@ -53,12 +52,16 @@
 	auth_master_deinit(&auth_conn);
 
 	/* add updates from replicator db, if it exists */
-	(void)replicator_queue_import(queue, REPLICATOR_DB_PATH);
+	db_path = t_strconcat(set->state_dir, "replicator.db", NULL);
+	(void)replicator_queue_import(queue, db_path);
 }
 
 static void replicator_dump_timeout(void *context ATTR_UNUSED)
 {
-	(void)replicator_queue_export(queue, REPLICATOR_DB_PATH);
+	const char *db_path;
+
+	db_path = t_strconcat(set->state_dir, "replicator.db", NULL);
+	(void)replicator_queue_export(queue, db_path);
 }
 
 static void main_init(void)
@@ -77,10 +80,13 @@
 
 static void main_deinit(void)
 {
+	const char *db_path;
+
 	notify_connections_destroy_all();
 	replicator_brain_deinit(&brain);
 	timeout_remove(&to_dump);
-	(void)replicator_queue_export(queue, REPLICATOR_DB_PATH);
+	db_path = t_strconcat(set->state_dir, "replicator.db", NULL);
+	(void)replicator_queue_export(queue, db_path);
 	replicator_queue_deinit(&queue);
 }
 
diff --git a/src/ssl-params/main.c b/src/ssl-params/main.c
--- a/src/ssl-params/main.c
+++ b/src/ssl-params/main.c
@@ -112,11 +112,12 @@
 
 static void main_init(const struct ssl_params_settings *set)
 {
+	const char *filename;
 	lib_signals_set_handler(SIGCHLD, LIBSIG_FLAGS_SAFE, sig_chld, NULL);
 
 	ssl_params = buffer_create_dynamic(default_pool, 1024);
-	param = ssl_params_init(PKG_STATEDIR"/"SSL_BUILD_PARAM_FNAME,
-				ssl_params_callback, set);
+	filename = t_strconcat(set->state_dir, "/"SSL_BUILD_PARAM_FNAME, NULL);
+	param = ssl_params_init(filename, ssl_params_callback, set);
 }
 
 static void main_deinit(void)
diff --git a/src/ssl-params/ssl-params-settings.c b/src/ssl-params/ssl-params-settings.c
--- a/src/ssl-params/ssl-params-settings.c
+++ b/src/ssl-params/ssl-params-settings.c
@@ -58,12 +58,14 @@
 	{ type, #name, offsetof(struct ssl_params_settings, name), NULL }
 
 static const struct setting_define ssl_params_setting_defines[] = {
+	DEF(SET_STR, state_dir),
 	DEF(SET_TIME, ssl_parameters_regenerate),
 
 	SETTING_DEFINE_LIST_END
 };
 
 static const struct ssl_params_settings ssl_params_default_settings = {
+	.state_dir = PKG_STATEDIR,
 	.ssl_parameters_regenerate = 3600*24*7
 };
 
diff --git a/src/ssl-params/ssl-params-settings.h b/src/ssl-params/ssl-params-settings.h
--- a/src/ssl-params/ssl-params-settings.h
+++ b/src/ssl-params/ssl-params-settings.h
@@ -4,6 +4,7 @@
 struct master_service;
 
 struct ssl_params_settings {
+	const char *state_dir;
 	unsigned int ssl_parameters_regenerate;
 };
 


More information about the dovecot mailing list