dovecot-2.2: lib-master: If MASTER_SERVICE_FLAG_KEEP_CONFIG_OPEN...

dovecot at dovecot.org dovecot at dovecot.org
Thu Aug 1 13:43:14 EEST 2013


details:   http://hg.dovecot.org/dovecot-2.2/rev/eb63eca74471
changeset: 16627:eb63eca74471
user:      Timo Sirainen <tss at iki.fi>
date:      Thu Aug 01 13:42:51 2013 +0300
description:
lib-master: If MASTER_SERVICE_FLAG_KEEP_CONFIG_OPEN is set, open the config socket before dropping privileges.

diffstat:

 src/lib-master/master-service-settings.c |  17 +++++++++++++++++
 src/lib-master/master-service-settings.h |   3 +++
 src/lib-master/master-service.c          |   6 ++++++
 src/lib-master/master-service.h          |   3 ++-
 4 files changed, 28 insertions(+), 1 deletions(-)

diffs (69 lines):

diff -r 43488e1044c9 -r eb63eca74471 src/lib-master/master-service-settings.c
--- a/src/lib-master/master-service-settings.c	Thu Aug 01 13:31:25 2013 +0300
+++ b/src/lib-master/master-service-settings.c	Thu Aug 01 13:42:51 2013 +0300
@@ -336,6 +336,23 @@
 	return 0;
 }
 
+void master_service_config_socket_try_open(struct master_service *service)
+{
+	struct master_service_settings_input input;
+	const char *path, *error;
+	int fd;
+
+	if (getenv("DOVECONF_ENV") != NULL ||
+	    (service->flags & MASTER_SERVICE_FLAG_NO_CONFIG_SETTINGS) != 0)
+		return;
+
+	memset(&input, 0, sizeof(input));
+	input.never_exec = TRUE;
+	fd = master_service_open_config(service, &input, &path, &error);
+	if (fd != -1)
+		service->config_fd = fd;
+}
+
 int master_service_settings_read(struct master_service *service,
 				 const struct master_service_settings_input *input,
 				 struct master_service_settings_output *output_r,
diff -r 43488e1044c9 -r eb63eca74471 src/lib-master/master-service-settings.h
--- a/src/lib-master/master-service-settings.h	Thu Aug 01 13:31:25 2013 +0300
+++ b/src/lib-master/master-service-settings.h	Thu Aug 01 13:42:51 2013 +0300
@@ -56,6 +56,9 @@
 
 extern const struct setting_parser_info master_service_setting_parser_info;
 
+/* Try to open the config socket if it's going to be needed later by
+   master_service_settings_read*() */
+void master_service_config_socket_try_open(struct master_service *service);
 int master_service_settings_read(struct master_service *service,
 				 const struct master_service_settings_input *input,
 				 struct master_service_settings_output *output_r,
diff -r 43488e1044c9 -r eb63eca74471 src/lib-master/master-service.c
--- a/src/lib-master/master-service.c	Thu Aug 01 13:31:25 2013 +0300
+++ b/src/lib-master/master-service.c	Thu Aug 01 13:42:51 2013 +0300
@@ -236,6 +236,12 @@
 		master_service_set_client_limit(service, 1);
 		master_service_set_service_count(service, 1);
 	}
+	if ((flags & MASTER_SERVICE_FLAG_KEEP_CONFIG_OPEN) != 0) {
+		/* since we're going to keep the config socket open anyway,
+		   open it now so we can read settings even after privileges
+		   are dropped. */
+		master_service_config_socket_try_open(service);
+	}
 
 	master_service_verify_version_string(service);
 	return service;
diff -r 43488e1044c9 -r eb63eca74471 src/lib-master/master-service.h
--- a/src/lib-master/master-service.h	Thu Aug 01 13:31:25 2013 +0300
+++ b/src/lib-master/master-service.h	Thu Aug 01 13:42:51 2013 +0300
@@ -15,7 +15,8 @@
 	   _FLAG_STANDALONE is set, logging is done to stderr. */
 	MASTER_SERVICE_FLAG_DONT_LOG_TO_STDERR	= 0x04,
 	/* Service is going to do multiple configuration lookups,
-	   keep the connection to config service open. */
+	   keep the connection to config service open. Also opens the config
+	   socket before dropping privileges. */
 	MASTER_SERVICE_FLAG_KEEP_CONFIG_OPEN	= 0x08,
 	/* Don't read settings, but use whatever is in environment */
 	MASTER_SERVICE_FLAG_NO_CONFIG_SETTINGS	= 0x10,


More information about the dovecot-cvs mailing list