.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
};
.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> */
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) \
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 *);
.unix_listeners = ARRAY_INIT,
.fifo_listeners = ARRAY_INIT,
- .inet_listeners = ARRAY_INIT
+ .inet_listeners = ARRAY_INIT,
+
+ .process_limit_1 = TRUE
};
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;
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 :