]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
master: Convert listen setting from string to boollist
authorMarkus Valentin <markus.valentin@open-xchange.com>
Tue, 2 Jan 2024 14:54:13 +0000 (15:54 +0100)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Wed, 12 Feb 2025 10:34:12 +0000 (12:34 +0200)
src/lib-master/service-settings.h
src/master/master-settings.c
src/master/master-settings.h
src/master/service.c

index 8b5baed8b94243f4ce1f881b92906e26306dcf83..3570ca99fc3ffa2dbab26d55659a5d22e757ee9a 100644 (file)
@@ -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;
index eacfbf6cbf4d914277658d3e92b273506900b990..d7d24c7f372c5ca308f25f563d56098b5245c05c 100644 (file)
@@ -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);
index 3d2ef9d8ab8b516875772da2614350baec6d0fae..a76c1db6eef9816d8372ad964112fd182d989981 100644 (file)
@@ -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;
index ab3ee7fc4ea6b98a62a2cbd2a57b17abb75101ee..99356a8ad2a299039a67e4164657f544e8ff02f6 100644 (file)
@@ -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;