dovecot-2.1: lib-master: Added -i parameter to read config by in...

dovecot at dovecot.org dovecot at dovecot.org
Mon Feb 6 21:39:22 EET 2012


details:   http://hg.dovecot.org/dovecot-2.1/rev/3fa544e4f26b
changeset: 14069:3fa544e4f26b
user:      Timo Sirainen <tss at iki.fi>
date:      Mon Feb 06 21:39:11 2012 +0200
description:
lib-master: Added -i parameter to read config by instance name rather than path.

diffstat:

 src/lib-master/Makefile.am              |   1 +
 src/lib-master/master-service-private.h |   2 +-
 src/lib-master/master-service.c         |  36 +++++++++++++++++++++++++++++---
 3 files changed, 34 insertions(+), 5 deletions(-)

diffs (112 lines):

diff -r 5f60958926e1 -r 3fa544e4f26b src/lib-master/Makefile.am
--- a/src/lib-master/Makefile.am	Mon Feb 06 21:26:55 2012 +0200
+++ b/src/lib-master/Makefile.am	Mon Feb 06 21:39:11 2012 +0200
@@ -6,6 +6,7 @@
 	-I$(top_srcdir)/src/lib \
 	-I$(top_srcdir)/src/lib-settings \
 	-DPKG_RUNDIR=\""$(rundir)"\" \
+	-DPKG_STATEDIR=\""$(statedir)"\" \
 	-DSYSCONFDIR=\""$(pkgsysconfdir)"\" \
 	-DBINDIR=\""$(bindir)"\"
 
diff -r 5f60958926e1 -r 3fa544e4f26b src/lib-master/master-service-private.h
--- a/src/lib-master/master-service-private.h	Mon Feb 06 21:26:55 2012 +0200
+++ b/src/lib-master/master-service-private.h	Mon Feb 06 21:39:11 2012 +0200
@@ -23,7 +23,7 @@
 	char **argv;
 
 	const char *version_string;
-	const char *config_path;
+	char *config_path;
 	ARRAY_TYPE(const_string) config_overrides;
 	int config_fd;
 	int syslog_facility;
diff -r 5f60958926e1 -r 3fa544e4f26b src/lib-master/master-service.c
--- a/src/lib-master/master-service.c	Mon Feb 06 21:26:55 2012 +0200
+++ b/src/lib-master/master-service.c	Mon Feb 06 21:39:11 2012 +0200
@@ -3,6 +3,7 @@
 #include "lib.h"
 #include "lib-signals.h"
 #include "ioloop.h"
+#include "abspath.h"
 #include "array.h"
 #include "strescape.h"
 #include "env-util.h"
@@ -12,6 +13,7 @@
 #include "fd-close-on-exec.h"
 #include "settings-parser.h"
 #include "syslog-util.h"
+#include "master-instance.h"
 #include "master-login.h"
 #include "master-service-private.h"
 #include "master-service-settings.h"
@@ -45,7 +47,7 @@
 
 const char *master_service_getopt_string(void)
 {
-	return "c:ko:Os:L";
+	return "c:i:ko:Os:L";
 }
 
 static void sig_die(const siginfo_t *si, void *context)
@@ -155,9 +157,9 @@
 	service->service_count_left = (unsigned int)-1;
 	service->config_fd = -1;
 
-	service->config_path = getenv(MASTER_CONFIG_FILE_ENV);
+	service->config_path = i_strdup(getenv(MASTER_CONFIG_FILE_ENV));
 	if (service->config_path == NULL) {
-		service->config_path = DEFAULT_CONFIG_FILE_PATH;
+		service->config_path = i_strdup(DEFAULT_CONFIG_FILE_PATH);
 		service->config_path_is_default = TRUE;
 	}
 
@@ -326,14 +328,39 @@
 	service->idle_die_callback = callback;
 }
 
+static bool get_instance_config(const char *name, const char **config_path_r)
+{
+	struct master_instance_list *list;
+	const struct master_instance *inst;
+	const char *path;
+
+	list = master_instance_list_init(MASTER_INSTANCE_PATH);
+	inst = master_instance_list_find_by_name(list, name);
+	if (inst != NULL) {
+		path = t_strdup_printf("%s/dovecot.conf", inst->base_dir);
+		if (t_readlink(path, config_path_r) < 0)
+			i_fatal("readlink(%s) failed: %m", path);
+	}
+	master_instance_list_deinit(&list);
+	return inst != NULL;
+}
+
 bool master_service_parse_option(struct master_service *service,
 				 int opt, const char *arg)
 {
+	const char *path;
+
 	switch (opt) {
 	case 'c':
-		service->config_path = arg;
+		service->config_path = i_strdup(arg);
 		service->config_path_is_default = FALSE;
 		break;
+	case 'i':
+		if (!get_instance_config(arg, &path))
+			i_fatal("Unknown instance name: %s", arg);
+		service->config_path = i_strdup(path);
+		service->keep_environment = TRUE;
+		break;
 	case 'k':
 		service->keep_environment = TRUE;
 		break;
@@ -710,6 +737,7 @@
 	i_free(service->listeners);
 	i_free(service->getopt_str);
 	i_free(service->name);
+	i_free(service->config_path);
 	i_free(service);
 
 	lib_deinit();


More information about the dovecot-cvs mailing list