]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
master: Don't recreate master UNIX listener socket on reload
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Mon, 18 Jun 2018 19:44:53 +0000 (22:44 +0300)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Mon, 18 Jun 2018 20:02:03 +0000 (20:02 +0000)
This way it works similar to all other listeners and it's not even
temporarily unavailable.

src/master/service-listen.c
src/master/service-monitor.c
src/master/service.c

index b96c5dc681ca181df2f9f3d521b323b03a1293c3..0d81146119dbd7456aa6b52e1b50c6c1880f9c5c 100644 (file)
@@ -335,6 +335,9 @@ static int services_listen_master(struct service_list *service_list)
        const char *path;
        mode_t old_umask;
 
+       if (service_list->master_fd != -1)
+               return 1;
+
        path = t_strdup_printf("%s/master", service_list->set->base_dir);
        old_umask = umask(0600 ^ 0777);
        service_list->master_fd = net_listen_unix(path, 16);
@@ -412,6 +415,10 @@ int services_listen_using(struct service_list *new_service_list,
        struct service_listener *const *new_listeners, *const *old_listeners;
        unsigned int i, j, count, new_count, old_count;
 
+       /* copy master listener */
+       new_service_list->master_fd = old_service_list->master_fd;
+       old_service_list->master_fd = -1;
+
        /* rescue anvil's UNIX socket listener */
        new_service = service_lookup_type(new_service_list, SERVICE_TYPE_ANVIL);
        old_service = service_lookup_type(old_service_list, SERVICE_TYPE_ANVIL);
index fbafcd0673d09e3a4adea3fb7476238ad42a3e79..7f1f2451a35f3a7279f4484aad53ee386aa536e2 100644 (file)
@@ -646,7 +646,6 @@ void services_monitor_stop(struct service_list *service_list, bool wait)
                services_monitor_wait_and_kill(service_list);
 
        io_remove(&service_list->io_master);
-       i_close_fd(&service_list->master_fd);
 
        array_foreach(&service_list->services, services)
                service_monitor_stop(*services);
index af4b322f1e78cb983a81841870b7924acf5767ff..6f0e15b3d42b3f99956732129f1c78b52bf9d8da 100644 (file)
@@ -666,6 +666,8 @@ void service_list_unref(struct service_list *service_list)
                array_foreach(&(*servicep)->listeners, listenerp)
                        i_close_fd(&(*listenerp)->fd);
        }
+       i_close_fd(&service_list->master_fd);
+
        timeout_remove(&service_list->to_kill);
        pool_unref(&service_list->set_pool);
        pool_unref(&service_list->pool);