From: Timo Sirainen Date: Thu, 23 Sep 2010 18:25:22 +0000 (+0100) Subject: Fail at startup if process_limit>1 for services that don't support it. X-Git-Tag: 2.0.4~15 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=35fcdde46a71ac151c2518d48c841019f1181bb2;p=thirdparty%2Fdovecot%2Fcore.git Fail at startup if process_limit>1 for services that don't support it. --- diff --git a/src/anvil/anvil-settings.c b/src/anvil/anvil-settings.c index 04e2d96937..dd3e25d6f3 100644 --- a/src/anvil/anvil-settings.c +++ b/src/anvil/anvil-settings.c @@ -44,5 +44,7 @@ struct service_settings anvil_service_settings = { .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 --git a/src/auth/auth-settings.c b/src/auth/auth-settings.c index 9be4257392..76ab76d7de 100644 --- a/src/auth/auth-settings.c +++ b/src/auth/auth-settings.c @@ -57,7 +57,9 @@ struct service_settings auth_service_settings = { .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 }; /* */ diff --git a/src/director/director-settings.c b/src/director/director-settings.c index fd8fca9453..de5ab05094 100644 --- a/src/director/director-settings.c +++ b/src/director/director-settings.c @@ -55,7 +55,9 @@ struct service_settings director_service_settings = { 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 --git a/src/lib-master/service-settings.h b/src/lib-master/service-settings.h index e1c9c4e408..2dcdc7dbb6 100644 --- a/src/lib-master/service-settings.h +++ b/src/lib-master/service-settings.h @@ -63,6 +63,11 @@ struct service_settings { 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 --git a/src/log/log-settings.c b/src/log/log-settings.c index 3ddb25e510..c88846b9a7 100644 --- a/src/log/log-settings.c +++ b/src/log/log-settings.c @@ -28,6 +28,8 @@ struct service_settings log_service_settings = { .unix_listeners = ARRAY_INIT, .fifo_listeners = ARRAY_INIT, - .inet_listeners = ARRAY_INIT + .inet_listeners = ARRAY_INIT, + + .process_limit_1 = TRUE }; diff --git a/src/master/master-settings.c b/src/master/master-settings.c index 6a6511b997..337b28f676 100644 --- a/src/master/master-settings.c +++ b/src/master/master-settings.c @@ -354,10 +354,28 @@ services_have_protocol(struct master_settings *set, const char *name) 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 @@ master_settings_verify(void *_set, pool_t pool, const char **error_r) 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 :