From: Markus Valentin Date: Tue, 2 Jan 2024 14:54:13 +0000 (+0100) Subject: master: Convert listen setting from string to boollist X-Git-Tag: 2.4.1~1033 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d4ede11d2668b9db48c6462c3f2376865fca71d5;p=thirdparty%2Fdovecot%2Fcore.git master: Convert listen setting from string to boollist --- diff --git a/src/lib-master/service-settings.h b/src/lib-master/service-settings.h index 8b5baed8b9..3570ca99fc 100644 --- a/src/lib-master/service-settings.h +++ b/src/lib-master/service-settings.h @@ -46,7 +46,7 @@ struct inet_listener_settings { const char *type; in_port_t port; /* copied from master_settings: */ - const char *listen; + ARRAY_TYPE(const_string) listen; bool ssl; bool reuse_port; bool haproxy; diff --git a/src/master/master-settings.c b/src/master/master-settings.c index eacfbf6cbf..d7d24c7f37 100644 --- a/src/master/master-settings.c +++ b/src/master/master-settings.c @@ -191,7 +191,7 @@ static const struct setting_define master_setting_defines[] = { DEF(STR_HIDDEN, libexec_dir), DEF(STR, instance_name), DEF(BOOLLIST, protocols), - DEF(STR_NOVARS, listen), /* NOVARS to avoid expanding %scope */ + DEF(BOOLLIST, listen), DEF(ENUM, ssl), DEF(STR, default_internal_user), DEF(STR, default_internal_group), @@ -216,7 +216,6 @@ static const struct master_settings master_default_settings = { .state_dir = PKG_STATEDIR, .libexec_dir = PKG_LIBEXECDIR, .instance_name = PACKAGE, - .listen = "*, ::", .ssl = "yes:no:required", .default_internal_user = "dovecot", .default_internal_group = "dovecot", @@ -233,6 +232,7 @@ static const struct master_settings master_default_settings = { }; static const struct setting_keyvalue master_default_settings_keyvalue[] = { { "protocols", "imap pop3 lmtp" }, + { "listen", "* ::" }, { NULL, NULL } }; @@ -318,14 +318,17 @@ static void add_inet_listeners(ARRAY_TYPE(inet_listener_settings) *l, { struct inet_listener_settings *set; const char *str; + const char *address; if (!array_is_created(l)) return; array_foreach_elem(l, set) { if (set->port != 0) { - str = t_strdup_printf("%u:%s", set->port, set->listen); - array_push_back(all_listeners, &str); + array_foreach_elem(&set->listen, address) { + str = t_strdup_printf("%u:%s", set->port, address); + array_push_back(all_listeners, &str); + } } } } @@ -494,9 +497,16 @@ master_service_get_inet_listeners(struct service_settings *service_set, struct inet_listener_settings *listener_set_dup = p_memdup(pool, listener_set, sizeof(*listener_set)); + unsigned int listeners = array_count(&master_set->listen); + p_array_init(&listener_set_dup->listen, pool, listeners); pool_add_external_ref(pool, listener_set->pool); - listener_set_dup->listen = p_strdup(pool, master_set->listen); + const char *address; + array_foreach_elem(&master_set->listen, address) { + const char **address_copy = + array_append_space(&listener_set_dup->listen); + *address_copy = p_strdup(listener_set_dup->pool, address); + } settings_free(master_set); array_push_back(&service_set->parsed_inet_listeners, @@ -575,10 +585,6 @@ master_settings_ext_check(struct event *event, void *_set, unsigned int max_client_limit = 0; #endif - if (*set->listen == '\0') { - *error_r = "listen can't be set empty"; - return FALSE; - } len = strlen(set->base_dir); if (len > 0 && set->base_dir[len-1] == '/') { @@ -619,6 +625,10 @@ master_settings_ext_check(struct event *event, void *_set, return FALSE; #endif } + if (array_is_empty(&set->listen)) { + *error_r = "listen can't be set empty"; + return FALSE; + } if (!master_settings_get_services(set, pool, event, error_r)) return FALSE; services = array_get(&set->parsed_services, &count); diff --git a/src/master/master-settings.h b/src/master/master-settings.h index 3d2ef9d8ab..a76c1db6ee 100644 --- a/src/master/master-settings.h +++ b/src/master/master-settings.h @@ -10,7 +10,7 @@ struct master_settings { const char *libexec_dir; const char *instance_name; ARRAY_TYPE(const_string) protocols; - const char *listen; + ARRAY_TYPE(const_string) listen; const char *ssl; const char *default_internal_user; const char *default_internal_group; diff --git a/src/master/service.c b/src/master/service.c index ab3ee7fc4e..99356a8ad2 100644 --- a/src/master/service.c +++ b/src/master/service.c @@ -130,7 +130,8 @@ service_create_inet_listeners(struct service *service, const char **error_r) { static struct service_listener *l; - const char *const *tmp, *addresses; + const char *address; + ARRAY_TYPE(const_string) addresses; const struct ip_addr *ips; unsigned int i, ips_count; bool ssl_disabled = strcmp(service->list->set->ssl, "no") == 0; @@ -140,17 +141,14 @@ service_create_inet_listeners(struct service *service, return 0; } - if (*set->listen != '\0') + if (!array_is_empty(&set->listen)) addresses = set->listen; else { /* use the default listen address */ addresses = service->list->set->listen; } - tmp = t_strsplit_spaces(addresses, ", "); - for (; *tmp != NULL; tmp++) { - const char *address = *tmp; - + array_foreach_elem(&addresses, address) { if (set->ssl && ssl_disabled) continue;