dovecot-2.0: Fail at startup if process_limit>1 for services tha...

dovecot at dovecot.org dovecot at dovecot.org
Thu Sep 23 21:25:25 EEST 2010


details:   http://hg.dovecot.org/dovecot-2.0/rev/ce75971127a2
changeset: 12166:ce75971127a2
user:      Timo Sirainen <tss at iki.fi>
date:      Thu Sep 23 19:25:22 2010 +0100
description:
Fail at startup if process_limit>1 for services that don't support it.

diffstat:

 src/anvil/anvil-settings.c        |   4 +++-
 src/auth/auth-settings.c          |   4 +++-
 src/director/director-settings.c  |   4 +++-
 src/lib-master/service-settings.h |   5 +++++
 src/log/log-settings.c            |   4 +++-
 src/master/master-settings.c      |  29 +++++++++++++++++++++++++++++
 6 files changed, 46 insertions(+), 4 deletions(-)

diffs (118 lines):

diff -r acd30d4601f9 -r ce75971127a2 src/anvil/anvil-settings.c
--- a/src/anvil/anvil-settings.c	Thu Sep 23 19:00:31 2010 +0100
+++ b/src/anvil/anvil-settings.c	Thu Sep 23 19:25:22 2010 +0100
@@ -44,5 +44,7 @@
 	.unix_listeners = { { &anvil_unix_listeners_buf,
 			      sizeof(anvil_unix_listeners[0]) } },
 	.fifo_listeners = ARRAY_INIT,
-	.inet_listeners = ARRAY_INIT
+	.inet_listeners = ARRAY_INIT,
+
+	.process_limit_1 = TRUE
 };
diff -r acd30d4601f9 -r ce75971127a2 src/auth/auth-settings.c
--- a/src/auth/auth-settings.c	Thu Sep 23 19:00:31 2010 +0100
+++ b/src/auth/auth-settings.c	Thu Sep 23 19:25:22 2010 +0100
@@ -57,7 +57,9 @@
 	.unix_listeners = { { &auth_unix_listeners_buf,
 			      sizeof(auth_unix_listeners[0]) } },
 	.fifo_listeners = ARRAY_INIT,
-	.inet_listeners = ARRAY_INIT
+	.inet_listeners = ARRAY_INIT,
+
+	.process_limit_1 = TRUE
 };
 
 /* <settings checks> */
diff -r acd30d4601f9 -r ce75971127a2 src/director/director-settings.c
--- a/src/director/director-settings.c	Thu Sep 23 19:00:31 2010 +0100
+++ b/src/director/director-settings.c	Thu Sep 23 19:25:22 2010 +0100
@@ -55,7 +55,9 @@
 			      sizeof(director_unix_listeners[0]) } },
 	.fifo_listeners = { { &director_fifo_listeners_buf,
 			      sizeof(director_fifo_listeners[0]) } },
-	.inet_listeners = ARRAY_INIT
+	.inet_listeners = ARRAY_INIT,
+
+	.process_limit_1 = TRUE
 };
 #undef DEF
 #define DEF(type, name) \
diff -r acd30d4601f9 -r ce75971127a2 src/lib-master/service-settings.h
--- a/src/lib-master/service-settings.h	Thu Sep 23 19:00:31 2010 +0100
+++ b/src/lib-master/service-settings.h	Thu Sep 23 19:25:22 2010 +0100
@@ -63,6 +63,11 @@
 	enum service_type parsed_type;
 	enum service_user_default user_default;
 	unsigned int login_dump_core:1;
+
+	/* -- flags that can be set internally -- */
+
+	/* process_limit must not be higher than 1 */
+	unsigned int process_limit_1:1;
 };
 ARRAY_DEFINE_TYPE(service_settings, struct service_settings *);
 
diff -r acd30d4601f9 -r ce75971127a2 src/log/log-settings.c
--- a/src/log/log-settings.c	Thu Sep 23 19:00:31 2010 +0100
+++ b/src/log/log-settings.c	Thu Sep 23 19:25:22 2010 +0100
@@ -28,6 +28,8 @@
 
 	.unix_listeners = ARRAY_INIT,
 	.fifo_listeners = ARRAY_INIT,
-	.inet_listeners = ARRAY_INIT
+	.inet_listeners = ARRAY_INIT,
+
+	.process_limit_1 = TRUE
 };
 
diff -r acd30d4601f9 -r ce75971127a2 src/master/master-settings.c
--- a/src/master/master-settings.c	Thu Sep 23 19:00:31 2010 +0100
+++ b/src/master/master-settings.c	Thu Sep 23 19:25:22 2010 +0100
@@ -354,10 +354,28 @@
 	return FALSE;
 }
 
+#ifdef CONFIG_BINARY
+static const struct service_settings *
+master_default_settings_get_service(const char *name)
+{
+	extern struct master_settings master_default_settings;
+	struct service_settings *const *setp;
+
+	array_foreach(&master_default_settings.services, setp) {
+		if (strcmp((*setp)->name, name) == 0)
+			return *setp;
+	}
+	return NULL;
+}
+#endif
+
 static bool
 master_settings_verify(void *_set, pool_t pool, const char **error_r)
 {
 	static int warned_auth = FALSE;
+#ifdef CONFIG_BINARY
+	const struct service_settings *default_service;
+#endif
 	struct master_settings *set = _set;
 	struct service_settings *const *services;
 	const char *const *strings;
@@ -466,6 +484,17 @@
 			return FALSE;
 		}
 
+#ifdef CONFIG_BINARY
+		default_service =
+			master_default_settings_get_service(service->name);
+		if (default_service != NULL &&
+		    default_service->process_limit_1 && process_limit > 1) {
+			*error_r = t_strdup_printf("service(%s): "
+				"process_limit must be 1", service->name);
+			return FALSE;
+		}
+#endif
+
 		if (strcmp(service->name, "auth") == 0) {
 			auth_client_limit = service->client_limit != 0 ?
 				service->client_limit :


More information about the dovecot-cvs mailing list