]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
Fail at startup if process_limit>1 for services that don't support it.
authorTimo Sirainen <tss@iki.fi>
Thu, 23 Sep 2010 18:25:22 +0000 (19:25 +0100)
committerTimo Sirainen <tss@iki.fi>
Thu, 23 Sep 2010 18:25:22 +0000 (19:25 +0100)
src/anvil/anvil-settings.c
src/auth/auth-settings.c
src/director/director-settings.c
src/lib-master/service-settings.h
src/log/log-settings.c
src/master/master-settings.c

index 04e2d9693781a0d851d1da960d483ff753bb7770..dd3e25d6f345e14d7d0577f8592de831cebd729e 100644 (file)
@@ -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
 };
index 9be4257392ad728c09d02d258d88230cbf5ced04..76ab76d7de4be73b9e749ef5bf17ccea915378e7 100644 (file)
@@ -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
 };
 
 /* <settings checks> */
index fd8fca94536a764e304346ca94eab5a8d6acca14..de5ab0509406e57d8ee6d621dd680b0b89c33425 100644 (file)
@@ -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) \
index e1c9c4e4087bfbbbbc4b11e5e485c5ace6749d90..2dcdc7dbb664efa8e3da2356c3e79edc5b7a08b7 100644 (file)
@@ -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 *);
 
index 3ddb25e510277c9fddee795b3c9db7f631f53b2c..c88846b9a713d3dfeaaed61e3752f3c25e529487 100644 (file)
@@ -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
 };
 
index 6a6511b99722747c65eb1257aed03e95bae030d6..337b28f6766f7d70349f649f6ae0b862b717ad74 100644 (file)
@@ -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 :